1. 使用ulimit -c命令可查看core文件的生成开关。
    若结果为0,则表示关闭了此功能,不会生成core文件。

  2. 查看转储设置
    ulimit -a

  3. 使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。
    如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件或者根本就不生成。
    如果生成被裁减的core文件,调试此core文件的时候,gdb也会提示错误。
    用以下命令来表示core文件的大小不受限制以及开启:
    ulimit -c unlimited

    用以下命令来阻止系统生成core文件:
    ulimit -c 0

备注:ulimit命令设置后只对一个终端有效,所以另起终端后需要重新设置。

  1. 开启永久有效,配置/etc/profile,的末尾加入行:
    ulimit -S -c unlimited > /dev/null 2>&1

  2. 配置转储文件保存位置:/proc/sys/kernel/core_pattern

    1
    2
    cat /proc/sys/kernel/core_pattern
    echo "/corefile/core-%e-%p-%t" | sudo dd of=/proc/sys/kernel/core_pattern

永久设置,修改/etc/sysctl.conf,添加:

1
2
kernel.core_uses_pid = 0
kernel.core_pattern = /core_%e_%p
  • 1:添加pid作为扩展名,生成的core文件名称为core.pid
  • 0:不添加pid作为扩展名,生成的core文件名称为core

然后执行sudo sysctl -p

如果/proc/sys/kernel/core_pattern的输出不是以上地址,执行sudo sysctl -p

宿主机的开关状态不影响docker的开关,宿主机文件保存位置就是docker的保存位置。

gdb调试coredump文件

使用gdb exe corefile调试coredump文件,然后输入bt或者where找到错误发生的位置和相应的堆栈信息。就可知道发生错误时的函数调用关系,然后可以使用up或者down查看上一条和下一条具体详细信息。这样便能对问题进行大概定位,然后看源代码,进行分析。

1
2
3
4
5
6
gdb ./test coredumpfile
...
...
...
gdb# where
# where to crash

生成coredump文件后,使用gdb调试查看