程序的调试工作在整个程序的开发过程中占据了相当大的比例。使用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 的值。
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交