1. 引言

在 Linux 系统开发和调试过程中,程序崩溃时生成的 coredump 文件是定位问题的关键。它包含了程序崩溃时的内存镜像、寄存器状态和堆栈信息,是事后分析崩溃原因的重要依据。然而,默认情况下 Linux 系统可能不会生成 coredump 文件,或者生成的位置和格式不符合我们的需求。

本文将详细介绍如何在 Linux 系统中配置 coredump 文件的生成,包括设置存储路径、权限配置、SUID 程序支持等,并提供完整的验证和优化方案。

2. 核心概念

2.1 什么是 coredump?

Coredump(核心转储)是程序异常终止时操作系统自动生成的一个文件,它包含了程序崩溃时的完整内存状态。通过分析 coredump 文件,开发者可以:

  • 确定程序崩溃的位置(函数调用栈)
  • 查看崩溃时的变量值
  • 分析内存泄漏和越界访问问题
  • 重现难以复现的偶发性崩溃

2.2 相关配置参数

  • core_pattern:控制 coredump 文件的命名和存储路径
  • suid_dumpable:控制 SUID(Set User ID)程序的转储行为
  • ulimit -c:控制当前 shell 的 coredump 文件大小限制
  • limits.conf:系统级的资源限制配置文件

3. 完整配置步骤

3.1 创建 coredump 存储目录

首先需要创建一个专门用于存储 coredump 文件的目录,并确保内核和 root 进程有写入权限:

# 新建目录,内核和 root 进程需要写入权限
mkdir -p /home/pc/coredump
sudo chmod 777 /home/pc/coredump

3.2 配置系统资源限制

编辑系统资源限制配置文件,为所有用户和 root 用户设置无限制的 coredump 大小:

sudo gedit /etc/security/limits.conf

在文件末尾追加以下内容:

* soft core unlimited
* hard core unlimited
root soft core unlimited
root hard core unlimited

3.3 配置内核参数

创建内核配置文件,设置 coredump 的存储路径和命名格式,同时开启 SUID 程序转储(这对于 Qt 等 GUI 程序是必需的):

# 写入内核配置,同时开启 SUID 程序转储(Qt 程序必备)
sudo tee /etc/sysctl.d/99-core-pattern.conf <<EOF
kernel.core_pattern=/home/pc/coredump/core_%e_%p_%t
fs.suid_dumpable=2
EOF

# 加载生效
sudo sysctl -p /etc/sysctl.d/99-core-pattern.conf

参数说明:

  • %e:可执行文件名
  • %p:进程 ID
  • %t:转储时间戳(从 1970-01-01 00:00:00 开始的秒数)
  • fs.suid_dumpable=2:允许 SUID 程序生成 coredump

3.4 验证配置是否成功

执行以下命令验证配置是否生效:

# 验证 core_pattern 配置
cat /proc/sys/kernel/core_pattern
# 预期输出:/home/pc/coredump/core_%e_%p_%t

# 验证 suid_dumpable 配置
sysctl fs.suid_dumpable
# 预期输出:fs.suid_dumpable = 2

4. 应用程序集成配置

4.1 开机自启动脚本配置

如果您的应用程序需要通过开机自启动脚本运行,需要在脚本中添加以下配置:

#!/bin/bash
# 启用 coredump
ulimit -c unlimited
# 启动应用程序
./AppRun

4.2 远程部署环境变量配置

在远程部署环境中,可以通过环境变量设置 coredump 限制:

# 在启动脚本或环境配置中添加
export ULIMIT="-c unlimited"

5. 禁用系统默认的 apport 服务

Ubuntu 系统默认使用 apport 服务来处理崩溃报告,这可能会干扰自定义的 coredump 配置。建议禁用 apport:

# 永久关闭 apport
sudo sed -i 's/enabled=1/enabled=0/' /etc/default/apport
sudo systemctl stop apport
sudo systemctl disable apport

# 重新加载自定义 core 路径配置
sudo sysctl -p /etc/sysctl.d/99-core-pattern.conf

# 再次验证配置
cat /proc/sys/kernel/core_pattern
sysctl fs.suid_dumpable

6. 测试 coredump 生成

6.1 手动触发测试

创建一个简单的测试程序来验证 coredump 配置:

// test_crash.c
#include <stdlib.h>

int main() {
    // 触发段错误
    int *p = NULL;
    *p = 42;
    return 0;
}

编译并运行测试:

gcc -g -o test_crash test_crash.c
ulimit -c unlimited
./test_crash

检查是否在 /home/pc/coredump 目录下生成了 coredump 文件。

6.2 使用 gdb 分析 coredump

生成 coredump 后,可以使用 gdb 进行分析:

# 加载可执行文件和 coredump 文件
gdb ./test_crash /home/pc/coredump/core_test_crash_12345_1698765432

# 在 gdb 中查看堆栈信息
(gdb) bt
(gdb) info registers
(gdb) list

7. 常见问题与解决方案

7.1 问题:coredump 文件没有生成

可能原因和解决方案:

  1. 目录权限不足:确保 /home/pc/coredump 目录有写入权限
  2. 磁盘空间不足:检查磁盘使用情况 df -h
  3. apport 服务冲突:确认 apport 已禁用
  4. 进程 ulimit 限制:确保运行进程的 shell 设置了 ulimit -c unlimited

7.2 问题:SUID 程序不生成 coredump

解决方案:

  • 确认 fs.suid_dumpable 设置为 2
  • 检查程序的文件权限和所有者
  • 查看系统日志 dmesg | tail -20 获取更多信息

7.3 问题:coredump 文件过大

优化方案:

  1. 使用压缩格式存储:
    kernel.core_pattern=|/usr/bin/gzip -c > /home/pc/coredump/core_%e_%p_%t.gz
    
  2. 设置大小限制(单位为 KB):
    ulimit -c 1024000  # 限制为 1GB
    

8. 进阶配置

8.1 使用 systemd-coredump

对于使用 systemd 的系统,可以配置 systemd-coredump 服务:

# 编辑 systemd-coredump 配置
sudo nano /etc/systemd/coredump.conf

# 修改以下配置
[Coredump]
Storage=external
Compress=yes
ProcessSizeMax=2G
ExternalSizeMax=2G

8.2 自动化清理脚本

创建定期清理旧 coredump 文件的脚本:

#!/bin/bash
# cleanup_old_coredumps.sh
COREDUMP_DIR="/home/pc/coredump"
RETENTION_DAYS=30

find "$COREDUMP_DIR" -name "core_*" -type f -mtime +$RETENTION_DAYS -delete
echo "$(date): Cleaned up old coredump files older than $RETENTION_DAYS days"

添加到 crontab 每周执行一次:

0 2 * * 0 /path/to/cleanup_old_coredumps.sh

9. 总结

通过本文的配置,您可以:

  1. ✅ 在指定目录生成格式化的 coredump 文件
  2. ✅ 支持 SUID 程序(如 Qt 应用)的 coredump 生成
  3. ✅ 确保系统重启后配置仍然有效
  4. ✅ 避免与系统默认的 apport 服务冲突
  5. ✅ 方便地分析和调试程序崩溃问题

这些配置特别适合开发环境、测试服务器和生产环境的故障排查。建议根据实际需求调整 coredump 文件的保留策略和存储路径。

10. 参考资料

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐