cordump是程序崩溃时产生的包含一些堆栈,寄存器信息的文件。windows下如何捕获并分析已做说明,在此只做linux下的说明
通过ulimit -c
查看coredump文件大小限制,一般为0,表示不产生coredump文件,我们需要使用ulimit -c unlimited
解除限制,但当关了终端后又会恢复为0
以下修改只对当前用户永久生效
vim ~/.bashrc
在文件末尾追加
ulimit -c unlimited
保存文件后使其立刻生效
source ~/.bashrc
coredump默认产生在程序执行目录,但是当在程序中修改执行路径后会导致在可执行文件路径找不到
su root
echo /path/to/coredump.%e.%p > /proc/sys/kernel/core_pattern
%p - 插入当前的pid
%u - 插入当前的uid
%g - 插入当前的gid
%s - 插入导致产生core文件的信号
%t - 插入core文件生成时的时间
%h - 插入主机名
%e - 插入程序名
通过一段代码来演示如何分析
void gen_coredump()
{int *ptr = nullptr;*ptr = 0;
}int main(int argc, char **argv)
{gen_coredump();return 0;
}
g++ main.cc -o main -std=c++11 -O0 -m64
执行./main
后会产生一个文件名为coredump.main.4110
的coredump文件
使用gdb进行分析
gdb ./main
(gdb) core-file coredump.main.4110
gdb) bt