Linux 配置 coredump

core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)

一、 传统 core dump 配置

1.1 开启 core dump

编辑 /etc/security/limits.conf 文件,添加或修改以下行:

* soft core unlimited
* hard core unlimited

该配置允许用户生成无限大小的core文件

1.2 配置命名模板以及自定义core文件存储目录

创建目录并修改权限如下:
mkdir /var/coredumps
chmod 1777 /var/coredumps

编辑 /etc/sysctl.conf 添加或修改以下行:

kernel.core_pattern = /var/coredumps/core-%e-%s-%u-%g-%p-%t
  • %e: 可执行文件名
  • %s: 导致 core dump 的信号号
  • %u: 进程的实际用户 ID
  • %g: 进程的实际组 ID
  • %p: 进程 ID
  • %t: core dump 的时间(UNIX 时间戳)

应用并生效
sysctl -p

二、 配置基于 systemd 的 core dump

编辑 /etc/systemd/system.conf 文件,找到并修改(或添加)以下行:

DumpCore=yes
DefaultLimitCORE=infinity

编辑 /etc/systemd/coredump.conf 文件, 保持默认配置即可

[Coredump]
#Storage=external
#Compress=yes
#ProcessSizeMax=2G
#ExternalSizeMax=2G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=

重载 systemd 配置

systemctl daemon-reexec

编辑 /etc/sysctl.conf 添加或修改以下行:

kernel.core_pattern=|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h

应用并生效
sysctl -p

三、 core dump 实例分析

使用一个简单的 C 程序验证 core dump

#include <stdio.h>

int main() {
int *p = NULL;
*p = 1; // This will cause a segmentation fault
return 0;
}

编译并执行 gcc test.c && ./a.out

图片

3.1 传统方式 coredump 处理

使用 gdb 工具调试 core dump 文件

gdb <path_to_executable> <path_to_core_dump_file>

图片

3.2 基于systemd的 coredump 处理

该模式下的核心转储文件默认保存在 var/lib/systemd/coredump, 默认保存三天

图片

使用 coredumpctl 查看和管理核心转储

  • 列出核心转储

    coredump list
    * 表示已存储的核心
    图片

  • 查看特定进程的核心转储

    coredumpctl list <process_name>

  • 查看核心转储的详细信息

    coredumpctl info <PID>

    图片

  • 分析核心转储文件

    coredumpctl gdb <PID>

  • 删除核心转储文件

    coredumpctl remove <PID>