使用
ulimit -c
命令可查看core文件的生成开关。
若结果为0,则表示关闭了此功能,不会生成core文件。查看转储设置
ulimit -a
使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。
如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件或者根本就不生成。
如果生成被裁减的core文件,调试此core文件的时候,gdb也会提示错误。
用以下命令来表示core文件的大小不受限制以及开启:ulimit -c unlimited
用以下命令来阻止系统生成core文件:
ulimit -c 0
备注:ulimit命令设置后只对一个终端有效,所以另起终端后需要重新设置。
开启永久有效,配置/etc/profile,的末尾加入行:
ulimit -S -c unlimited > /dev/null 2>&1
配置转储文件保存位置:/proc/sys/kernel/core_pattern
1
2cat /proc/sys/kernel/core_pattern
echo "/corefile/core-%e-%p-%t" | sudo dd of=/proc/sys/kernel/core_pattern
永久设置,修改/etc/sysctl.conf,添加:
1 | kernel.core_uses_pid = 0 |
- 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 | gdb ./test coredumpfile |
生成coredump文件后,使用gdb调试查看