初学GDB(1)

搬运自我的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

猜你喜欢

转载自www.cnblogs.com/lyrich/p/10500943.html