2.3 GDB调试器
2.3.1 基本介绍
调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好更快地定位程序中的问题从而加快程序开发的进度,是大家共同要面对问题。就如读者熟知的Windows下的一些调试工具,如VC自带的设置断点、单步跟踪等,都受到了广大用户的赞赏。那么,在Linux下有什么很好的调试工具呢?
调试器并不是代码执行的必备工具,而是专为程序员方便调试程序而用的。有编程经验的读者都知道,在编程的过程当中,往往调试所花费的时间远远大于编写代码所花费的时间。因此,有一个功能强大、使用方便的调试器是必不可少的。GDB是绝大多数Linux开发人员所使用的调试器,它可以方便地设置断点、单步跟踪等,以满足开发人员的需要。GDB调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。虽然它没有图形化的友好界面,但是它强大的功能足以与微软的VC等工具媲美。
2.3.2 基本命令
GDB的命令可以通过查看help进行查找,由于GDB的命令很多,因此GDB的help中将其分成了很多种类(class),用户可以通过进一步查看相关class找到相应的命令。GDB中的命令主要可以分为以下几类:工作环境相关命令、设置断点与恢复命令、源代码查看命令、查看运行数据相关命令及修改运行参数命令。以下就分别对这几类命令进行讲解。
1.工作环境相关命令
GDB中不仅可以调试所运行的程序,而且还可以对程序相关的工作环境进行相应的设定,甚至还可以使用Shell中的命令进行相关的操作,其功能非常强大。GDB的常见工作环境相关命令如表2-3所示。
表2-3 GDB工作相关命令
2.设置断点与恢复命令
GDB中设置断点与恢复的常见命令如表2-4所示。
表2-4 GDB设置断点与恢复相关命令
由于设置断点在GDB的调试中非常重要,所以在此再着重讲解一下GDB中设置断点的方法。GDB中设置断点有多种方式:其一是按行设置断点,设置方法在前面已经指出,在此就不重复了。另外还可以设置函数断点和条件断点,在此结合实训任务5中的代码,具体介绍后两种设置断点的方法。
(1)函数断点。GDB中按函数设置断点只需要把函数名列在命令“b”之后,如下所示:
(gdb) b sum Breakpoint 1 at 0x80484ba: file test.c, line 16. (gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x080484ba in sum at test.c:16
要注意的是,此时的断点实际是在函数的定义处,也就是在16 行处(注意第16 行还未执行)。
(2)条件断点。GDB中设置条件断点的格式为:b行数或函数名if表达式。具体实例如下所示:
(gdb) b 8 if i==10 Breakpoint 1 at 0x804848c: file test.c, line 8. (gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0804848c in main at test.c:8 stop only if i == 10 (gdb) r Starting program: /home/yul/test The sum of 1-m is 1275 Breakpoint 1, main () at test.c:9 9 n += i; (gdb) p i $1 = 10
可以看到,在第8行(也就是运行完第7行的for循环)设置了一个“i==10”的条件断点,在程序运行之后可以看出,程序确实在i为10的时候暂停运行。
3.GDB中源码查看相关命令
在GDB中可以查看源代码以方便其他操作,常见相关命令如表2-5所示。
表2-5 GDB源码查看相关命令
4.GDB中查看运行数据相关命令
GDB中查看运行数据是指当程序处于“运行”或“暂停”状态时,可以查看的变量及表达式的信息,其常见命令如表2-6所示。
表2-6 GDB查看运行数据相关命令
5.GDB中修改运行参数相关命令
GDB还可以修改运行时的参数,并使该变量按照用户当前输入值继续运行。它的设置方式为:在单步执行的过程中,输入命令“set变量=设定值”。这样,在此之后,程序就会按照该设定的值运行了。下面,笔者结合实训任务5中的代码将n的初始值设为4,其代码如下所示:
(Gdb) b 7 Breakpoint 5 at 0x804847a: file test.c, line 7. (Gdb) r Starting program: /home/yul/test The sum of 1-m is 1275 Breakpoint 5, main () at test.c:7 7 for(i=1; i<=50; i++) (Gdb) set n=4 (Gdb) c Continuing. The sum of 1-50 is 1279 Program exited with code 031.
可以看到,最后的运行结果的确比之前的值大了4。
GDB的使用切记点:
(1)在GCC编译选项中一定要加入“-g”。
(2)只有在代码处于“运行”或“暂停”状态时才能查看变量值。
(3)设置断点后程序在指定行之前停止,输入n或者s后单步运行。