Linux下C编程基础之:gdb调试器
3.4 gdb调试器
调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好、更快地定位程序中的问题从而加快程序开发的进度,是大家都很关注的问题。就如读者熟知的Windows下的一些调试工具,如Visual Studio自带的设置断点、单步跟踪等,都受到了广大用户的赞赏。那么,在Linux下有什么很好的调试工具呢?
gdb调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。虽然,它没有图形化的友好界面,但是它强大的功能也足以与微软的Visual Studio等工具媲美。下面就请跟随笔者一步步学习gdb调试器。
3.4.1 gdb使用流程
这里给出了一个短小的程序,由此带领读者熟悉gdb的使用流程。建议读者能够动手实际操作一下。
首先,打开Linux下的编辑器vi或者emacs,编辑如下代码(由于为了更好地熟悉gdb的操作,笔者在此使用vi编辑,希望读者能够参见3.3节中对vi的介绍,并熟练使用vi)。
/*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无法载入该可执行文件。
[root@localhost gdb]# gcc -g test.c -o test
虽然这段程序没有错误,但调试完全正确的程序可以更加了解gdb的使用流程。接下来就启动gdb进行调试。注意,gdb进行调试的是可执行文件,而不是如".c"的源代码,因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。
[root@localhost gdb]# gdb test
GNU gdb Red Hat Linux (6.3.0.0-1.21rh)
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的版本号、使用的库文件等信息,接下来就进入了由"(gdb)"开头的命令行界面了。
(1)查看文件。
在gdb中键入"l"(list)就可以查看所载入的文件,如下所示。
注意 | 在gdb的命令中都可使用缩略形式的命令,如"l"代表"list","b"代表"breakpoint","p"代表"print"等,读者也可使用"help"命令查看帮助信息。 |
(gdb) l
1 #include <stdio.h>
2 int sum(int m);
3 int main()
4 {
5int i,n = 0;
6 sum(50);
7 for(i = 1; i <= 50; i++)
8 {
9 n += i;
10}
(gdb) l
11printf("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 {
19 n += i;
20 }
21printf("The sum of 1~m is = %d\n", n);
20 }
可以看出,gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。
(2)设置断点。
设置断点是调试程序中一个非常重要的手段,它可以使程序运行到一定位置时暂停。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。
在gdb中设置断点非常简单,只需在"b"后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点),如下所示:
(gdb) b 6
Breakpoint 1 at 0x804846d: file test.c, line 6.
要注意的是,在gdb中利用行号设置断点是指代码运行到对应行之前将其停止,如上例中,代码运行到第6行之前暂停(并没有运行第6行)。
(3)查看断点情况。
在设置完断点之后,用户可以键入"info b"来查看设置断点情况,在gdb中可以设置多个断点。
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804846d in main at test.c:6
用户在断点键入"backrace"(只输入"bt"即可)可以查到
- Linux下C编程基础之:常用编辑器(08-13)
- Linux下C编程基础之:gcc编译器(08-13)
- Linux下C编程基础之:make工程管理器(08-13)
- Linux下C编程基础之:使用autotools(08-13)
- Linux下C编程基础之:实验内容(08-13)
- Linux下C编程基础之:本章小结与思考与练习(08-13)