Ubuntu下不生产core dump文件分析

1 问题描述

在Ubuntu下,发现程序崩溃后不生成core dump文件, 即使设置了ulimit -c unlimited后仍然无效。

2 问题分析

ulimit -c输出的的含义是核心转储文件的大小限制,单位是blocks,默认是0,表示不生成core dump文件。ulimit -c unlimited后,核心转储文件其实是正常生成了的, 只是并非在当前目录下,可以通过下面的命令来查看:

1
2
> cat /proc/sys/kernel/core_pattern
|/lib/systemd/systemd-coredump %P %u %g %s %t 9223372036854775808 %h

/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>