当前位置: 首页
系统平台
Linux系统中核心转储功能的完整配置步骤详解

Linux系统中核心转储功能的完整配置步骤详解

热心网友 时间:2026-07-09
转载

许多开发者在处理 Linux 核心转储(core dump)时,常遇到一个令人困惑的问题:明明在终端执行了ulimit -c unlimited,程序崩溃后却怎么也找不到 core 文件。这背后隐藏着多个容易被忽略的机制与细节,下面逐一深入剖析。

ulimit -c unlimited 为何只在当前终端生效

首先要澄清一个关键认知误区。ulimit -c本质上是 per-process 级别的软限制,仅影响当前 shell 会话以及从该 shell 直接 fork 出的子进程。换句话说,你在一个终端执行的命令,对另一个终端中的程序、系统服务或后台任务完全不起作用。

以下是几个典型的翻车场景:

  • 在桌面终端设置了ulimit -c unlimited,然后双击启动 GUI 程序——该程序并不会继承这个 shell 的配置。
  • 将脚本放入/etc/cron.d/中,崩溃后无 core 生成——因为 cron daemon 拥有独立的 ulimit 设置。
  • 使用systemctl start myapp.service启动服务,同样没有 core——systemd 的资源限制是隔离的,必须在 unit 文件中显式声明LimitCORE=infinity

最直接的验证方法:在你要运行程序的目标环境(如终端窗口、服务上下文)中,直接执行ulimit -c,输出必须为unlimited或一个具体数值,否则配置未生效。

/proc/sys/kernel/core_pattern 路径写入失败的三个硬性条件

内核在写入 core 文件前,会依次检查三道关卡,缺一不可。

第一,目标路径的父目录必须已存在,且权限为1777(sticky bit 加所有人可读写执行)。例如,若设置/var/crash/core.%e.%p.%t,需提前用sudo mkdir -p /var/crash && sudo chmod 1777 /var/crash创建。注意,755775均不满足要求。

第二,如果core_pattern|开头(如|/usr/lib/systemd/systemd-coredump %P %u),表示走用户态处理器。此时必须确保对应二进制文件可执行、有权限,且服务已启用——systemctl is-active systemd-coredump应返回active

第三,fs.suid_dumpable参数默认值为0,这意味着使用sudopasswd等 setuid 程序运行时,即使 ulimit 允许也会拒绝生成 core。必须显式改为2echo 2 | sudo tee /proc/sys/fs/suid_dumpable。这个细节最容易被忽视,很多 setuid 程序崩溃后无 core,最终排查发现就是这里卡住了。

systemd 服务如何开启 core dump

如果程序由 systemd 管理,前面提到的修改 ulimit 或/etc/security/limits.conf均无效。systemd 的资源限制体系完全独立于用户 shell。

正确做法是编辑服务的覆盖配置:

  • 执行sudo systemctl edit myapp.service
  • 填入:
    [Service]LimitCORE=infinity
  • 如果程序使用了大页内存或 memlock,可能还需额外添加MemoryLimit=infinityLockPages=false
  • 最后重载配置并重启:sudo systemctl daemon-reload && sudo systemctl restart myapp.service

但需注意,某些发行版(如 RHEL 8 及以上)默认禁用了LimitCORE,即使写入infinity也不一定生效。此时需用systemctl show myapp.service | grep LimitCORE确认实际值是否匹配。

core 文件生成了但内容为空或截断?

文件已生成但内容异常,这通常不是配置遗漏,而是管道传输或内存标记导致的静默数据丢失。

一种情况是当core_pattern指向管道(如|/usr/lib/systemd/systemd-coredump)时,/proc/sys/kernel/core_pipe_limit控制着缓冲区大小。默认值为0(不限),但若被人为改为小值(如1),多进程同时崩溃时,后续进程会被丢弃。

另一种情况是某些程序(尤其是开启了 memlock 或使用大页内存的)可能因 VMA 标记(如VM_DONTDUMP)跳过了部分内存段。这并非配置问题,而是程序自身要求。排查方法:用readelf -l core | grep LOAD查看实际加载的 segment 数量,再与原二进制文件的readelf -l /path/to/binary对比,即可快速判断是否缺段。

最后再次强调最容易被忽略的细节:setuid 程序必须配置fs.suid_dumpable=2,且该值不会持久保存。即使你在/etc/sysctl.conf中写入了,也需记得执行sysctl -p才能真正生效。

来源:https://www.php.cn/faq/2790516.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Win11无法启动应用程序?尝试重新安装修复

Win11无法启动应用程序?尝试重新安装修复

Windows11应用无法启动多因注册表信息损坏或配置错误,可通过系统设置中的应用修复或重置,使用PowerShell重注册UWP包,清除应用缓存与临时文件,更新运行时依赖组件,并重启WindowsInstaller服务解决,避免直接卸载重装。推荐按序尝试。

时间:2026-07-09 07:42
电脑提示由于找不到vcruntime140_1.dll报错的详细解决方法

电脑提示由于找不到vcruntime140_1.dll报错的详细解决方法

电脑提示缺少vcruntime140_1 dll因系统缺失VisualC++运行库。修复方法:按系统位数安装或修复微软VC++2015-2022运行库;检查杀毒软件隔离区恢复文件;以管理员身份运行sfc scannow和DISM命令修复系统文件。

时间:2026-07-09 07:42
银河麒麟下C语言编译器的安装与配置方法

银河麒麟下C语言编译器的安装与配置方法

在银河麒麟系统上安装C语言编译器,需根据系统架构与网络状态选择方式。在线环境:Debian系执行sudoapt-getinstallbuild-essential,RHEL Anolis系执行sudodnfgroupinstall "DevelopmentTools "。离线环境:从同版本机器下载依赖包,RPM包用sudorpm-ivh* rpm,DEB包用su

时间:2026-07-09 07:42
银河麒麟系统WPS无法插入公式的解决教程

银河麒麟系统WPS无法插入公式的解决教程

银河麒麟WPS公式编辑器修复需四步:赋予EqnEdit执行权限,安装libx11-6、libpng12-0依赖,关闭WPS进程后执行sudo kso--register重新注册,政务版还需在控制中心允许OLE调用或导入签名补丁。

时间:2026-07-09 07:41
麒麟系统设置自动清理缓存文件夹任务指南

麒麟系统设置自动清理缓存文件夹任务指南

麒麟系统支持三种自动清理缓存方案:通过cron与find定制用户级清理、利用systemd-tmpfiles轮转缓存目录、以及借助BleachBitCLI协同清理浏览器与系统缓存,可精准控制清理范围与周期,避免磁盘占满并防止误删关键缓存。

时间:2026-07-09 07:41
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜