首页 > 运维 > linux运维 > 正文

如何在Linux中核心转储 Linux core dump配置

P粉602998670
发布: 2025-09-08 10:22:02
原创
879人浏览过
答案是配置Linux核心转储需设置ulimit -c和core_pattern。首先通过ulimit -c unlimited设置核心文件大小限制,再配置/proc/sys/kernel/core_pattern定义存储路径与命名规则,如/var/coredumps/core.%e.%p.%t,并确保目录存在且有写权限。排查常见问题包括检查进程的ulimit限制、目录权限、磁盘空间及systemd-coredump干扰。分析时使用gdb加载带调试符号的可执行文件和core文件,定位崩溃原因。

如何在linux中核心转储 linux core dump配置

Linux核心转储,或者我们常说的core dump,本质上就是当一个程序意外崩溃时,操作系统会把这个程序当时的内存状态(包括寄存器信息、堆栈、内存映射等)保存到一个文件中。配置它,主要是通过调整

ulimit -c
登录后复制
来控制是否生成以及生成多大的文件,再配合
/proc/sys/kernel/core_pattern
登录后复制
来定义这些文件会存放在哪里,以及它们的名字怎么取。这玩意儿对于我们排查那些只在生产环境复现、难以调试的疑难杂症,简直是救命稻草。

要让Linux在程序崩溃时乖乖地把核心转储文件吐出来,主要得搞定两件事:权限和路径。

首先是权限问题,这由

ulimit -c
登录后复制
来控制。这个命令决定了核心转储文件的大小上限。如果设为0,那程序崩了也不会有core文件。

  • 临时设置: 在当前shell会话中,你可以直接运行
    ulimit -c unlimited
    登录后复制
    (不限制大小)或者
    ulimit -c 102400
    登录后复制
    (限制为100MB)。这种设置只对当前shell及其子进程有效,shell一关,就没了。
  • 永久设置: 对于生产环境的服务,我们需要它长期有效。通常是在
    /etc/security/limits.conf
    登录后复制
    文件中添加配置。
    # 示例:允许所有用户生成无限大小的core文件
    *    soft    core    unlimited
    *    hard    core    unlimited
    登录后复制

    这里的

    soft
    登录后复制
    是软限制,
    hard
    登录后复制
    是硬限制。一般我们会把两者都设为
    unlimited
    登录后复制
    ,或者一个足够大的值。改完这个文件,用户需要重新登录才会生效。对于系统服务,可能需要重启服务甚至整个系统。

接着是核心转储文件的存放路径和命名规则,这由

/proc/sys/kernel/core_pattern
登录后复制
这个内核参数决定。

  • 查看当前设置:
    cat /proc/sys/kernel/core_pattern
    登录后复制
  • 临时设置:
    echo "/var/coredumps/core.%e.%p.%t" > /proc/sys/kernel/core_pattern
    登录后复制
    这个例子中,core文件会生成在
    /var/coredumps/
    登录后复制
    目录下,文件名会包含:
    • %e
      登录后复制
      : 可执行文件名
    • %p
      登录后复制
      : 进程ID
    • %t
      登录后复制
      : 时间戳
    • 其他有用的占位符还有
      %u
      登录后复制
      (UID),
      %g
      登录后复制
      (GID),
      %h
      登录后复制
      (主机名),
      %s
      登录后复制
      (信号编号) 等。
  • 永久设置: 修改
    /etc/sysctl.conf
    登录后复制
    文件,添加一行:
    kernel.core_pattern = /var/coredumps/core.%e.%p.%t
    登录后复制

    然后运行

    sysctl -p
    登录后复制
    使配置立即生效。记得,你指定的目录(比如
    /var/coredumps/
    登录后复制
    )必须存在,并且进程要有写入权限。否则,即使
    ulimit -c
    登录后复制
    设对了,core文件也生成不出来。我个人习惯会先
    mkdir -p /var/coredumps && chmod 777 /var/coredumps
    登录后复制
    (或者更严格的权限)来确保万无一失。

    百度文心百中
    百度文心百中

    百度大模型语义搜索体验中心

    百度文心百中22
    查看详情 百度文心百中

为什么我的Linux核心转储没有生成?常见原因与排查方法

这绝对是我在实际工作中遇到最多的问题之一。明明感觉一切都配置好了,程序一崩,core文件却不见踪影,那种抓狂的感觉你懂的。这里我总结了一些常见原因和排查思路,希望能帮你少走弯路。

一个很常见的情况是,

ulimit -c
登录后复制
压根就没生效。你可能在某个配置文件里改了,但服务启动时并没有加载到这个配置。你可以用
cat /proc/<PID>/limits
登录后复制
来查看特定进程的实际
ulimit
登录后复制
设置。如果
Max core file size
登录后复制
是0,那肯定没戏。 另一个大头是核心转储文件的路径问题。
/proc/sys/kernel/core_pattern
登录后复制
指向的目录不存在,或者进程没有写入权限,这都是致命的。我经常会忘记创建目录或者给错权限。一个简单的测试方法是,手动创建一个文件看看能不能成功,比如
sudo -u <运行程序的用户> touch /var/coredumps/test_file
登录后复制
。如果不行,那问题就出在这。

还有一些不那么显眼但同样重要的点:

  • 磁盘空间不足: 如果你的分区快满了,系统可能就没法写入巨大的core文件了。这虽然听起来很基础,但真的会发生。
  • 程序本身的问题: 有些程序在崩溃时会自己处理信号,或者在退出前执行清理操作,这可能会阻止系统生成core文件。虽然不常见,但值得留意。
  • 内核参数
    coredump_filter
    登录后复制
    这是一个比较高级的设置,位于
    /proc/<PID>/coredump_filter
    登录后复制
    。它控制了哪些内存区域会被包含在core文件中。默认情况下,通常是包含所有可写的私有匿名映射和共享内存。如果你或者某个系统工具修改了它,可能会导致core文件内容不完整甚至不生成。
  • systemd-coredump
    登录后复制
    在一些现代Linux发行版(如CentOS 7+, Ubuntu 16.04+)中,
    systemd
    登录后复制
    接管了核心转储的处理。它会将core文件压缩并存储在
    /var/lib/systemd/coredump/
    登录后复制
    目录下,并且需要用
    coredumpctl
    登录后复制
    命令来查看和提取。如果你发现
    core_pattern
    登录后复制
    被设置成了类似
    |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
    登录后复制
    这样的管道命令,那就说明
    systemd-coredump
    登录后复制
    在工作。这时候,传统的
    ulimit
    登录后复制
    core_pattern
    登录后复制
    只是触发机制,实际处理逻辑在
    systemd
    登录后复制
    那边。

为了快速验证配置是否生效,你可以尝试让一个简单的C程序崩溃:

// crash.c
#include <stdio.h>
int main() {
    int *p = 0;
    *p = 1; // 尝试写入空指针,导致段错误
    return 0;
}
登录后复制

编译:

gcc -g crash.c -o crash
登录后复制
运行:
./crash
登录后复制
如果配置正确,你应该能在指定目录找到core文件。

如何分析Linux核心转储文件?常用工具与基本步骤

拿到core文件只是第一步,关键在于如何从中提取有用的信息。这就像医生拿到X光片,得会看才行。在Linux下,

gdb
登录后复制
(GNU Debugger)无疑是分析core文件的瑞士军刀。

分析core文件的基本流程是这样的:

  1. 准备好可执行程序和调试符号: 这是最最关键的一步。在编译你的程序时,一定要加上
    -g
    登录后复制
    选项,这样编译器会把调试信息(比如变量名、函数名、行号等)嵌入到可执行文件里。如果没有调试符号,
    gdb
    登录后复制
    也能打开core文件,但你看到的会是汇编代码和内存地址,那分析难度就指数级上升了。
    # 编译时加上-g
    gcc -g my_program.c -o my_program
    登录后复制
  2. 启动
    gdb
    登录后复制
    并加载core文件:
    gdb <你的可执行程序> <core文件路径>
    # 示例:gdb ./my_program /var/cored
    登录后复制

以上就是如何在Linux中核心转储 Linux core dump配置的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号