如何保存并分析Linux内核转储(coredump)文件

简介: 在Linux中,生成coredump需配置系统参数并满足程序条件。通过ulimit或limits.conf设置核心文件大小,修改core_pattern定义存储路径与命名格式,确保程序无信号屏蔽、权限限制,并留足磁盘空间,最后用gdb分析崩溃堆栈,便于调试定位问题。

在 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 的条件

  1. 程序未被设置 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 -p
    
    • 0:禁止 suid 程序生成 coredump(默认)
    • 1:生成的 coredump 仅对 root 可见
    • 2:生成的 coredump 对程序所属用户可见
  2. 程序未被信号屏蔽
    程序若通过 signal(SIGSEGV, SIG_IGN) 等方式屏蔽了崩溃信号(如 SIGSEGV),则不会生成 coredump

  3. 文件系统有足够空间
    确保 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
相关文章
|
17天前
|
SQL 关系型数据库 Shell
Postgresql入门之psql用法详解(四)- 高级功能
psql 是 PostgreSQL 的交互式命令行工具,支持模式匹配、变量替换、SQL 插值、自定义提示符及行编辑功能。通过 `\d` 等元命令可按名称模式查看对象,支持通配符与正则表达式。变量可动态设置并安全插值到 SQL 中,提升脚本灵活性。提供丰富的环境变量与配置文件(如 `.psqlrc`)来自定义行为,兼容不同终端与编码环境,适用于本地或远程数据库管理。
|
关系型数据库 Go PostgreSQL
golang pgx自定义PostgreSQL类型
golang的pgx驱动提供了大约70种PostgreSQL类型支持,但还是有一些类型没有涵盖,本文介绍如何自己编写代码支持特殊的类型。
|
19天前
|
SQL 关系型数据库 数据库
Postgresql入门之psql用法详解(三)- 元命令详解(\dconfig-\if)
psql元命令以反斜杠开头,由psql客户端直接解析执行,用于增强数据库管理与脚本操作。支持参数引用、变量插值、shell命令执行及SQL语句联动,涵盖连接控制、对象查看、数据导入导出等功能,是PostgreSQL交互操作的重要工具。
|
29天前
|
Ubuntu Linux 应用服务中间件
Rocky Linux 9下logrotate配置及踩坑记
本文介绍在Rocky Linux 9系统中配置Nginx日志轮转的完整过程,满足等保要求保留180天日志。通过修改`/etc/logrotate.conf`并创建Nginx专属轮转配置,结合`logrotate.d`与每日定时任务,解决默认无cron脚本导致轮转失效的问题,并提示避免将日志置于系统目录引发权限错误。
|
10天前
|
存储 安全 Cloud Native
Rocky Linux下配置nfs
NFS(网络文件系统)是类Unix系统间分布式文件共享的核心协议,支持跨机器数据共享,广泛应用于云原生、企业文件服务。本文详解NFS在Rocky Linux下的部署:从基础概念、组件安装(nfs-utils、rpcbind)、服务器配置(/etc/exports)、防火墙设置到客户端挂载与自动加载(fstab、autofs),并提供常见问题排查方案,助力构建高效安全的共享存储环境。
|
2月前
|
关系型数据库 Linux 数据库
Rocky Linux PostgreSQL 18 llvm+uring源码安装
PostgreSQL 18正式版发布,新增异步I/O、UUIDv7等功能。本文记录在Rocky Linux 9上从依赖安装、LLVM编译、io_uring配置到PostgreSQL 18源码编译的完整过程,涵盖关键步骤与命令,助你顺利构建最新版本数据库环境。
|
11月前
快速拥有满血全功能DeepSeek,再也不怕服务器繁忙!
官网繁忙不用怕!现在跟我一起通过视频学习阿里云《零门槛、即刻拥有 DeepSeek-R1 满血版》技术解决方案,最快两步三分钟就能拥有 免费!满血版!随时可用!支持联网搜索!带有个人知识库(RAG)!的DeepSeek 模型能力!!!
380 0
快速拥有满血全功能DeepSeek,再也不怕服务器繁忙!
|
Apache 数据安全/隐私保护
HAProxy的高级配置选项-ACL篇之域名重定向案例
这篇文章介绍了HAProxy的ACL(访问控制列表)功能,特别是如何基于域名进行重定向的高级配置选项,并通过实战案例展示了如何配置ACL规则以实现基于特定域名的HTTP重定向。
293 6
HAProxy的高级配置选项-ACL篇之域名重定向案例
|
SQL 存储 缓存
PostgreSQL函数管理接口
学习PostgreSQL服务端开发必须要对函数管理接口有比较深入的了解

热门文章

最新文章