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 |
编辑文件 /etc/systemd/coredump.conf
, 添加/修改一下行:
[Coredump] |
编辑文件 /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
|
编译并执行 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
文件,添加或修改以下行:该配置允许用户生成无限大小的core文件* soft core unlimited
* hard core unlimited
- 编辑
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
测试
可以看见, 该方式下, 转储文件直接生成