Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
...
(gdb) <b>watch do_lint_old</b>
/* Установить отслеживаемую точку для переменной */
Hardware watchpoint 1: do_lint_old
(gdb) <b>run --lint-old 'BEGIN { print "hello, world" }'</b>
/* Запустить программу */
Starting program: /home/arnold/Gnu/gawk/gawk-3.1.4/gawk —lint-old
'BEGIN { print "hello, world" }'
Hardware watchpoint 1: do_lint_old
Hardware watchpoint 1: do_lint_old
Hardware watchpoint 1: do_lint_old
/* Проверка отслеживаемой точки при работе программы */
Hardware watchpoint 1: do_lint_old
Hardware watchpoint 1: do_lint_old
Old value = 0 /* Отслеживаемая точка останавливает программу */
New value = 1
0x420c4219 in _getopt_internal() from /lib/i686/libc.so.6
(gdb) <b>where</b> /* Трассировка стека */
#0 0x420c4219 in _getopt_internal() from /lib/i686/libc.so.6
#1 0x420c4e83 in getopt_long() from /lib/i686/libc.so.6
#2 0x080683a1 in main (argc=3, argv=0xbffff8a4) at main.c:293
#3 0x420158d4 in __libc_start_main() from /lib/i686/libc.so.6
(gdb) <b>quit</b> /* На данный момент мы закончили */
The program is running. Exit anyway? (y or n) <b>y</b> /* Да */
GDB может делать гораздо больше, чем мы здесь показали. Хотя руководство GDB большое, его стоит прочесть целиком хотя бы один раз, чтобы ознакомиться с его командами и возможностями. После этого, возможно, будет достаточно просмотреть файл
NEWS
Стоит также распечатать справочную карточку GDB, которая поставляется в дистрибутиве GDB в файле
gdb/doc/refcard.tex
$ <b>cd gdb/doc</b> /* Перейти о подкаталог doc */
$ <b>make refcard.ps</b> /* Отформатировать справочную карточку */
Предполагается, что справочная карточка будет распечатана с двух сторон листа бумаги 8,5×11 дюймов [168] (размер «letter») в горизонтальном (landscape) формате. В ней на шести колонках предоставлена сводка наиболее полезных команд GDB. Мы рекомендуем распечатать ее и поместить под своей клавиатурой при работе с GDB.
15.4. Программирование для отладки
Имеется множество методик для упрощения отладки исходного кода, от простых до сложных. В данном разделе мы рассмотрим ряд из них.
15.4.1. Код отладки времени компилирования
Несколько методик относятся к самому исходному коду.
15.4.1.1. Использование отладочных макросов
Возможно, простейшей методикой времени компилирования является использование препроцессора для создания условно компилируемого кода. Например:
#ifdef DEBUG
fprintf(stderr, "myvar = %dn", myvar);
fflush(stderr);
#endif /* DEBUG */
Добавление
-DDEBUG
fprintf()
Рекомендация: сообщения отладки посылайте в
stderr
fflush()
ЗАМЕЧАНИЕ. Идентификатор
DEBUG
MYAPPDEBUG
Разбрасывание больших количеств операторов
#ifdef
#ifdef
/* МЕТОДИКА 1 --- обычно используемая, но не рекомендуемая, см. текст */
/* В заголовочном файле приложения: */ #ifdef MYAPPDEBUG
#define DPRINT0(msg) fprintf(stderr, msg)
#define DPRINT1(msg, v1) fprintf(stderr, msg, v1)
#define DPRINT2(msg, v1, v2) fprintf(stderr, msg, v1, v2)
#define DPRINT3(msg, v1, v2, v3) fprintf(stderr, msg, v1, v2, v3)
#else /* ! MYAPPDEBUG */
#define DPRINT0(msg)
#define DPRINT1(msg, v1)
#define DPRINT2(msg, v1, v2)
#define DPRINT3(msg, v1, v2, v3)
#endif /* ! MYAPPDEBUG */
/* В исходном файле приложения: */
DPRINT1("myvar = %dn", myvar);
...
DPRINT2("v1 = %d, v2 = %fn", v1, v2);
Имеется несколько макросов, по одному на каждый имеющийся аргумент, число которых определяете вы сами. Когда определен
MYAPPDEBUG
DPRINT<i>x</i>()
fprintf()
MYAPPDEBUG
assert()
assert()
assert()