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.6
Reading 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) where /* Вывести трассировку стека */
#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
Команда where
выводит recurse()
. Команда bt
, означающая 'back trace' (обратная трассировка), является другим названием для where
; ее легче набирать.
Вызов каждой функции в стеке называется frame
GDB дает вам возможность исследовать определенный фрейм. В данном случае нам нужен фрейм 3. Это последний вызов recurse()
, который вызвал abort()
:
(gdb) frame 3 /* Переместиться в фрейм 3 */
#3 0x08048342 in recurse() at ch15-abort.с:13
13 abort(); /* GDB выводит в фрейме положение в исходном коде */
(gdb) list /* Показать несколько строк исходного кода */
8 void recurse(void)
9 {
10 static int i;
11
12 if (++i == 3)
13 abort();
14 else
15 recurse();
16 }
17
(gdb) /* Нажатие ENTER повторяет последнюю команду */
18 int main(int argc, char **argv)
19 {
20 recurse();
21 }
(gdb) quit /* Выйти из отладчика (пока) */
Как показано, нажатие ENTER повторяет последнюю команду, в данном случае list
, для отображения строк исходного кода. Это простой способ прохождения исходного кода.
Для редактирования командной строки GDB использует библиотеку readline
, поэтому для повторения и редактирования ранее введенных команд можно использовать команды Emacs или vi
. Оболочка Bash использует ту же самую библиотеку, поэтому если вам более знакомо редактирование командной строки в приглашении оболочки, GDB работает таким же образом. Эта особенность дает возможность избежать утомительного ручного ввода.
Часто при ошибках программ создается дамп ядра. Первым шагом является использование GDB с файлом core для определения процедуры, в которой произошло завершение программы. Если оригинальный двоичный файл не был откомпилирован для отладки (т.е. без -g
), все, что может сообщить GDB, это имя функции, но больше никаких деталей.
Следующим шагом является перекомпилирование программы с возможностью отладки и без оптимизации, а также проверка того,