GDB调试器

程序的调试工作在整个程序的开发过程中占据了相当大的比例。使用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 " ) 来 显 示 变 量 的 值 。 这 样 在 下 次 查 看 变 量 值 时 , 就 可 以 用 " 2")来显示变量的值。这样在下次查看变量值时,就可以用" 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值