Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
recurse();}Вот небольшой сеанс GDB с этой программой:
$ <b>gcc -g ch15-abort.c -o ch15-abort</b> /* Компилировать без -O */$ <b>ch15-abort</b> /* Запустить программу */Aborted (core dumped) /* Она печально завершается */$ <b>gdb ch15-abort core.4124</b> /* Запустить для нее GDB */GNU gdb 5.3Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNUGeneral Public License, and you arewelcome to change it and/or distribute copies of itunder certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i686-pc-linux-gnu"...Core was generated by 'ch15-abort'.Program terminated with signal 6, Aborted.Reading symbols from /lib/i686/libc.so.6...done.Loaded symbols for /lib/i686/libc.so.6Reading symbols from /lib/ld-linux.so.2...done.Loaded symbols for /lib/ld-linux.so.2#0 0x42028ccl in kill() from /lib/i686/libc.so.6(gdb) <b>where</b> /* Вывести трассировку стека */#0 0x42028cc1 in kill() from /lib/i686/libc.so.6#1 0x42028ac8 in raise() from /lib/i686/libc.so.6#2 0x4202a019 in abort() from /lib/1686/libc.so.6#3 0x08048342 in recurse() at ch15-abort.c:13 /* <-- Нам нужно исследовать здесь */#4 0x08048347 in recurse() at ch15-abort.с:15#5 0x08048347 in recurse() at ch15-abort.c:15#6 0x0804835f in main (argc=1, argv=0xbffff8f4) at ch15-abort.c:20#7 0x420158d4 in __libc_start_main() from /lib/i686/libc.so.6Команда
whererecurse()btwhereВызов каждой функции в стеке называется фреймом. Этот термин пришел из области компиляторов, в которой параметры, локальные переменные и адреса возврата каждой функции, сгруппированные в стеке, называются фреймом стека. Команда
framerecurse()abort()(gdb) <b>frame 3</b> /* Переместиться в фрейм 3 */#3 0x08048342 in recurse() at ch15-abort.с:1313 abort(); /* GDB выводит в фрейме положение в исходном коде */(gdb) <b>list</b> /* Показать несколько строк исходного кода */8 void recurse(void)9 {10 static int i;1112 if (++i == 3)13 abort();14 else15 recurse();16 }17(gdb) /* Нажатие ENTER повторяет последнюю команду */18 int main(int argc, char **argv)19 {20 recurse();21 }(gdb) <b>quit</b> /* Выйти из отладчика (пока) */Как показано, нажатие ENTER повторяет последнюю команду, в данном случае
listДля редактирования командной строки GDB использует библиотеку
readlinevi15.3.2. Установка контрольных точек, пошаговое выполнение и отслеживаемые точки
Часто при ошибках программ создается дамп ядра. Первым шагом является использование GDB с файлом core для определения процедуры, в которой произошло завершение программы. Если оригинальный двоичный файл не был откомпилирован для отладки (т.е. без
-gСледующим шагом является перекомпилирование программы с возможностью отладки и без оптимизации, а также проверка того, что она все еще содержит ошибку. Предположив, что это так, можно запустить программу под контролем отладчика и установить контрольную точку в процедуре, вызывающей ошибку.
Контрольная точка (breakpoint) является точкой, в которой исполнение должно прерваться, остановиться. Контрольные точки можно установить по имени функции, номеру строки исходного файла, файлу исходного файла совместно с номером строки, а также другими способами.
После установки контрольной точки программа запускается с использованием команды
runrungawk$ <b>gdb gawk</b> /* Запуск GDB для gawk */