一、基本介绍

在程序崩溃时,通常只能得到一个segfault之类的提示信息。如果想定位崩溃原因,需要更详细的内容,如运行堆栈等。

启用core dump功能后,程序崩溃时,操作系统会生成一个core dump文件,使用gdb可以对它进行分析。

二、查看和启用core dump

在Linux下,执行 ulimit -c 命令,可以查看core dump的当前设置的core dump文件的最大大小,其中0表示关闭coredump,也就是不会生成core dump文件。

执行 ulimit -c时可以再传入一个参数,表示core dump文件的最大大小,特别的如果传递unlimited,如ulimit -c unlimited,表示不限制core dump文件的最大大小。这种方式只对当前shell起作用,退出shell后就会失效。

如果想永久启用,需要修改/etc/security/limits.conf文件,在末尾添加配置:

* soft core unlimited

配置成soft的方式的话,需要退出重登配置才会生效,配置成hard的方式则下一个创建的进程将直接使用该配置,此时直接启动程序即可。

其他配置参数
/proc/sys/kernel/core_pattern 定义了core文件名的生成格式
/proc/sys/kernel/core_uses_pid 如果这个文件的内容被配置成1,那么即使core_pattern中没有设置%p,最后生成的core dump文件名仍会加上进程ID
/proc/sys/kernel/core_pipe_limit 定义了可以有多少个并发的崩溃程序可以通过管道模式传递给指定的core信息收集程序,如果超过,异常信息将被丢弃。0表示不限制并行捕捉的进程个数

上面的配置都是临时的,想要永久生效的话,需要在/etc/sysctl.conf中加入相应配置,如:

kernel.core_pattern = /var/core_log/core_%e_%t_%p
kernel.core_uses_pid = 0

然后使用sysctl –p 命令使配置立即生效。

core文件名的生成格式
默认情况下,core dump在崩溃程序的执行路径下生成。可以通过修改/proc/sys/kernel/core_pattern指定生成路径,该文件内容的默认内容为”core”,可以如此定义指定其生成路径为/var/core_log/:/var/corefile/core_%e_%t_%p。

其中的%e_%t_%p分别代表程序名、转储时间以及进程ID。

PS:可以通过ls -ld /proc/(pid)/cwd获得进程pid的工作目录。在不知道corefile的生成路径时,可以用该方法找到进程的core文件。

参考 http://blog.leanote.com/post/gaunthan/db9f90677c5c