coredump未生成或为空,需依次检查core_pattern配置、apport/systemd-coredump服务状态、/var/crash或/var/lib/systemd/coredump权限、ulimit -c值、ptrace_scope设置及seccomp限制。

coredump 文件为空或根本没生成?先检查 /proc/sys/kernel/core_pattern
系统是否真正把 core dump 转交给了 apport 或 systemd-coredump,取决于这个内核参数。如果它被设成空、none,或指向一个不可写的路径,那必然看不到有效 core 文件。
运行 cat /proc/sys/kernel/core_pattern 查看当前值:
- 如果是
|/usr/share/apport/apport %p %s %c %d %P,说明走 apport;确认/usr/share/apport/apport存在且可执行,且apport服务已启用(sudo systemctl status apport) - 如果是
core或core.%p等纯文件名,说明内核尝试直接写本地文件——此时要检查当前工作目录权限、磁盘空间、ulimit -c是否为 0 - 如果是
|/lib/systemd/systemd-coredump %P %u %g %s %t %c %h,说明走 systemd;但若systemd-coredump二进制缺失或systemd-coredump.socket未激活,管道会静默失败
apport 不保存 core 文件?确认 /var/crash/ 权限与 apport 配置
apport 默认不落盘原始 core,只保存压缩的 .crash 报告(含堆栈、环境等),除非显式开启:core_dump = 1。该配置不在主配置文件里,而在 /etc/apport/crashdb.conf 的 problem_types 下,或更常见的是通过 /etc/apport/settings 控制。
检查并修正以下几点:
-
sudo mkdir -p /var/crash && sudo chown root:root /var/crash && sudo chmod 1777 /var/crash(注意是1777,不是755) - 确保
/etc/apport/settings中有enabled=1,且没有core_dump=0这类覆盖项 - 触发 crash 后,立刻查
sudo journalctl -u apport --since "1 minute ago",看是否有Failed to write core dump或Permission denied
systemd-coredump 显示 “No coredumps found”?验证 socket 激活与存储路径
systemd-coredump 不是常驻进程,靠 systemd-coredump.socket 监听 /proc/sys/kernel/core_pattern 指定的管道。如果 socket 没启动,内核发来的数据就直接丢弃,无日志、无报错。
必须执行:
-
sudo systemctl enable --now systemd-coredump.socket(仅启用 service 不起作用) -
sudo mkdir -p /var/lib/systemd/coredump并确保属主为root:root、权限为0755 - 用
coredumpctl list查不到内容时,别急着怀疑程序,先跑sudo coredumpctl dump -o /tmp/test.core $(pidof your_app)看是否能手动提取——这能绕过信号捕获阶段,验证后端是否正常 - 注意:默认
Storage=external会把 core 存到/var/lib/systemd/coredump/;若设成none或journal,则不落盘
ulimit、ptrace_scope、seccomp 共同导致 core dump 被静默拦截
即使配置全对,以下三者任一不满足,都会让进程 crash 后不产生 core:
-
ulimit -c必须非 0(建议临时设为unlimited测试);注意 shell 启动子进程时继承的是当时值,不是全局策略 -
/proc/sys/kernel/yama/ptrace_scope若为2(默认 Ubuntu),会阻止非子进程的 core dump 捕获;测试时可临时设为0:echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope - 使用
docker run或podman时,容器默认启用 seccomp profile,屏蔽sys_ptrace,导致systemd-coredump无法 attach;需加--security-opt seccomp=unconfined或自定义 profile
最易被忽略的是:某些发行版(如 Ubuntu 22.04+)在 /etc/security/limits.conf 里把 * soft core 0 写死了,即便你在终端里 ulimit -c unlimited,新启动的 GUI 应用或 systemd user session 仍受限制。








