Next Previous Table of Contents

### 12. Поиск ошибок

### 12.1 Отладочные макросы, предоставляемые Qt

Отладочные макросы, предоставляемые библиотекой Qt, описаны на странице debug.html online-документации Qt, доступной по линку "Debugging Techniques" на странице с индексом Qt-документации.

Наиболее часто используемые макросы:

- ASSERT(b)
- CHECK_PTR(p)

b - выражение типа boolean. Генерирует предупреждающее сообщение дебаггера, если равно false; p - указатель, который проверяется, если он равен нулю, то генерируется предупреждающее сообщение.

Подробности см. в online-документации Qt.

### 12.2 Макросы KDE

Внимание: Эта глава - копия документа о макросе KDEBUG, включенного в набор библиотек KDE и написанного Kalle Dalheimer's kalle@kde.org. Документ находится в файле kdebug.html.

Последнее изменение: Sat Sep 13 11:56:01 CEST 1997

Что такое KDebug

KDebug - набор макросов и функций, делающий более эффективным использование диагностических сообщений. Вы можете получать сообщения одного из четырех уровней строгости. Вы можете выбрать в процессе выполнения, куда должны выводиться диагностические сообщения, и какие из них вообще должны выводиться.

Макрос KDEBUG

Использование KDebug очень простое. Все, что вы должны сделать, это включить #include <kdebug.h> в начало каждого исходного файла, в котором вы хотите использовать диагностические сообщения, и выводить эти сообщения, вызывая макрос KDEBUG. Он ожидает 3 параметра. Первый - уровень безопасности; используйте следующие константы:

- KDEBUG_INFO
- KDEBUG_WARN
- KDEBUG_ERROR
- KDEBUG_FATAL

Второй параметр - это область. Область - часть KDE, которую вы определяете сами. Потом, в процессе выполнения, вы сможете выбрать, от какой области необходимо печатать диагностические сообщения. См. файл kdelibs/kdecore/kdebugareas.txt для получения списка уже назначенных диапазонов областей. Выберите область в диапазоне вашего приложения. Если ваше приложение еще не включено в этот список, и вы имеете доступ к CVS, вы можете назначить там область для своего приложения, иначе напишите мне. Вероятно, будет хорошей идеей определить символическую константу для области, которую вы хотите использовать, но это решаете вы.

Третий параметр, наконец, это текст, который вы хотите вывести. KDebug автоматически добавит логическое имя приложения, если вы производите вывод в файл, в stderr или в syslog. Всегда добавляется символ новой строки, вы не должны его использовать сами. Если вам нужны параметры, вы можете использовать один из макросов KDEBUG1, ..., KDEBUG9. Это позволит иметь от 1 до 9 дополнительных параметров. Синтаксис вывода абсолютно аналогичен printf, например, вы можете включать спецификации формата в ваше сообщение, которые заменяются дополнительными параметрами. Например:

> `

>     KDEBUG3( <idx/KDEBUG_INFO/, kmail_composer, "Message no. %d to %s has %d bytes",
>               message_no, aMessage.to(), aMessage.length() );

> `

KASSERT

Есть также макросы KASSERT, KASSERT1, ..., KASSERT9, которые работают так же, как их KDEBUG-аналоги, однако они имеют дополнительный первый параметр булевского типа. Только если он обращается в ложь, сообщение будет распечатано.

Примечание 1: вы не должны использовать ни KDEBUG, ни KASSERT до создания объекта KApplication.

Примечание 2: KDebug не предоставляет никаких возможностей интернационализации, поскольку он предназначен только для разработчиков. Если вы хотите информировать пользователя о нештатной ситуации (например, "этот файл защищен от записи"), используйте KMsgBox.

Опции компилятора

Вы не должны задавать никаких специальных ключей для компилятора при использовании KDebug. Но когда вы распространяете свое приложение (в основном это касается людей, которые создают .rpm или .deb пакеты), вы должны компилировать с ключом -DNDEBUG. Это просто удалит код дебаггера из вашего приложения и сделает его меньше и быстрее (например, оно будет использовать на 256K меньше памяти).

Как анализировать диагностические сообщения в процессе выполнения

Вы можете нажать Ctrl-Shift-F12 в любом приложении KDE в любое время, и появится диалог "Debug Settings". В нем вы сможете определить раздельно для каждого уровня строгости, что должно быть сделано с диагностическими сообщениями этого уровня. Возможны следующие настройки:

- Output: в этом списке вы можете выбрать, куда будут выводиться диагностические сообщения; доступен выбор "File", "Message Box", "Shell" (имеется в виду stderr) и "syslog". Не направляйте фатальные сообщения в syslog, если вы не системный администратор. По умолчанию используется "Message Box".
- File: это поле используется, если вы решили выводить сообщения в файл; здесь указывается имя файла (интерпретируется относительно текущего каталога). По умолчанию kdebug.dbg.
- Area: определяет области, для которых осуществляется вывод. Все сообщения, не упомянутые в них, не будут выведены (если только это поле не оставлено пустым, что используется по умолчанию и значит вывод всех сообщений). Вы можете ввести несколько областей, разделенных ",", и вы можете назначить диапазоны областей с синтаксисом "начало-конец". Например, 117,214-289,356-359,221. Не используйте пробелы.

Кроме того, вы можете выбрать опцию "Прерывать на фатальных ошибках" ("Abort on fatal errors"). В этом случае при возникновении диагностического сообщения с уровнем "KDEBUG_FATAL" приложение завершит работу с кодом SIGABRT после вывода этого сообщения. Когда вы закроете диалог кнопкой OK, ваши настройки вступят в силу немедленно и сохранятся в конфигурационном файле вашего приложения. Имейте в виду, что эти установки специфичны для каждого приложения! При нажатии cancel все изменения будут утеряны, и будут возвращены предыдущие установки.

Next Previous Table of Contents