Linux应用程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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后单步运行。