以The C Programming Language 1.5.1节中的程序copy.c为例:
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF){
putchar(c);
}
}
用gcc进行编译gcc -g copy.c -o copy
,-g表示生成调试信息。
然后就可以用gdb进行调试了gdb copy -q
,-q用于忽略gdb的版本信息等。
输入命令l
可以显示代码。
在第5行插入断点b 5
开始调试r
程序运行到第5行的断点出停止,此时加入观察变量c的命令watch c
单步调试n
此时可以输入一些字符,例如abc,然后回车,发现变量c的值发生了改变,变为了97,即a的ascii码。
继续运行至断点处c
,可以看到c的值从97变为98,即b的ascii码。
输入命令c
继续运行,看到c的值由98变为99,即c的ascii码。
输入命令c
继续运行,看到c的值由99变为10,即换行符\n的ascii码。
输入kill
终止程序。
命令info b
可以看到所有的断点信息,delete
删除断点。
最后用命令q
退出gdb调试。
以上的完整版记录如下:
xxx@xxx-VirtualBox:~/test$ gdb copy -q
Reading symbols from copy...done.
(gdb) l
1 #include <stdio.h>
2 int main()
3 {
4 int c;
5 while ((c = getchar()) != EOF){
6 putchar(c);
7 }
8 return 0;
9 }
(gdb) b 5
Breakpoint 1 at 0x804845c: file 1-5-1-copy.c, line 5.
(gdb) r
Starting program: /home/ant/test/copy
Breakpoint 1, main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) watch c
Hardware watchpoint 2: c
(gdb) n
abc
Hardware watchpoint 2: c
Old value = 134513841
New value = 97
0x08048474 in main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) c
Continuing.
Hardware watchpoint 2: c
Old value = 97
New value = 98
0x08048474 in main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) c
Continuing.
Hardware watchpoint 2: c
Old value = 98
New value = 99
0x08048474 in main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) c
Continuing.
Hardware watchpoint 2: c
Old value = 99
New value = 10
0x08048474 in main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) kill
Kill the program being debugged? (y or n) y
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804845c in main at 1-5-1-copy.c:5
breakpoint already hit 1 time
(gdb) delete
Delete all breakpoints? (y or n) y
(gdb) q