ulimit -c unlimited
,然后配置生成路径和格式,如echo "/tmp/core-%e-%p" > /proc/sys/kernel/core_pattern
,程序崩溃时将自动在指定目录生成core文件,用于调试分析。什么是 Core Dump?
Core Dump(核心转储)是 Linux 系统在程序崩溃或收到终止信号时生成的内存快照文件,它记录了程序崩溃瞬间的内存状态、寄存器值和堆栈信息,是开发者诊断程序崩溃、内存泄漏等问题的关键工具。
核心转储的配置与生成步骤
检查当前系统设置
ulimit -c # 查看 core 文件大小限制
- 返回
0
表示禁止生成,unlimited
表示无限制。 - 临时解除限制(当前会话有效):
ulimit -c unlimited
永久启用 Core Dump
编辑 /etc/security/limits.conf
,在文件末尾添加:
* soft core unlimited * hard core unlimited
保存后退出,重启系统或重新登录生效。
自定义 Core 文件存储路径
编辑 /etc/sysctl.conf
:
kernel.core_pattern = /var/coredump/core-%e-%t-%p
参数说明:
%e
:程序名称%t
:时间戳(Unix 时间)%p
:进程 ID
应用配置:
sudo sysctl -p
测试 Core Dump 生成
# 触发崩溃的示例程序 #include <stdio.h> int main() { int *p = NULL; *p = 1; // 触发段错误 return 0; }
编译并运行:
gcc -o crash crash.c && ./crash
成功生成时输出:
Segmentation fault (core dumped)
分析 Core Dump 文件
使用 gdb
诊断问题:
gdb ./crash /var/coredump/core-crash-12345-1698765432
常用命令:
bt
:查看堆栈回溯(Backtrace)info registers
:检查寄存器状态print [变量]
:查看变量值
示例输出:
#0 0x0000555555555151 in main () at crash.c:3
3 *p = 1;
常见问题解决
❌ 问题 1:未生成 Core 文件
- 检查项:
ulimit -c
是否为unlimited
- 磁盘空间是否充足
- 程序是否有写权限(如
/var/coredump
需chmod 777
) - AppArmor/SELinux 是否拦截(临时禁用:
sudo setenforce 0
)
❌ 问题 2:Core 文件被截断
- 原因:磁盘空间不足或进程资源限制。
- 解决:
echo "fs.suid_dumpable=2" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
高级配置技巧
压缩 Core 文件
修改 /etc/sysctl.conf
:
kernel.core_pattern = |/usr/bin/gzip -c > /var/coredump/core-%e-%t.gz
按用户隔离存储
kernel.core_pattern = /home/%u/coredumps/core-%e-%p
脚本自动化分析
创建分析脚本 analyze_core.sh
:
#!/bin/bash gdb -batch -ex "bt" -ex "quit" $1 $2 > crash_report.txt
场景 | 关键命令/配置 |
---|---|
开启生成 | ulimit -c unlimited |
永久生效 | /etc/security/limits.conf |
自定义路径 | kernel.core_pattern |
分析工具 | gdb [程序] [core文件] |
Core Dump 是 Linux 故障排查的“黑匣子”,通过合理配置和分析,开发者能精准定位程序崩溃根源,提升系统稳定性,建议在生产环境中启用并定期归档核心转储文件。
引用说明:
- Linux
man
手册:man 5 core
、man sysctl.conf
- GNU Debugger 官方文档:GDB: The GNU Project Debugger
- Linux 内核参数文档:Kernel.org Documentation
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/10378.html