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
$
Находя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