Linux coredump

关于 coredump

在 Linux 下, 如果程序崩溃, OS 可以生成 core 文件保存当前的堆栈信息, 方便 debug.

一般生成 coredump 的原因包括了:

  • 内存越界
  • 非法指针
  • 堆栈溢出
  • 死锁
  • 非法操作, 除零这种等等

coredump 文件 limit

主要是文件大小的限制, 因为一般 core 文件会比较大.

ulimit -c unlimited

永久设置, 需要修改 /etc/security/limits.conf 文件:

#*              soft    core            0
*               soft    core            unlimited

在线上环境, 如果有 coredump 之后自动拉起的机制, 比较容易发生 core 文件堆满磁盘的情况, 需要注意.

coredump 文件的格式和路径

# 修改 /proc/sys/kernel/core_pattern
echo '%e.core.%p' > /proc/sys/kernel/core_pattern
参数 说明
%% 单个%字符
%p dump进程的进程ID
%u dump进程的用户ID
%g dump进程的组ID
%s 导致core dump的信号
%t core dump的时间
%h 主机名
%e 程序文件名

永久设置, 需要修改 /etc/sysctl.conf 配置文件并执行 sysctl -p.

# 增加一行
kernel.core_pattern = %e.core.%p

core 文件是否带 pid 由 /proc/sys/kernel/core_uses_pid 参数决定.

如果这个文件的内容被配置成 1, 那么即使 core_pattern 中没有设置 %p, 最后生成的 coredump 文件名仍会加上进程 ID.

永久设置, 修改 /etc/sysctl.conf 配置文件并执行 sysctl -p.

# 增加一行
kernel.core_uses_pid = 1