Техники отладки
|
Опция | Описание |
---|---|
-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();
Реализация этих функций в Qt печатает текст в вывод stderr под Unix/X11 и Mac OS X. В Windows, если это консольное приложение, текст отправляется в консоль; в противном случае, он отправляется отладчику. Вы можете принять эти функции установив обработчик сообещний используя 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]); // НЕПРАВИЛЬНО return ptr; }
Если этот код скомпилирован с определённым макросом QT_NO_DEBUG, код в выражении Q_CHECK_PTR() не выполняется и alloc возвращает неинициализированный указатель.
Библиотека Qt содержит сотни внутренних проверок, которые печатают предупреждающие сообщения при обнаружении программной ошибки. Поэтому мы рекомендуем чтобы вы использовали отладочную версию Qt при разработке программного обеспечения, основанного на Qt.
Имеется одна ошибка, которая является такой распространённой, что она заслуживает упоминания здесь: если вы включите макрос Q_OBJECT в декларацию класса и запустите мета-объектный компилятор (moc), но забудете прилинковать сгенерированный moc объектный код в ваш исполняемый файл, вы получите очень запутанные сообщения об ошибках. Любая ошибка линковки жалуется на отсутствие vtbl, _vtbl, __vtbl или похожее возможно является результатом этой проблемы.
Copyright © 2008 Nokia | Торговые марки | Qt 4.4.3 |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |