Оглавление
Техники отладкиЗдесь представлены несколько полезных советов чтобы помочь вам с отладкой вашего программного обеспечения основанного на Qt. Конфигурирование Qt для отладкиПри конфигурировании Qt для установки, возможно чтобы обеспечить, что она собрана чтобы включить отладочные символы, которые могут сделать это лёгким для отслеживания ошибок в приложениях и библиотеках. Однако, на некоторых платформах, сборка Qt в отладочном режиме заставляет приложения быть больше, чем желательно. Отладка в Mac OS X и XcodeОтладка с/без каркасовБазовые материалы об отладочных библиотеках и каркасах, которые вам необходимо знать, находятся на сайте developer.apple.com в: Apple Technical Note TN2124. Когда вы собираете Qt, каркасы собираются по умолчанию, и внутри каркаса вы найдёте обе версии, отладки и релиза (например, QtCore и QtCore_debug). Если при сборке Qt вы передадите флаг -no-framework, то для каждой библиотеки Qt будут собраны две динамических библиотеки (например, libQtCore.4.dylib и libQtCore_debug.4.dylib). Что произойдёт при линковке в зависимости от того, используются или нет каркасы. Мы не видим неопровержимого довода, чтобы рекомендовать какой-либо из них. С каркасами:Поскольку библиотеки релиза и отладки находятся внутри каркаса, приложение просто линкуется вместе с каркасом. И когда вы запустите его в отладчике, вы получите либо отладочную версию либо версию релиза, в зависимости установили ли вы DYLD_IMAGE_SUFFIX. Если вы не установили её, вы получите версию релиза по умолчанию (т.е., без суффикса _debug). Если вы установили DYLD_IMAGE_SUFFIX=_debug, вы получите отладочную версию. Без каркасов:Когда вы сообщаете qmake генерировать Make-файл с отладочной конфигурацией, оно линкует вместе с _debug версией библиотек и генерирует отладочные символы для приложения. Эта программа, запущенная в GDB, будет работать аналогично работе GDB на других платформах, и вы сможете вести трассировку внутри Qt. Отладочные символы и размерВеличина пространства, занятого отладочными символами сгенерированными GCC, может быть чересчур велико. Тем не менее, с релиза Xcode 2.3 теперь возможно использовать символы Dwarf, которые занимают значительно меньшее пространство. Чтобы включить эту возможность при конфигурировании Qt, передайте опцию -dwarf-2 в конфигурационный скрипт. Она не включена по умолчанию, поскольку предыдущие версии Xcode не будут работать с флагом компилятора, используемым для реализации этой возможности. Mac OS X 10.5 использует символы dwarf-2 по умолчанию. Символы dwarf-2 содержат ссылки на исходный код, поэтому размер целевого отладочного приложения хорошо согласуется с размером сборки релиза. Опции командной строки, распознаваемые QtКогда вы запускаете приложение Qt, вы можете задать несколько опций командной строки, которые могут помочь при отладке. Распознаваемые QApplication опции командной строки.
Предупреждающие и отладочные сообщенияQt включает четыре глобальные функции для записи предупреждающих и отладочного текста. Вы можете использовать их для следующих целей:
Если вы включите заголовочный файл <QtDebug>, функция qDebug() может также использоваться в качестве потока вывода. Например: qDebug() << "Widget" << widget << "at position" << widget->pos(); Вы можете принять эти функции установив обработчик сообщений, используя qInstallMsgHandler(). Если переменная окружения QT_FATAL_WARNINGS установлена, qWarning() завершит работу после вывода предупреждающего сообщения. Это облегчает получение обратной трассировки в отладчике. И qDebug(), и qWarning() являются инструментами отладки. Их можно скомпилировать, определив QT_NO_DEBUG_OUTPUT и QT_NO_WARNING_OUTPUT во время компиляции. Отладочные функции QObject::dumpObjectTree() и QObject::dumpObjectInfo() часто используется когда приложение выглядит или работает странно. Более полезно, если вы используете именами объектов, чем не используете, но часто полезно даже без имён. Предоставление поддержки потокового оператора qDebug()Вы можете реализовать потоковый оператор, используемый qDebug(), чтобы предоставить поддержку отладки для ваших классов. Класс, который реализует поток, - QDebug. Функции, о которых вам нужно знать в QDebug, это space() и nospace(). Обе они возвращают поток отладки; разница между ними заключается в том вставляется ли пробел между элементами. Вот пример для класса, который представляет 2D координаты. QDebug operator<<(QDebug dbg, const Coordinate &c) { dbg.nospace() << "(" << c.x() << ", " << c.y() << ")"; return dbg.space(); } Интеграция пользовательских типов с мета-объектной системой Qt раскрывается более подробно в документе Создание пользовательских типов Qt. Отладка макросовЗаголовочный файл <QtGlobal> содержит несколько отладочных макросов и директив #define. Имеется три важных макроса:
Эти макросы используются для обнаружения ошибок программы, например, так: char *alloc(int size) { Q_ASSERT(size > 0); char *ptr = new char[size]; Q_CHECK_PTR(ptr); return ptr; } Q_ASSERT(), Q_ASSERT_X() и Q_CHECK_PTR() расширяет в ничего, если QT_NO_DEBUG определён во время компиляции. По этой причине, аргументы для этих макросов не имеют каких-либо побочных явлений. Вот неправильное использование Q_CHECK_PTR(): char *alloc(int size) { char *ptr; Q_CHECK_PTR(ptr = new char[size]); // НЕПРАВИЛЬНО return ptr; } Если этот код скомпилирован с определённым макросом QT_NO_DEBUG, код в выражении Q_CHECK_PTR() не выполняется и alloc возвращает неинициализированный указатель. Библиотека Qt содержит сотни внутренних проверок, которые печатают предупреждающие сообщения при обнаружении программной ошибки. Поэтому мы рекомендуем чтобы вы использовали отладочную версию Qt при разработке программного обеспечения, основанного на Qt. Распространённые ошибкиИмеется одна ошибка, которая является такой распространённой, что она заслуживает упоминания здесь: если вы включите макрос Q_OBJECT в декларацию класса и запустите мета-объектный компилятор (moc), но забудете прилинковать сгенерированный moc объектный код в ваш исполняемый файл, вы получите очень запутанные сообщения об ошибках. Любая ошибка линковки жалуется на отсутствие vtbl, _vtbl, __vtbl или похожее возможно является результатом этой проблемы. |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |