Чтение онлайн

на главную

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

Вывести содержимое памяти можно с использованием команды

print
. GDB распознает синтаксис выражений С, что упрощает и делает естественным проверку структур, на которые ссылаются указатели:

(gdb) print *save /* Вывести структуру, на которую указывает save */

$1 = {sub = {nodep = {l = {lptr = 0x8095250, param_name = 0x8095250 "pR\t\b",

 l1 = 134828624}, r = {rptr = 0x0, pptr = 0, preg = 0x0,

 hd = 0x0, av = 0x0, r_ent =0}, x = {extra = 0x0, x1 = 0,

 param_list = 0x0},

 name = 0x0, number = 1, reflags = 0}, val = {

 fltnum = 6.6614191194446594e-316, sp = 0x0, slen = 0, sref = 1,

 idx = 0}, hash = {next = 0x8095250, name = 0x0, length = 0, value = 0x0,

 ref = 1}}, type = Node_expression_list, flags = 1}

В

заключение, команда
cont
(continue — продолжить) дает возможность продолжить выполнение программы. Она будет выполняться до следующей контрольной точки или до нормального завершения, если других контрольных точек нет. Этот пример продолжается с того места, на котором остановился предыдущий:

1520 for (numnodes = 0; tree != NULL; tree = tree->rnode)

(gdb) cont /* Продолжить *!

Continuing.

hello, world

Program exited normally. /* Сообщение от GDB */

(gdb) quit /* Выйти из отладчика */

Отслеживаемая точка (watchpoint) подобна контрольной точке, но используется для данных, а не для кода. Отслеживаемые точки устанавливаются для переменной (или поля структуры или объединения или элемента массива), при их изменении GDB посылает уведомления. GDB проверяет значение отслеживаемой точки по мере пошагового исполнения программы и останавливается при изменении значения. Например, переменная

do_lint_old
в
gawk
равна true, когда была использована опция
– -lint_old
. Эта переменная устанавливается в true функцией
getopt_long
. (Мы рассмотрели
getopt_long
в разделе 2.1.2 «Длинные опции GNU»). В файле
main.c
программы
gawk
:

int do_lint_old = FALSE;

 /* предупредить о материале, не имевшейся в V7 awk */

...

static const struct option optab[] = {

 ...

 { "lint-old", no_argument, &do_lint_old, 1 },

 ...

};

Вот пример сеанса, показывающего отслеживаемую точку в действии:

$ gdb gawk /* Запустить GDB с gawk */

GNU gdb 5.3

...

(gdb) watch do_lint_old

 /* Установить отслеживаемую точку для переменной */

Hardware watchpoint 1: do_lint_old

(gdb) run --lint-old 'BEGIN { print "hello, world" }'

 /* Запустить программу */

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) where /* Трассировка стека */

#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) quit /* На данный момент мы закончили */

The program is running. Exit anyway? (y or n) y /* Да */

GDB может делать гораздо больше, чем мы здесь показали. Хотя руководство GDB большое, его стоит прочесть целиком хотя бы один раз, чтобы ознакомиться с его командами и возможностями. После этого, возможно, будет достаточно просмотреть файл

NEWS
в каждом новом дистрибутиве GDB, чтобы узнать, что нового или что изменилось.

Стоит также распечатать справочную карточку GDB, которая поставляется в дистрибутиве GDB в файле

gdb/doc/refcard.tex
. Создать печатную версию справочной карточки для PostScript после извлечения исходника и запуска configure можно с помощью следующих команд:

$ cd gdb/doc /* Перейти о подкаталог doc */

$ make refcard.ps /* Отформатировать справочную карточку */

Предполагается, что справочная карточка будет распечатана с двух сторон листа бумаги 8,5×11 дюймов [168] (размер «letter») в горизонтальном (landscape) формате. В ней на шести колонках предоставлена сводка наиболее полезных команд GDB. Мы рекомендуем распечатать ее и поместить под своей клавиатурой при работе с GDB.

168

Примерно 213×275 мм — Примеч. перев.

15.4. Программирование для отладки

Имеется множество методик для упрощения отладки исходного кода, от простых до сложных. В данном разделе мы рассмотрим ряд из них.

15.4.1. Код отладки времени компилирования

Несколько методик относятся к самому исходному коду.

15.4.1.1. Использование отладочных макросов

Возможно, простейшей методикой времени компилирования является использование препроцессора для создания условно компилируемого кода. Например:

#ifdef DEBUG

fprintf(stderr, "myvar = %d\n", myvar);

fflush(stderr);

#endif /* DEBUG */

Добавление

– DDEBUG
к командной строке компилятора вызывает
fprintf
при выполнении программы.

Рекомендация: сообщения отладки посылайте в

stderr
, чтобы они не были потеряны в канале и чтобы их можно было перехватить при помощи перенаправления ввода/вывода. Убедитесь, что использовали
fflush
, чтобы сообщения были выведены как можно скорее

Поделиться:
Популярные книги

Газлайтер. Том 3

Володин Григорий
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Геном хищника. Книга шестая

Гарцевич Евгений Александрович
6. Я - Легенда!
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Геном хищника. Книга шестая

Двойник короля 17

Скабер Артемий
17. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 17

Законы Рода. Том 9

Мельник Андрей
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Последний Паладин. Том 14

Саваровский Роман
14. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Последний Паладин. Том 14

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Пламя

Сокол Лена
3. ПОЖАРНАЯ ЧАСТЬ 17
Любовные романы:
современные любовные романы
прочие любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Пламя

Революция

Валериев Игорь
9. Ермак
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Революция

Газлайтер. Том 22

Володин Григорий Григорьевич
22. История Телепата
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Газлайтер. Том 22

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Солнечный флот

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Дважды одаренный. Том VII

Тарс Элиан
7. Дважды одаренный
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Дважды одаренный. Том VII

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4