![]() |
Главная · Все классы · Основные классы · Классы по группам · Модули · Функции | ![]() |
Здесь представлены несколько полезных советов чтобы помочь вам с отладкой вашего программного обеспечения основанного на Qt.
При конфигурировании Qt для установки, возможно чтобы обеспечить, что она собрана чтобы включить отладочные символы, которые могут сделать это лёгким для отслеживания ошибок в приложениях и библиотеках. Однако, на некоторых платформах, сборка Qt в отладочном режиме заставляет приложения быть больше, чем желательно.
Величина пространства, занятого отладочными символами сгенерированными GCC, может быть чересчур велико. Тем не менее, с релиза Xcode 2.3 теперь возможно использовать символы Dwarf, которые занимают значительно меньшее пространство. Чтобы включить эту возможность при конфигурировании Qt, передайте опцию -dwarf-2 в конфигурационный скрипт.
Она не включена по умолчанию, поскольку предыдущие версии Xcode не будут работать с флагом компилятора, используемым для реализации этой возможности. Mac OS X 10.5 использует символы dwarf-2 по умолчанию.
Символы dwarf-2 содержат ссылки на исходный код, поэтому размер целевого отладочного приложения хорошо согласуется с размером сборки релиза.
Когда вы запускаете приложение Qt, вы можете задать несколько опций командной строки, которые могут помочь при отладке. Распознаваемые QApplication опции командной строки.
Опция | Описание |
---|---|
-nograb | Приложение никогда не будет захватывать мышь или клавиатуру. Эта опция установлена по умолчанию при запуске программы в отладчике gdb под Linux. |
-dograb | Игнорирует любую неявную или явную опцию -nograb. -dograb выигрывает у -nograb даже когда -nograb является последней в командной строке. |
-sync | Запускает приложение в синхронном режиме X. Синхронный режим заставляет X-сервер выполнять каждый запрос X-клиента незамедлительно и не использовать оптимизацию буфера. Это делает программу удобной для отладки и часто более медленной. Опция -sync правильна только для X11 версии Qt. |
Qt включает четыре глобальные функции для записи предупреждающих и отладочного текста. Вы можете использовать их для следующих целей:
Если вы включите заголовочный файл <QtDebug>, функция qDebug() может также использоваться в качестве потока вывода. Например:
qDebug() << "Widget" << widget << "at position" << widget->pos();
The Qt implementation of these functions prints the text to the stderr output under Unix/X11 and Mac OS X. With Windows, if it is a console application, the text is sent to console; otherwise, it is sent to the debugger. Вы можете принять эти функции установив обработчик сообещний используя qInstallMsgHandler().
Если переменная окружения QT_FATAL_WARNINGS установлена, qWarning() завершит работу после распечатки предупреждающего сообщения. Это облегчает получение обратной трассировки в отладчике.
И qDebug() и qWarning() являются инструментами отладки. Их можно скомпилировать определив QT_NO_DEBUG_OUTPUT и QT_NO_WARNING_OUTPUT во время компиляции.
Отладочные функции QObject::dumpObjectTree() и QObject::dumpObjectInfo() часто используется когда приложение выглядит или работает странно. Более полезно, если вы используете именами объектов, чем не используете, но часто полезно даже без имён.
Вы можете реализовать потоковый оператор используемый qDebug() чтобы предоставить поддержку отладки для ваших классов. Класс, который реализует поток, - QDebug. Функции, о которых вам нужно знать в QDebug, это space() и nospace(). Обе они возвращают поток отладки; разница между ними заключается в том вставляется ли пробел между элементами. Вот пример для класса, который представляет 2D координаты.
QDebug operator<<(QDebug dbg, const Coordinate &c) { dbg.nospace() << "(" << c.x() << ", " << c.y() << ")"; return dbg.space(); }
Заголовочный файл <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]); // WRONG
return ptr;
}
Если этот код скомпилирован с определённым макросом QT_NO_DEBUG, код в выражении Q_CHECK_PTR() не выполняется и alloc возвращает неинициализированный указатель.
Библиотека Qt содержит сотни внутренних проверок, которые печатают предупреждающие сообщения при обнаружении программной ошибки. Поэтому мы рекомендуем чтобы вы использовали отладочную версию Qt при разработке программного обеспечения, основанного на Qt.
Имеется одна ошибка, которая является такой распространённой, что она заслуживает упоминания здесь: если вы включите макрос Q_OBJECT в декларацию класса и запустите мета-объектный компилятор (moc), но забудете прилинковать сгенерированный moc объектный код в ваш исполняемый файл, вы получите очень запутанные сообщения об ошибках. Любая ошибка линковки жалуется на отсутствие vtbl, _vtbl, __vtbl или похожее возможно является результатом этой проблемы.
Copyright © 2008 Trolltech | Торговые марки | Qt 4.3.5 |