1. 启用 core dump
在默认情况下,Linux 可能不生成 core dump 文件。要启用它,需要调整 shell 的 core dump 限制:
- 查看当前限制,执行命令:
ulimit -c
如果返回值为 0,则表示禁用了 core dump。
- 启用 core dump
设置为无限制:
ulimit -c unlimited
上述设置仅在当前的终端有效,如果新建终端或者关闭了此终端,需要重新配置。
如果需要永久设置,可以把这条命令加入到 shell 的启动脚本(比如 ~/.bashrc)中。
- 查看、设置 core dump 文件路径和文件名
查看默认core dump文件路径命令如下:
cat /proc/sys/kernel/core_pattern
在很多传统的 Linux 系统中,该参数的默认值通常是简单的 core,这意味着当程序崩溃时,core dump 文件会在崩溃进程的当前工作目录中生成一个名为 core(或类似名称,如 core.1234)的文件。
但需要注意的是,在一些现代 Linux 发行版中(特别是使用 systemd 的系统),/proc/sys/kernel/core_pattern 的默认值可能被设置为将 core dump 输出管道传递给 systemd-coredump,例如:
|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %e
或者
|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E #apport也是一个收集crash信息的进程。
如果发现/proc/sys/kernel/core_pattern 前面输出待**“|”**的,则说明默认情况下并不会生成core_dump文件,是否生成取决于对应的进程是否开启;
可以通过修改 /proc/sys/kernel/core_pattern 来指定生成 core 文件的存放位置和文件名。例如:
echo "/tmp/core_%e.%p" | sudo tee /proc/sys/kernel/core_pattern
上述命令表示生成的 core dump 文件保存在 /tmp 目录,文件名格式为 core_程序名.进程号。
上述操作同样只针对当前终端。
2. 查找core dump文件
如果发现core dump文件并没有生成,可以根据/proc/sys/kernel/core_pattern的结果去查找对应的日志;
比如,如果使用的是|/usr/share/apport/apport,那么去/var/log中查找apport进程的日志,日志中会记录是否生成core_dump文件;确定文件名后,直接暴力搜索:
sudo find / -type f -name "core.xxx" 2>/dev/null
即可确定路径。
备注:apport进程生成的crash并不在/var/crash/文件中,而是在/var/lib/apport/中;因此如果找不到某个文件,直接暴力搜索。