有一类程序我们是我们办法去设置断点调试的,特别是应用层网络收发报文出现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行。


被折叠的 条评论
为什么被折叠?



