搬运自我的CSDN https://blog.csdn.net/u013213111/article/details/88071102
以The C Programming Language 1.5.1节中的程序copy.c为例:
1 #include <stdio.h> 2 main() 3 { 4 int c; 5 while ((c = getchar()) != EOF){ 6 putchar(c); 7 } 8 }
用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调试。
以上的完整版记录如下:
1 xxx@xxx-VirtualBox:~/test$ gdb copy -q 2 Reading symbols from copy...done. 3 (gdb) l 4 1 #include <stdio.h> 5 2 int main() 6 3 { 7 4 int c; 8 5 while ((c = getchar()) != EOF){ 9 6 putchar(c); 10 7 } 11 8 return 0; 12 9 } 13 (gdb) b 5 14 Breakpoint 1 at 0x804845c: file 1-5-1-copy.c, line 5. 15 (gdb) r 16 Starting program: /home/ant/test/copy 17 18 Breakpoint 1, main () at 1-5-1-copy.c:5 19 5 while ((c = getchar()) != EOF){ 20 (gdb) watch c 21 Hardware watchpoint 2: c 22 (gdb) n 23 abc 24 25 Hardware watchpoint 2: c 26 27 Old value = 134513841 28 New value = 97 29 0x08048474 in main () at 1-5-1-copy.c:5 30 5 while ((c = getchar()) != EOF){ 31 (gdb) c 32 Continuing. 33 34 Hardware watchpoint 2: c 35 36 Old value = 97 37 New value = 98 38 0x08048474 in main () at 1-5-1-copy.c:5 39 5 while ((c = getchar()) != EOF){ 40 (gdb) c 41 Continuing. 42 43 Hardware watchpoint 2: c 44 45 Old value = 98 46 New value = 99 47 0x08048474 in main () at 1-5-1-copy.c:5 48 5 while ((c = getchar()) != EOF){ 49 (gdb) c 50 Continuing. 51 52 Hardware watchpoint 2: c 53 54 Old value = 99 55 New value = 10 56 0x08048474 in main () at 1-5-1-copy.c:5 57 5 while ((c = getchar()) != EOF){ 58 (gdb) kill 59 Kill the program being debugged? (y or n) y 60 (gdb) info b 61 Num Type Disp Enb Address What 62 1 breakpoint keep y 0x0804845c in main at 1-5-1-copy.c:5 63 breakpoint already hit 1 time 64 (gdb) delete 65 Delete all breakpoints? (y or n) y 66 (gdb) q