Linux 下gdb调试——定位程序崩溃位置

当程序出现错误,可使用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未初始化为有效值,运行时会出现段错误。
Linux <wbr>下gdb调试——定位程序崩溃位置

图1

4.接下来用GDB 来对该程序进行调试
1). 先启动GDB 并装载gdb_test文件:
Linux <wbr>下gdb调试——定位程序崩溃位置
图2

2). 在gdb提示命令符号后,输入run命令,执行已经装载的gdb_test文件,可看到崩溃的提示信息。这个程序比较简单,崩溃的信息中已经直接说明在哪个文件的哪一行。如果还是无法定位,接着往下看:
Linux <wbr>下gdb调试——定位程序崩溃位置
图3

3). 输入where 命令,查看程序可能出错的地方。
Linux <wbr>下gdb调试——定位程序崩溃位置
图4
根据提示,可能第7行有问题。

4). 输入list命令,查看第7行附近的代码
Linux <wbr>下gdb调试——定位程序崩溃位置
图5

5). 用break命令,在第7行处设置断点.
Linux <wbr>下gdb调试——定位程序崩溃位置
图6

6).输入run命令,重新运行程序,程序运行到第7行处停止运行,
Linux <wbr>下gdb调试——定位程序崩溃位置
图7

在这里只有一个变量赋值,唯一可能导致出错的就是这个变量b。

7). 输入print命令查看b的值
Linux <wbr>下gdb调试——定位程序崩溃位置
图8

由此可见,b是空指针。


另外说明:
- 在GDB命令提示符后,直接按回车键为重复上一次的命令。
- DDD 是一个简洁的GDB图形前端,使用更简单。

你可能感兴趣的:(Linux 下gdb调试——定位程序崩溃位置)