1 问题描述
在Ubuntu下,发现程序崩溃后不生成core dump文件, 即使设置了ulimit -c unlimited
后仍然无效。
2 问题分析
ulimit -c
输出的的含义是核心转储文件的大小限制,单位是blocks
,默认是0
,表示不生成core dump文件。ulimit -c unlimited
后,核心转储文件其实是正常生成了的, 只是并非在当前目录下,可以通过下面的命令来查看:
1 | > cat /proc/sys/kernel/core_pattern |
,/proc/sys/kernel/core_pattern
的值是|/lib/systemd/systemd-coredump %P %u %g %s %t 9223372036854775808 %h
,这里的管道符号(|
)意味着内核将把核心转储传递给指定的程序进行处理,而不是直接写入文件。在这个例子中,该程序是/lib/systemd/systemd-coredump
,它是一个由systemd
提供的用于收集和管理核心转储的服务。
紧接着管道符号后的参数是传递给systemd-coredump
的格式化字符串,每个占位符代表不同的信息:
%P
- 进程名%u
- 用户ID (UID) of the process%g
- 组ID (GID) of the process%s
- 信号编号,导致了核心转储(例如,11 表示段错误)%t
- 时间戳,以秒为单位,自纪元以来(即自1970年1月1日UTC以来)9223372036854775808
- 这个看起来像是一个占位符或者特定标志,可能用来表示无限大或某种特殊标记,在这种情况下,它可能是systemd-coredump
的一个内部用法,表示不限制核心转储文件的大小。%h
- 主机名
3 重设core_pattern
要想让程序崩溃后生成core dump文件,需要重设core_pattern
,
典型的设置
1 | > echo "core" | sudo tee /proc/sys/kernel/core_pattern |
这样生成的core dump文件会保存在当前目录下
包含更详细信息的设置
1 | > echo "core.%P.%u.%g.%s.%t.%h" | sudo tee /proc/sys/kernel/core_pattern |
这样生成的core dump文件会保存在当前目录下,文件名格式为core.<program_name>.<pid>.<timestamp>
。