Читать книгу 📗 "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_oldHardware watchpoint 1: do_lint_oldHardware watchpoint 1: do_lint_old /* Проверка отслеживаемой точки при работе программы */Hardware watchpoint 1: do_lint_oldHardware watchpoint 1: do_lint_oldOld value = 0 /* Отслеживаемая точка останавливает программу */New value = 10x420c4219 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 DEBUGfprintf(stderr, "myvar = %dn", myvar);fflush(stderr);#endif /* DEBUG */Добавление
-DDEBUGfprintf()Рекомендация: сообщения отладки посылайте в
stderrfflush()ЗАМЕЧАНИЕ. Идентификатор
DEBUGMYAPPDEBUGРазбрасывание больших количеств операторов
#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);Имеется несколько макросов, по одному на каждый имеющийся аргумент, число которых определяете вы сами. Когда определен
MYAPPDEBUGDPRINT<i>x</i>()fprintf()MYAPPDEBUGassert()assert()assert()