有一类程序我们是我们办法去设置断点调试的,特别是应用层网络收发报文出现segmentation fault
这种情况,
这个时候使用gdb+coredump
是一个比较好的定位该问题的方法。
1、 编译可执行程序添加符号表
- 在编译可执行程序的时候需要添加
-g
选项。 - 如果可执行程序链接动态库或者静态库,动态库和静态库的编译也需要添加
-g
选项。 - 可以通过
file a.out
或者readelf -S a.out | grep debug
查看可执行程序时候带有调试信息。
注: 带有stripped
则是不带有可调试信息。
2、 生成coredump文件
一般Linux
系统都是禁止生产coredump
文件的,可以通过ulimit
命令查看是否可以生成coredump
文件或者设置生成coredump
文件。
core file size
为 unlimited
则当程序出现崩溃的时候可以生成coredump
文件。
也可以修改其大小,以块为单位。一个块大小为512字节, ulimit -c 10
.
如果core file size
为0, 则不会生成coredump
文件。
设置coredump
文件的生成路径和文件名:
路径设置向/proc/sys/kernel/core_pattern
中写入, 一般需要对可执行程序具有写权限。
echo /tmp/core_%e_%t_%p > /proc/sys/kernel/core_pattern
。
具体的%的参数在网上可查到。
3. 使用gdb调试coredump文件
gdb 可执行程序 coredump文件名
coredump
文件是由可执行程序a.out
产生的。bt
查看堆栈信息,可以看到产生segmentation fault
的位置在print_hello
函数的第10行。