Linux 配置 coredump

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

一、 配置基于 systemd 的 core dump

该模式下的核心转储文件默认保存在 /var/lib/systemd/coredump, 默认保存三天
该核心转储功能由journal配合产生, 因此控制转储文件的保存目录以及时间较难, 如需自定义, 推荐使用传统方式配置核心转储。

编辑文件 /etc/systemd/system.conf ,添加/修改以下行:

DumpCore=yes
DefaultLimitCORE=infinity

编辑文件 /etc/systemd/coredump.conf , 添加/修改一下行:

[Coredump]
Storage=external # 将核心转储存储在文件系统中
Compress=yes # 是否压缩转储文件
ProcessSizeMax=2G # 大小限制 (0 表示不限制)
ExternalSizeMax=2G
JournalSizeMax=767M
MaxUse=5G
KeepFree=1G

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

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

应用上述配置并生效: systemctl daemon-reexec && 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

图片

2.2 基于systemd的 coredump 处理

  • 列出所有核心转储
    coredumpctl list
    图片

    • PID: 崩溃进程的 PID。
    • SIG: 导致崩溃的信号编号(如 11 表示 SIGSEGV)
    • COREFILE: 表示核心转储是否存在(present 或 missing)
  • 查看特定核心转储的详细信息
    coredumpctl info <PID>
    图片

  • 导出核心转储文件
    coredumpctl dump <PID>
    图片

  • 分析核心转储
    coredumpctl gdb <PID>
    图片

三、 传统方式配置 coredump

与基于 coredumpctl 方式不同, 该方式下, 转储文件会直接生成

3.1 开启coredump

  • 启用核心转储
    ulimit -c unlimited

    • 编辑 /etc/security/limits.conf 文件,添加或修改以下行:
      * soft core unlimited
      * hard core unlimited
      该配置允许用户生成无限大小的core文件

3.2 自定义转储文件的目录及大小

  • 编辑文件 /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 时间戳)
  • 创建转储目录
    mkdir /var/coredumps
    chmod 777 /var/coredumps

  • 应用并生效
    sysctl -p

  • 测试
    可以看见, 该方式下, 转储文件直接生成
    图片