coredump写不到指定目录主因是core_pattern配置及目录权限问题:需检查/proc/sys/kernel/core_pattern,确保路径父目录存在且权限为1777,若用管道则需确认接收服务运行正常。

coredump 文件写不到指定目录?先检查 /proc/sys/kernel/core_pattern
Linux 内核把 core 文件往哪写,完全由 core_pattern 控制,不是靠 ulimit -c 或目录权限就能决定的。默认值通常是 core,意味着只在进程当前工作目录生成,且容易被权限或磁盘空间拦住。
- 用
cat /proc/sys/kernel/core_pattern看当前设置;想持久化修改,得写进/etc/sysctl.conf(如kernel.core_pattern=/var/crash/core.%e.%p.%t) - 如果路径含目录(比如
/var/crash/),内核**不会自动创建父目录**,必须提前mkdir -p /var/crash && chmod 1777 /var/crash(注意:1777 是必须的,否则内核拒绝写入) - 若
core_pattern以|开头(如|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %e %p),说明走用户态处理器,此时要确保对应服务(如systemd-coredump)已启用且可执行
ulimit -c 设置了 0 却还是没 core?确认 shell 会话和子进程继承关系
ulimit -c 是 per-process 的软限制,只对当前 shell 及其直接 fork 的子进程生效。它不跨登录会话、不进 systemd 服务、不进 cron,更不会影响已运行的守护进程。
- 在目标环境中(比如 ssh 进去的终端)运行
ulimit -c,确认输出不是0;设为无限制用ulimit -c unlimited - 如果是 systemd 服务,必须在 unit 文件里加
LimitCORE=infinity,光改 shell 的 ulimit 没用 - 某些发行版(如 RHEL/CentOS 8+)默认启用
fs.suid_dumpable = 0,导致 setuid 程序(如 sudo、passwd)即使 ulimit 允许也禁止生成 core —— 需手动设为1或2
core 文件生成了但内容为空或截断?检查 /proc/sys/kernel/core_pipe_limit 和内存布局
当 core_pattern 指向管道(|)时,内核会把 core 数据喂给管道另一端进程。如果接收方卡住、退出太快或缓冲区溢出,就会丢数据甚至让整个 dump 失败。
- 查看当前管道缓冲上限:
cat /proc/sys/kernel/core_pipe_limit,默认是 0(不限),但如果设成了小值(如 1),多进程并发 crash 时后到的会被丢弃 - 某些程序(尤其是启用了
memlock限制或使用大页内存的)可能因 VMA 标记(如VM_DONTDUMP)跳过部分内存段,导致 core 看似“不全”——这不是配置问题,是程序自己要求的 - 用
readelf -l core | grep LOAD看实际加载的 segment 数量,再对比原 binary 的readelf -l /path/to/binary,能快速判断是否缺段
systemd-coredump 不记录 Rust/Go 程序?注意信号处理和栈展开兼容性
systemd-coredump 依赖 libdw(来自 elfutils)做符号解析和栈回溯,而 Rust/Go 默认不生成标准 DWARF 调试信息,或使用自定义栈结构,导致 coredump 工具无法正确解析调用栈。
- Rust 编译时加
debug = true到Cargo.toml的[profile.dev]或用cargo build --debug,确保生成.debug_*section - Go 程序需禁用内联和优化:
go build -gcflags="all=-N -l",否则 runtime.stack() 和 coredump 解析都会失效 - 即便有调试信息,Go 的 goroutine 栈、Rust 的 async state 也不会出现在传统 backtrace 中——这不是 bug,是语言运行时模型决定的
真正麻烦的从来不是改几个 sysctl,而是搞清哪一层在拦截:是内核拒绝写目录,是 systemd 覆盖了 ulimit,还是语言运行时主动绕过了信号处理。每一步都得用 strace -e trace=rt_sigprocmask,prctl,openat 配合 cat /proc/PID/status | grep -i core 实锤,别猜。

















