gdb调试器

来源:互联网 发布:条形码生成软件 编辑:程序博客网 时间:2024/06/07 21:27

程序的调试工作在整个程序的开发过程中占据了相当大的比例。使用 gcc 调试 C 程序时,只能依靠 gcc 发出的警告或错误信息来进行,所以调试的效率非常低。

 

为此,GNU 开发了 GDB 调试器(GNU Debugger)。GDB 的调试功能非常强大,甚至可以和 Visual C++、Visual Basic、Jbuilder 等开发工具的调试器相媲美。但 GDB 的


缺点


是没有图形调试界面。尽管如此,对于从事嵌入式 Linux 应用开发的人员还是有必要知道 GDB

 

的使用方法的。


1)查看源文件

 

在调试程序时,gcc 会给出产生警告或错误的代码行数。但在普通的文本环境中是无法直接获得语句行数的。在 GDB 中通过命令 l(list 的缩写)可以查看所有的代码行数


GDB 以 10 行为单位进行显示。再运行一次命令 l 就会显示下 10 行代码。这

 

样设计方便了源代码的阅读。


2)设置断点

 

断点是调试程序的重要方法,通过断点可以知道程序每一步的执行状况(比如当前变量的值、函数是否调用、堆栈使用情况等)。在 GDB 中通过命令 b(breakpoint 的缩写)


进行

 

断点设置。如下所示:

 

(gdb) b 7

 

Breakpoint 1 at 0x8048389: file test.c, line 7.

 

可以看到,命令 b 在程序的第 7 行处设置了第一个断点,并显示了该断点在内存中的物

 

理地址。

 

3)查看断点情况

 

由于使用命令 b 可以设置多个断点,所以用户需要能够随时查看各个断点的情况。在

 

GDB 中通过命令“info b”查看所有的断点情况。如下所示:

 

(gdb) info b

 

Num Type Disp Enb Address What

 

1 breakpoint keep y 0x08048389 in cal at test.c:7

 

可以看到,GDB 在程序的第 7 行处设置了第一个断点,并显示了断点的位置信息。(4)运行程序

 

GDB 中通过命令 r(run 的缩写)运行程序。GDB 默认从代码的首行开始运行(也可以通过“r 行数”的方式让程序从指定行数开始运行)。如果程序中有断点,则程序会在断


点行数的前一行暂停运行,结果如下所示:

 

(gdb) r

 

Starting program: /home/test

 

 Breakpoint 1, cal (n=5) at test.c:7 7 return n * cal(n - 1);

 

可以看到,程序在运行到第 7 行时就暂停了,没有继续执行第 8 行的代码。


(5)查看变量值

 

程序暂停运行后就可以查看当前的状态了。在 GDB 中通过命令“p 变量名”print 的

 

缩写)查看当前变量 n 的值。如下所示:

 

(gdb) p n $1 = 5

 

GDB 通过“$N”(“$1”、“$2”)来显示变量的值。这样在下次查看变量值时,就可以用

 

“$N”代替变量名了。可以看到,当前变量 n 的值为 5。

 

6)继续运行程序

 

查看完当前程序的情况后,就可以让程序继续往下运行了。在 GDB 中通过命令 c 让程序继续往下运行。在 test.c 中,由于函数 cal 是递归调用运行,所以程序会再次在断点处


暂停。如下所示:

 

(gdb) c Continuing.

 

Breakpoint 1, cal (n=4) at test.c:7 7 return n * cal(n - 1);

 

程序暂停后可以再次查看当前变量 n 的值。如下所示:

 

(gdb) p n $2 = 4

 

7)单步运行

 

在程序逻辑比较复杂的时候往往需要程序能一步一步的往下运行,但如果每行都设置一个断点的话又会很麻烦。在 GDB 中可以通过命令 s(step 的缩写)和 n(next 的缩写)


让程序一步一步的往下运行。其中 s 可以在发生函数调用时进入函数内部运行,而 n 不会进入函数内部运行。在 test.c 中。由于函数 cal 是递归调用运行,所以只能选择 s 才


能看到变量 n 的值。如下所示:

 

(gdb) s

 

cal (n=3) at test.c:4 4 if(n == 1) (gdb) s

 

Breakpoint 1, cal (n=3) at test.c:7 7 return n * cal(n - 1); (gdb) s

 

cal (n=2) at test.c:4 4 if(n == 1) (gdb) s


Breakpoint 1, cal (n=2) at test.c:7 7 return n * cal(n - 1); (gdb) s

 

cal (n=1) at test.c:4

 

4 if(n == 1)

 

(gdb) s

 

5 return 1;

 

由于在使用 s 前函数 cal 已经调用了两次,所以运行 s 后当前变量 n 的值为 3。可以看到,函数 cal 进行 3 次调用后返回了值 1。

 

此外,GDB 还具有很多的功能,比如程序环境设置、使用 shell 命令等。



原创粉丝点击