Информация о классе QObject отсутствует в символах отладки (редактируйте, но присутствуют другие классы Qt) - PullRequest
0 голосов
/ 28 января 2020

Я строю проект 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?

1 Ответ

0 голосов
/ 28 января 2020

библиотеки Qt не поставляются с символами отладки

библиотеки Qt являются встроенным выпуском и не имеют символов отладки. При сборке приложения в Debug только отладочный код имеет символы отладки, но вы все равно ссылаетесь на те же библиотеки Qt. Это означает, что вам нужно собрать библиотеки Qt с символами отладки!

Сборка Qt из исходного кода занимает некоторое время, но позволит вам отлаживать или вводить код Qt (и QObject). Обратите внимание, что мета-объектный код moc ed из ваших классов (из moc_<yourclass>.cpp файлов) может быть отлажен без необходимости отладочной версии Qt, потому что это скомпилировано как часть вашего приложения.

При сборке Qt Вы можете добавить флаг -force-debug-info при вызове команды configure для добавления символов отладки. Если вы используете Qt Creator, вам нужно будет добавить эту новую версию Qt в Qt Creator и создать для нее новый комплект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...