ulimit -c unlimited
解除核心文件大小限制,设置/proc/sys/kernel/core_pattern
定义存储路径及命名格式,再通过kill -s SIGSEGV $$
或运行崩溃程序主动触发段错误即可生成core文件。在Linux系统中,程序异常退出时会产生core dump文件(核心转储文件),它记录了程序崩溃时的内存状态、寄存器值等关键信息,是调试程序崩溃原因的重要工具,以下是详细操作指南:
为什么需要生成core文件?
当程序因段错误(Segmentation Fault)、内存溢出等异常终止时,core文件能帮助开发者:
- 定位崩溃的具体代码位置
- 分析崩溃时的变量状态
- 复现难以追踪的偶发性Bug
启用core文件生成的步骤
检查系统当前配置
ulimit -c
- 若返回
0
表示禁止生成,返回unlimited
或具体数值(单位KB)则表示允许。
临时启用(当前会话有效)
ulimit -c unlimited # 允许生成任意大小的core文件
永久启用(需root权限)
步骤:
- 编辑配置文件:
sudo vim /etc/security/limits.conf
- 在文件末尾添加:
* soft core unlimited * hard core unlimited
- 保存后退出,重启系统或重新登录生效。
设置core文件保存路径与命名规则
编辑 /etc/sysctl.conf
:
sudo vim /etc/sysctl.conf
kernel.core_pattern = /var/coredump/core-%e-%t-%p # 自定义路径和格式 kernel.core_uses_pid = 1 # 文件名中包含进程ID
应用配置:
sudo sysctl -p
命名格式说明:
%e
:程序文件名%t
:崩溃时间戳%p
:进程ID
手动触发core dump(测试用)
- 编写测试程序
crash.c
:#include <stdio.h> int main() { int *p = NULL; *p = 1; // 触发段错误 return 0; }
- 编译并运行:
gcc crash.c -o crash ./crash
- 查看生成的core文件:
ls /var/coredump/core-crash-* # 根据自定义路径查找
使用GDB分析core文件
gdb ./crash /var/coredump/core-crash-<进程ID>
在GDB中执行:
bt # 查看崩溃时的调用栈 info locals # 检查局部变量
常见问题解决
-
未生成core文件?
- 检查
ulimit -c
是否为unlimited
- 程序目录是否有写入权限(或检查自定义路径权限)
- 文件系统空间不足
- 程序设置了
seteuid
/setegid
(需配置fs.suid_dumpable=2
)
- 检查
-
core文件过大?
- 限制大小:
ulimit -c 102400
(单位KB) - 压缩存储:在
kernel.core_pattern
中添加压缩命令,如:kernel.core_pattern = |/usr/bin/gzip > /var/coredump/core-%e-%t.gz
- 限制大小:
安全注意事项
core文件可能包含敏感数据(如内存中的密码):
- 生产环境中建议限制访问权限:
chmod 600 /var/coredump/*
- 定期清理旧文件:使用
cron
任务删除过期core文件。
引用说明
- Linux
man
手册:man 5 core
、man sysctl
- GNU GDB调试器文档:https://www.gnu.org/software/gdb/
- Linux内核参数文档:https://www.kernel.org/doc/html/latest/
通过以上步骤,您可有效捕获并分析Linux系统的core文件,快速定位程序崩溃根源,建议在开发调试环境中启用,生产环境谨慎使用。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/23713.html