gbd调试器相关知识

        程序的调试工作在整个程序的开发过程中占据了相当大的比例。使用gce调试C程序时,只能依靠gce发出的警告或错误信息来进行,所以调试的效率非常低,
        为此,GNU开发了GDB调试器(GNU Debuger). GDB的调试功能非常强大,甚至可以和Visual C++、Visual Basic、 Jbuilder 等开发工具的调试器相媲美,但GDB的缺点是没有图形调试界面。

例如:

test.c:
#include<stdio.h>

int cal(int n)

{

    if(n == 1)

    return 1;

    else

    return n * cal(n- 1);

}

int main()

{

    int n = 5;

    n = cal(n);

    printf("%d",n);

    return 0;

}
        test.c 文件是一个通过递归调用来计算 5 的阶乘的程序。通过运行命令"gcc -g test.c -o test"对test.c进行编译,其中参数 g 的作用是把调试信息加入生成的 test 可执行文件中,否则GDB就无法对 test 进行调试。

        用命令“gdb test”启动GDB对 test 进行调试。

        GDB首先显示版本信息和库信息。随后GDB停留在符号“(gdb)”处等待用户输入调试命令。GDB 提供了大量的命令来实现各种调试功能。

        常用命令介绍:

(1)查看源文件

        在调试程序时,gcc会给出产生警告或错误的代码行数。但在普通的文本环境中是无法直接获得语句行数的。在GDB中通过命令1( list 的缩写) 可以查看所有的代码行数。

        GDB以10行为单位进行显示。这样设计方便了源代码的阅读。

(2)设置断点

        断点是调试程序的重要方法,通过断点可以知道程序每一步的执行状况(比如当前变量的值、函数是否调用、堆栈使用情况等)。在GDB中通过命令b (breakpoint 的缩写)进行断点设置。

如下所示:

(gdb) b 7

Breakpoint 1 at 0x8048389: file test.c, line 7.

        可以看到,命令b在程序的第7行处设置了第一个断点,并显示了该断点在内存中的物理地址

(3)查看断点情况

        由于使用命令 b 可以设置多个断点,所以用户需要能够随时查看各个断点的情况,在GDB中可以通过命令“info b”查看所有的断点情况。

(4)运行程序

        在GDB中通过命令 r (run的缩写) 运行程序。GDB默认从代码的首行开始运行 (也可以通过“r 行数”的方式让程序从指定行数开始运行)。如果程序中有断点。则程序会在断点行数的前一行暂停运行。

(5)查看变量值

        程序暂停运行后就可以查看当前的状态了。在GDB中通过命令“p变量名”(print的缩写)查看当前变量 n 的值。

        GDB通过"$N" ("$1"、"$2")来显示变量的值。这样在下次查看变量值时,就可以用"$N"代替变量名了。可以看到,当前变量n的值为5。

(6)继续运行程序

        查看完当前程序的情况后,就可以让程序继续往下运行了。在GDB中通过命令 c 让程序继续往下运行。在 test.c 中,由于函数 cal 是递归调用运行,所以程序会再次在断点处哲停。程序暂停后可以再次查看当前变量 n 的值。

(7)单步运行

        在程序逻辑比较复杂的时候往往需要程序能一步一步的往下运行,但如果每行都设置一个断点的话又会很麻烦。在GDB中可以通过命令s (step 的缩写)和 n (next的缩写) 让程序一步一步的往下运行。其中 s 可以在发生函数调用时进入函数内部运行,而 n 不会进入函数内部运行。在 test.c 中。由于函数cal是递归调用运行,所以只能选择 s 才能看到变量 n 的值。

 

 

 

 


 


 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值