linux下gdb如何处理coredump错误
在编写C++程序中,我们经常会遇到一种错误,segment fault, 这种coredump错误
会导致程序运行时异常退出或者终止,这种错误没有明显错误提示信息,该如何定位错误呢?
在linux下,这种错误会生成的一个叫做core的文件,这个core文件会记录程序在运行时的内存,寄存器状态,内存指针和函数堆栈信息等等。对这个文件进行分析可以定位到程序异常的时候对应的堆栈调用信息。
但某些情况下,程序异常结束并不会生成这个core文件,我们需要对linux环境做出一些设置。
1. 检查core file size 是否被限制为0
输入指令:
ulimit -a
若core file size 后面是0,我们需要修改为无限制
输入:ulimit -c unlimited
修改后为:
2.禁用apport服务
如果第一条操作仍无法生成core文件,那么我们需要继续执行以下操作:
- 设置core 文件的格式
打开 /etc/sysctl.conf , 在底部加上如下2行, 设置生成的core文件格式
sudo vim /etc/sysctl.conf
%e-execute name, %p-process %s-siganl that cause coredump
kernel.core_pattern=core-%e-%p-%s
- 禁用apport 服务, 有这个服务运行还是不能生成core 文件
sudo systemctl disable apport.service
- 重启电脑或者虚拟机
使用GDB进行调试
gdb [可执行文件名] [core文件名]
执行gdb调试指令,backtrace(bt)打印当前的函数调用栈的所有信息进行错误定位。