Основы консольного отладчика GDB

Введение

gdb - наиболее популярный отладчик в системе linux.

Его используют как непосредственно из командной строки, так и из специальных графических оболочек (frontends)

GDB позволяет:

Компиляция

Перед отладкой необходимо скомпилировать программу с ключом -g или -gdb:

gcc -g -o hello hello.с
gcc -ggdb -o age age.c

Есть также возможность использовать несколько уровней полноты отладочной информации (от 0 до 3):

gcc -g3 -o age age.c

Запуск

Для запуска программы под отладчиком используют следующие команды:

gdb имя

в этом случае после старта GDB мы увидим служебную информацию и результат чтения символьной таблицы из программы, например:

$ gdb age1
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /home/shtanyuk/Программирование/C++/age1...done.

Команда

gdb -silent имя

позволяет запустить программу в отладчике без лишней информации

Команда

gdb --args имя параметр1 параметр2 ...

предназначена для передачи исследуемой программе параметров командной строки

Выход

Выход из отладчика осуществляется командами q или quit

(gdb) q
$

Запуск команд shell

Находяcь внутри отладчика можно запустить команду shell:

(gdb) shell ls

Запуск программы под отладчиком

После загрузки программы мы можем запустить её с помощью run и выполнить всю, а также с помощью start и выполнить её по шагам.

Пример выполнения программы:

gdb -silent age
Reading symbols from /home/shtanyuk/Программирование/C++/age...done.
(gdb) run
Starting program: /home/shtanyuk/Программирование/C++/age
Hello, what is your name? Вася
How old are you, Вася? 12
Hey, Вася, you are 12 years old!
Program exited normally.
(gdb) 

Это другой пример выполнения программы (используется start и n (next) для пошагового выполнения:

(gdb) start
Temporary breakpoint 1 at 0x8048560: file age.c, line 5.
Starting program: /home/shtanyuk/Программирование/C++/age
Temporary breakpoint 1, main () at age.c:5
5    {
(gdb) n
11       printf("Hello, what is your name? ");
(gdb) n
12       fgets(name,256,stdin);
(gdb) n
Hello, what is your name? Вася
14       if(name[strlen(name)-1]=='\n')
(gdb) n
15      name[strlen(name)-1]=0;
(gdb) n
17       printf("How old are you, %s? ",name);
(gdb) n
18       if(scanf("%d",&age)!=1)
(gdb) n
How old are you, Вася? 12
25       printf("Hey, %s, you are %d years old!\n",name,age);
(gdb) n
Hey, Вася, you are 12 years old!
29     return 0;
(gdb) n
30  }
(gdb) n

Точки останова

Команда

break N

устанавливает точку останова на строке с номером N. Если запустить программу с помощью run, то выполнение остановится на N-ой строке.

Команда

info breakpoints

в любой момент выводит на экран список точек останова

Точки останова могут содержать условные выражения

break ... if cond

Следующая команда заставит остановиться на 25 строке, если значение переменной age больше 15:

(gdb) break 25 if age>15

Точки просмотра

Помимо точек останова breakpoints в GDB есть ''точки просмотра'' watchpoints. Их назначение - останавливать выполнение программы, если заданная переменная изменяется.

Примечание

Точки просмотра нужно задавать, находясь в области видимости исследуемых переменных. То есть для локальных переменных необходимо сначала войти в блок, где переменная объявлена

(gdb) watch age

Продолжить выполнение программы можно командой c (continue)

(gdb) c
(gdb) watch age
Hardware watchpoint 2: age
(gdb) c
Continuing.
Hello, what is your name? nnn
How old are you, nnn? 67
Hardware watchpoint 2: age
Old value = -1207963660
New value = 67

Кроме команды watch есть аналогичная rwatch, позволяющая задать точку просмотра для переменной, из которой читаются данные.

Точки останова и просмотра можно сделать неактивными с помощью команды disable

(gdb) info breakpoints
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x0804856f in main at age.c:7
2       breakpoint     keep y   0x08048622 in main at age.c:25
(gdb) disable 1
(gdb) info breakpoints
Num     Type           Disp Enb Address    What
1       breakpoint     keep n   0x0804856f in main at age.c:7
2       breakpoint     keep y   0x08048622 in main at age.c:25
(gdb) 

Листинг программы

Команда list позволяет просмотреть исходный код программы вместе с номерами строк, не покидая отладчик

(gdb) list
1    #include 
2    #include 
3   
4   int main()
5   {
6      char name[256];
7      int age;
8   
9      while(1)
10     {

Просмотр и изменение переменных

Команды print и set используются для просмотра и изменения значений переменных

(gdb) run
Starting program: /home/shtanyuk/Программирование/C++/age1 
Hello, what is your name? bbb
How old are you, bbb? 67
Breakpoint 2, main () at age.c:25
25       printf("Hey, %s, you are %d years old!\n",name,age);
(gdb) print age
$1 = 67

Пример с set

set age=15

Можно просмотреть содержимое локальных переменных с помощью

(gdb) info locals

Вход и выход для функций

Просмотр стека вызовов функций:

(gdb) bt