【问题标题】:QObject class info absent from debug symbols (edit but other Qt classes are present)调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
【发布时间】:2020-05-13 10:47:59
【问题描述】:

我正在使用 g++ 构建一个 Qt 项目并使用 gdb 进行调试。最近,我注意到关于QObject 的类信息以及从它派生的所有Qt 类型,似乎都没有出现在我的调试符号中。例如,gdb 命令ptype QObject 导致No symbol "QObject" in current context. 同样,我不能调用方法、检查实例的d_ptr,或者在调试器中向下转换指向QObject* 的派生指针。 info types 没有列出来自 qobject.h 的任何内容。

对于在我自己的代码中定义的QObject 的派生类,我可以看到我自己的成员就好了,但是在列出基类的地方,它只是说<QObject> = {<No data fields>}

在公共标头中声明的其他 Qt 类,例如 QString,存在于调试符号中。我看不出任何关于 QObject 的声明会使其与众不同。

我有一个极简主义项目,我一直在用它来检查这个问题:

//main.cpp
#include <iostream>
#include <QObject>

int main()
{
    QObject* spiff = new QObject();

    spiff->setObjectName("Foo");
    std::cout << qPrintable(spiff->objectName()) << std::endl;

    return 0;
}
#project.pro
QT -= gui
CONFIG += debug
SOURCES += main.cpp 

我觉得这里没有什么奇怪的地方。没有构建错误,并且代码按预期执行。

这似乎不受调试级别或优化标志、任何调试符号格式的影响,无论我使用 g++ 与 clang++ 还是 gdb 与 lldb、发行版(在 Arch、Ubuntu 和 minGW-w64 上尝试过),或者是否漂亮-打印已启用。

我很难找到任何关于 gdb 用于检查类的功能的信息(这是有道理的:你为什么要使用调试器来检查静态代码),但由于这会阻止我调用方法,这是一个很大的不便。我没有发现任何东西似乎表明只有某些类会从调试符号中省略,或者 Qt 可能对此有什么特殊之处。

编辑:当我实际上仍在使用发布版本时,我错误地认为我正在链接具有调试符号的 Qt 版本。现在,调试器确实识别了QObject,但我仍然想知道为什么QObject 在这方面与QString 和QVariant 等其他Qt 类不同?

【问题讨论】:

  • 我突然想到这可能与 vtable 有关。不确定具体是什么,但这将是 QObject 和其他类之间的具体区别(我很确定它们没有虚函数),以及与链接有关

标签: c++ qt gdb


【解决方案1】:

Qt 库不附带调试符号

Qt 库是内置版本,没有调试符号。在 Debug 中构建应用程序时,只有应用程序的代码具有调试符号,但您仍然链接到相同的 Qt 库。这意味着您需要使用 Debug 符号构建 Qt 库!

从源代码构建 Qt 需要一些时间,但可以让您调试或单步执行 Qt(和 QObject)代码。请注意,您的类(来自 moc_&lt;yourclass&gt;.cpp 文件)中的元对象代码 moced 可以在不需要 Qt 的调试版本的情况下进行调试,因为它是作为应用程序的一部分编译的。

在构建 Qt 时,您可以在调用 configure 命令添加调试符号时添加 -force-debug-info 标志。如果使用 Qt Creator,则必须在 Qt Creator 中添加这个新版本的 Qt,并为其创建一个新工具包。

【讨论】:

  • 我为我之前评论的粗鲁语气道歉。我之前犯了一个错误,实际上并没有使用调试符号链接到库。解决了这个问题,QObject 现在就像我预期的那样存在。但这对我来说没有意义,因为我应该期望头文件中的类定义不需要来自链接库的调试符号——而其他 Qt 类不会表现出相同的行为。
  • 哦刚刚意识到我错过了阅读您的问题,我以为您出于某种原因试图介入 Qt 代码。我同意您应该能够从 Qt 类访问公共数据。 Qt 类虽然使用 d_ptr 来保留 ABI,但我不希望它可以从 gdb 中检查,尽管我想我记得从常规 Qt 构建中查看它的内容... QObject 是 Qt Core lib 的一部分,但也是字符串。 gdb 是否可能对其上下文中存在(或缺少)moc_ 文件感到困惑?
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 2014-02-02
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多