4.3.6 调试器gdb
调试在接下来的工作中是不可避免的。许多Windows下的工具,像VC++自带的如设置断点、单步跟踪等,都受到了广大用户的赞赏。在Linux下,这个工具最常用的就是gdb。
gdb是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,你比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果是在 UNIX平台下做软件,就会发现gdb这个调试工具有比VC、BCB的图形化调试器更强大的功能。一般来说,gdb主要可以帮你完成下面四个方面的功能。
启动你的程序,可以按照你自定义的要求随心所欲地运行程序。
可让被调试的程序在你所指定的设置的断点处停住(断点可以是条件表达式)。
当程序被停住时,可以检查此时你的程序中所发生的事。
动态地改变你程序的执行环境。
1. 使用流程
首先看一个大家很熟悉的简单实例。在gedit中新建文件,输入以下代码,并保存为test.c。
- #include <stdio.h>
- int sum(int m);
- int main()
- {
- int i,n=0;
- sum(50);
- for(i=1; i<=50; i++)
- {
- n+= i;
- }
- printf("The sum of 1-50 is %d \n", n );
- }
-
- int sum(int m)
- {
- int i,n=0;
- for(i=1; i<=m;i++)
- n+= i;
- printf("The sum of 1-m is %d\n", n);
- }
在保存退出后首先使用gcc对test.c进行编译,注意一定要加上选项"-g",这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。
- $gcc -g test.c -o test
这段程序是没有错误的,但我们仍然可以通过调试这个完全正确的程序来了解gdb的使用流程。
接下来就启动gdb进行调试。注意,gdb调试的是可执行文件,而不是如".c"的源代码,因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。
- $gdb test
- Copyright 2004 Free Software Foundation, Inc.
- GDB is free software, covered by the GNU General
Public License, and you are - welcome to change it and/or distribute
copies of it under certain conditions. - Type "show copying" to see the conditions.
- There is absolutely no warranty for GDB.
Type "show warranty" for details. - This GDB was configured as "i386-redhat-linux
-gnu"...Using host libthread_db - library "/lib/libthread_db.so.1".
- (gdb)
接下来就进入了由"(gdb)"开头的命令行界面了。
查看文件
在gdb中键入"l"(list)就可以查看所载入的文件,如下所示:
- (gdb) l
- 1 #include <stdio.h>
- 2 int sum(int m);
- 3 int main()
- 4 {
- 5 int i,n=0;
- 6 sum(50);
- 7 for(i=1; i<=50; i++)
- 8 {
- 9 n += i;
- 10 }
- (Gdb) l
- 11 printf("The sum of 1~50 is %d \n", n );
- 12
- 13 }
- 14 int sum(int m)
- 15 {
- 16 int i,n=0;
- 17 for(i=1; i<=m;i++)
- 18 n += i;
- 19 printf("The sum of 1~m is = %d\n", n);
- 20 }
gdb列出的源代码中明确地给出了对应的行号,方便代码定位。
设置、查看断点
设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。
在gdb中设置断点非常简单,只需在"b"后加入对应的行号即可(这是最常用的方式,另外还可用其他方式设置断点)。
在设置完断点之后,可以键入"info b"来查看设置断点的情况,在gdb中可以设置多个断点。
运行代码
gdb 默认从首行开始运行代码,键入"r"(run)即可(若想从程序中的指定行开始运行,可在r 后面加上行号)。
查看变量值
在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在gdb中键入"p 变量值"即可。
单步运行
单步运行可以使用命令"n"(next)或"s"(step),它们之间的区别在于:若有函数调用的时候,"s"会进入该函数而"n"不会进入该函数。因此,"s"就类似于VC++等工具中的"step in","n"类似于VC++等工具中的"step over"。
恢复程序运行
在查看完所需变量及堆栈情况后,就可以使用命令"c"(continue)恢复程序的正常运行。这时,它会把剩余还未执行的程序执行完,并显示剩余程序中的执行结果。
2. 基本命令
gdb的命令可以通过help进行查找,由于gdb的命令很多,因此gdb的help将其分成了很多种类(class),用户可以通过进一步查看相关class找到相应的命令。
gdb命令众多,这里只列出一些常用的命令供大家参考,个别读者如果有兴趣,可以查阅专门介绍的相关资料。
gdb常用的命令表如表4-4所示。
表4-4 gdb常用命令表
|
命 令< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
含 义 |
|
file |
装入想要调试的可执行文件 |
|
kill |
终止正在调试的程序 |
|
list |
列出产生执行文件的源代码的一部分 |
|
next |
执行一行源代码但不进入函数内部 |
|
step |
执行一行源代码而且进入函数内部 |
|
run |
执行当前被调试的程序 |
|
quit |
终止gdb |
|
watch |
能监视一个变量的值,而不管它何时被改变 |
|
print |
显示表达式的值 |
|
break |
在代码中设置断点,这将使程序
执行到这里时被挂起 |
|
make |
不退出gdb就可以重新产生可执行文件 |
|
shell |
不离开gdb就执行UNIX shell命令 |
|
q(uit) |
退出GDB |