ulimit -c unlimited只对当前终端生效,因为它是shell内置命令,仅影响当前进程及其直接子进程,不作用于systemd服务、cron作业等独立上下文;必须在service单元文件中配置limitcore=infinity才能使systemd服务生成core文件。

ulimit -c unlimited 为什么只对当前终端生效
因为 ulimit 是 shell 内置命令,它设置的是当前进程及其直接子进程的资源限制,不会穿透到 systemd 服务、cron 作业、守护进程或容器 init 进程里。你在一个终端里执行 ulimit -c unlimited,之后在该终端里运行的程序(比如 ./a.out)崩溃时能生成 core;但用 systemctl start myapp.service 启动的服务,哪怕同一用户,照样看不到 core 文件。
常见错误现象:测试程序在终端里崩了有 core,打包成 systemd service 后崩了却什么都没有。
- 验证方式:在服务里加一行
ExecStartPre=/bin/sh -c 'ulimit -c',看日志输出是不是 0 - 解决路径不是靠改 shell 配置,而是必须进 service unit 文件配
LimitCORE=infinity - 注意:systemd 的
LimitCORE值单位是字节,infinity才等价于unlimited,写0或空值都无效
kernel.core_pattern 路径权限不对会静默失败
内核写 core 文件前会检查目标目录是否存在、是否可写、是否带 sticky bit(即权限必须是 1777)。如果目录不存在,内核绝不会自动创建父级;如果权限是 755 或 777,写入直接失败,且不报错——你只会发现 core 没出现,dmesg 里也找不到明显线索。
典型场景:想把 core 存到 /var/crash/,但只执行了 sudo mkdir /var/crash,忘了 chmod 1777 /var/crash。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 检查命令:
ls -ld /var/crash,确认输出含drwxrwxrwt - 命名模板建议用
/var/crash/core.%e.%p.%t,其中%t是时间戳,避免同名覆盖 - 若
core_pattern以|开头(如|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h),说明系统启用了systemd-coredump,此时 core 不落地为文件,要用coredumpctl list或coredumpctl dump -o file.core <program></program>提取
gdb 分析 core 时 “No symbol table” 怎么办
这个提示不是 gdb 出错,而是你加载的可执行文件没带调试信息。gdb 只能显示汇编和寄存器,无法映射到源码行号,极大拖慢定位效率。
根本原因通常是编译时没加 -g,或者发行版默认剥离了符号(如 Ubuntu 的 strip 步骤)。
- 临时补救:用
file /path/to/binary看是否含with debug_info;若无,重新编译加gcc -g -O0 - 生产环境妥协方案:保留
.debug文件分离存储,用objcopy --only-keep-debug binary binary.debug,再在 gdb 中执行set debug-file-directory /path/to/debug - 注意:gdb 加载的 binary 必须和崩溃时完全一致(包括 build timestamp、链接选项),否则栈帧可能错位
systemd 服务和容器里配置 core dump 容易漏掉的点
这两类环境绕过了常规的 PAM limits 和 shell ulimit,必须显式声明,且顺序和位置很关键。
systemd 服务需在 [Service] 段落里写 LimitCORE=infinity,不能放在 [Unit] 或全局 system.conf 里;容器则依赖宿主机 kernel 参数 + 容器 runtime 配置双满足。
- systemd:确认 unit 文件中
LimitCORE=infinity后执行sudo systemctl daemon-reload && sudo systemctl restart xxx,否则不生效 - 容器:Docker 需加
--ulimit core=-1:-1;Podman 类似;同时宿主机的sysctl kernel.core_pattern必须指向容器内可写路径(如挂载的 volume),且该路径在容器内也要chmod 1777 - setuid 程序(如
sudo、ping)默认禁止 core dump,需额外设sysctl fs.suid_dumpable=2,否则即使其他条件全满足,也静默丢弃










