在 Linux 系统中,保存用户程序的 coredump 文件(核心转储文件)需要配置系统参数并确保程序满足生成条件,以下是完整配置与使用方法。
一、核心概念
coredump 是程序崩溃时,系统将其内存、寄存器、堆栈等状态保存到的文件,用于事后调试(如用 gdb 分析崩溃原因)。
默认情况下,Linux 可能会限制 coredump 的生成(如大小限制为 0)。
二、修改系统 coredump 配置
1. 临时配置(重启后失效)
通过 ulimit 命令修改当前会话的资源限制:
# 查看当前 coredump 大小限制(默认可能为 0,即禁止生成)
ulimit -c
# 设置 coredump 大小无限制
ulimit -c unlimited
# 或设置固定大小(单位:块,1块=512字节),例如 100MB
ulimit -c $((100 * 1024 * 1024 / 512))
2. 永久配置(重启后生效)
修改 /etc/security/limits.conf 文件,对指定用户或所有用户生效:
sudo vim /etc/security/limits.conf
添加以下内容:
# 对所有用户生效(* 表示所有用户)
* soft core unlimited
* hard core unlimited
# 或仅对特定用户生效(如 user1)
user1 soft core unlimited
user1 hard core unlimited
soft:软限制,用户可自行临时突破hard:硬限制,系统强制的最大限制
生效方式:
- 普通用户需重新登录
- 系统服务需重启对应服务
3. 配置 coredump 文件的命名与存储路径
默认情况下,coredump 文件会生成在程序的当前工作目录,文件名是 core。
如需自定义文件名和路径(推荐),修改 /proc/sys/kernel/core_pattern:
# 查看当前配置
cat /proc/sys/kernel/core_pattern
# 临时修改(重启后失效):格式说明见下文
sudo sysctl -w kernel.core_pattern=/var/crash/core-%e-%p-%t
# 永久修改:编辑 /etc/sysctl.conf
sudo vim /etc/sysctl.conf
# 添加以下行
kernel.core_pattern=/var/crash/core-%e-%p-%t
# 生效配置
sudo sysctl -p
core_pattern 格式参数说明:
| 参数 | 含义 |
|------|------|
| %e | 程序名称 |
| %p | 程序 PID |
| %t | 转储时间戳(秒) |
| %u | 程序所属 UID |
| %g | 程序所属 GID |
| %h | 主机名 |
注意:确保存储目录存在且可写:
sudo mkdir -p /var/crash
sudo chmod 777 /var/crash # 临时测试,生产环境建议限制权限
三、确保程序满足生成 coredump 的条件
程序未被设置
setuid/setgid且非特权程序
若程序有setuid权限(如sudo运行的程序),需额外配置/proc/sys/fs/suid_dumpable:# 临时允许 suid 程序生成 coredump sudo sysctl -w fs.suid_dumpable=2 # 永久配置:添加到 /etc/sysctl.conf fs.suid_dumpable=2 sudo sysctl -p0:禁止 suid 程序生成 coredump(默认)1:生成的 coredump 仅对 root 可见2:生成的 coredump 对程序所属用户可见
程序未被信号屏蔽
程序若通过signal(SIGSEGV, SIG_IGN)等方式屏蔽了崩溃信号(如SIGSEGV),则不会生成coredump。文件系统有足够空间
确保coredump存储目录所在分区有足够空间,避免因空间不足导致生成失败。
四、步骤 3:测试 coredump 生成
编写一个会崩溃的测试程序 crash.c:
#include <stdio.h>
int main() {
// 空指针解引用,触发 SIGSEGV 崩溃
int *p = NULL;
*p = 10;
return 0;
}
编译并运行:
# 编译时保留调试信息(必须加 -g,否则 gdb 无法调试)
gcc -g crash.c -o crash
# 运行程序,触发崩溃
./crash
此时会在 /var/crash 目录下生成类似 core-crash-12345-1735689000 的文件。
五、使用 gdb 分析 coredump 文件
# 格式:gdb 程序可执行文件 coredump 文件
gdb ./crash /var/crash/core-crash-12345-1735689000
在 gdb 中输入 bt 命令,即可查看崩溃时的调用堆栈:
(gdb) bt
#0 0x0000555555555145 in main () at crash.c:6