当程序出现错误,可使用gdb在线调试,以下举一个简单例子说明,如何定位程序。
1.创建一个文件gdb_test.c,输入以下代码。代码中的第5行,使用了未初始化为有效值的指针,运行过程中肯定是会出错的。
1 #include "stdio.h"
2
3
4 int main()
5 {
6 int *b = 0;
7 *b = 10;
8 printf("******** b = %d ************ ",*b);
9 }
2.编译源码,生成可执行文件gdb_test。增加参数-g 可为调试过程提供更多有效的信息,如更准备定位当前崩溃位置。gdb过程中用list能崩溃附近的代码。
gcc -o gdb_test -g gdb_test.c
3.先直接运行gdb_test程序,由于b未初始化为有效值,运行时会出现段错误。
图1
4.接下来用GDB 来对该程序进行调试
1). 先启动GDB 并装载gdb_test文件:
图2
2). 在gdb提示命令符号后,输入run命令,执行已经装载的gdb_test文件,可看到崩溃的提示信息。这个程序比较简单,崩溃的信息中已经直接说明在哪个文件的哪一行。如果还是无法定位,接着往下看:
图3
3). 输入where 命令,查看程序可能出错的地方。
图4
根据提示,可能第7行有问题。
4). 输入list命令,查看第7行附近的代码
图5
5). 用break命令,在第7行处设置断点.
图6
6).输入run命令,重新运行程序,程序运行到第7行处停止运行,
图7
在这里只有一个变量赋值,唯一可能导致出错的就是这个变量b。
7). 输入print命令查看b的值
图8
由此可见,b是空指针。
另外说明:
- 在GDB命令提示符后,直接按回车键为重复上一次的命令。
- DDD 是一个简洁的GDB图形前端,使用更简单。