设为首页 加入收藏

TOP

4.3.6 调试器gdb
2013-10-12 06:56:48 来源: 作者: 【 】 浏览:88
Tags:4.3.6 调试器 gdb

4.3.6  调试器gdb

调试在接下来的工作中是不可避免的。许多Windows下的工具,像VC++自带的如设置断点、单步跟踪等,都受到了广大用户的赞赏。在Linux下,这个工具最常用的就是gdb。

gdb是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,你比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果是在 UNIX平台下做软件,就会发现gdb这个调试工具有比VC、BCB的图形化调试器更强大的功能。一般来说,gdb主要可以帮你完成下面四个方面的功能。

启动你的程序,可以按照你自定义的要求随心所欲地运行程序。

可让被调试的程序在你所指定的设置的断点处停住(断点可以是条件表达式)。

当程序被停住时,可以检查此时你的程序中所发生的事。

动态地改变你程序的执行环境。

1. 使用流程

首先看一个大家很熟悉的简单实例。在gedit中新建文件,输入以下代码,并保存为test.c。

  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.        }  
  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);  

在保存退出后首先使用gcc对test.c进行编译,注意一定要加上选项"-g",这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。

  1. $gcc -g test.c -o test 

这段程序是没有错误的,但我们仍然可以通过调试这个完全正确的程序来了解gdb的使用流程。

接下来就启动gdb进行调试。注意,gdb调试的是可执行文件,而不是如".c"的源代码,因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。

  1. $gdb test  
  2. Copyright 2004 Free Software Foundation, Inc.  
  3. GDB is free software, covered by the GNU General
    Public License, and you are  
  4. welcome  to  change  it  and/or  distribute  
    copies  of  it  under  certain  conditions.  
  5. Type "show copying" to see the conditions.  
  6. There is absolutely no warranty for GDB.  
    Type "show warranty" for details.  
  7. This  GDB  was  configured  as  "i386-redhat-linux
    -gnu"...Using  host  libthread_db  
  8. library "/lib/libthread_db.so.1".  
  9. (gdb) 

接下来就进入了由"(gdb)"开头的命令行界面了。

查看文件

在gdb中键入"l"(list)就可以查看所载入的文件,如下所示:

  1. (gdb) l  
  2. 1       #include <stdio.h> 
  3. 2       int sum(int m);  
  4. 3       int main()  
  5. 4       {  
  6. 5             int i,n=0;  
  7. 6             sum(50);  
  8. 7             for(i=1; i<=50; i++)  
  9. 8              {  
  10. 9                n += i;  
  11. 10             }  
  12. (Gdb) l  
  13. 11            printf("The sum of 1~50 is %d \n", n );  
  14. 12  
  15. 13      }  
  16. 14      int sum(int m)  
  17. 15      {  
  18. 16                 int i,n=0;  
  19. 17                 for(i=1; i<=m;i++)  
  20. 18                      n += i;  
  21. 19                 printf("The sum of 1~m is = %d\n", n);  
  22. 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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.3.5 编译器gcc(1) 下一篇4.3.4 gedit编辑器

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: