【发布时间】: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 和其他类之间的具体区别(我很确定它们没有虚函数),以及与链接有关