什么是coredump
coredump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照。
操作系统在程序发生异常而且异常在进程内部又没有被捕捉的情况下,会把进程此刻
的内存,寄存器状态,运行堆栈等信息转储到一个核心文件里面。
这个文件是二进制文件,可以使用GDB, ELFDUMP, OBJDUMP或者windows下的
WINDEBUG打开进行分析。
怎么产生core文件
有时候运行一段代码,如下:
int main(int argc, char* argv[])
{
delete argv[0];
return 0;
}
g++ -g main.cpp
生成a.out执行后,会导致程序直接挂掉,并且系统会提示(核心已转储)
但是,我们并没有看到core文件。
在这种情况下,我们需要手动设置让能生成core
首先输入ulimit -a, 你会看到如下结果:
core file size (blocks, -c) 0
如果第一行显示这样,这意味着系统设置的core文件大小为0,所以即使你的程序挂了,也不会有core文件产生。那么你需要设置core的文件大小,ulimit -c unlimited设置完后,继续看ulimit -a
core file size (blocks, -c) unlimited
此时,就会有core文件产生, 使用 gdb a.out core就可以调试了,使用where或者bt就可以查看当前堆栈,找出在哪一个函数出现问题了。
解决两个小问题
使用之前的办法可以生成core,但是会有两个问题
- 产生的核心转储存文件的名字永远是core,我们需要的是更具体的名称
- 当你重新启动后,输入ulimit -a,系统还是不会生成core文件,你需要手动再次用上述过程生成core文件
第一个问题的解决(自定义core文件的名字)
- 一般来说core的名字一般是core_filename_time_pid的形式,那么需要在/etc/sysctl.conf文件中,在文件的最后加上两行代码
kernel.core_pattern=/var/core_log/core_%e_%t_%p
kernel.core_uses_pid=0
第二个问题的解决:设置永久保存产生core文件的配置
- 在/etc/security/limits.conf文件的最后加两行代码
@root soft core unlimited
@root hard core unlimited