Я строю проект Qt с использованием g ++ и отлаживаю с помощью 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, которые объявлены в заголовках publi c, например 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, distro (пробовал в Arch, Ubuntu и minGW-w64) или включена ли симпатичная печать.
Мне было трудно найти какую-либо информацию о функциях GDB для изучения классов (что имеет смысл: зачем вам использовать отладчик для проверки кода stati c), но так как это мешает мне вызывать методы, это большое неудобство. Ничто из того, что я нашел, не указывает на причину, по которой только некоторые классы будут исключены из символов отладки, или что может быть в этом свойственно Qt.
Редактировать: я ошибочно полагал, что я ссылаюсь на версию Qt у него были символы отладки, когда я все еще использовал сборку релиза. Теперь отладчик распознает QObject
, но мне все еще остается вопрос, почему QObject отличается в этом отношении от других классов Qt, таких как QString
и QVariant
?