在编写C++程序中,我们经常会遇到一种错误,segment fault, 这种coredump错误
会导致程序运行时异常退出或者终止,这种错误没有明显错误提示信息,该如何定位错误呢?
在linux下,这种错误会生成的一个叫做core的文件,这个core文件会记录程序在运行时的内存,寄存器状态,内存指针和函数堆栈信息等等。对这个文件进行分析可以定位到程序异常的时候对应的堆栈调用信息。
但某些情况下,程序异常结束并不会生成这个core文件,我们需要对linux环境做出一些设置。
输入指令:
ulimit -a
若core file size 后面是0,我们需要修改为无限制
输入:
ulimit -c unlimited
修改后为:
如果第一条操作仍无法生成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
sudo systemctl disable apport.service
gdb [可执行文件名] [core文件名]
执行gdb调试指令,backtrace(bt)打印当前的函数调用栈的所有信息进行错误定位。