core dump未生成需先检查ulimit -c是否为0、/proc/sys/kernel/core_pattern配置及权限;gdb调试需确保core与原二进制匹配且含调试符号,动态库路径正确。

core dump 文件没生成?先检查 ulimit 和系统配置
Linux 默认可能禁用 core dump,即使程序崩溃也不会留文件。最常见原因是 ulimit -c 被设为 0。
- 运行
ulimit -c查当前限制:输出0表示关闭,unlimited或具体数字(如1048576)才可能生成 - 临时开启:执行
ulimit -c unlimited(仅对当前 shell 及其子进程生效) - 永久生效需改配置:在
/etc/security/limits.conf加一行* soft core unlimited,或在 systemd 服务中设LimitCORE=infinity - 别漏掉内核参数:
/proc/sys/kernel/core_pattern决定 core 文件名和位置,默认是core,但若被改成|/usr/lib/systemd/systemd-coredump(常见于 systemd 发行版),则 core 不落地为文件,而是走 coredumpctl —— 这时得用coredumpctl dump提取
gdb 能直接加载 core 文件吗?得匹配原二进制和调试信息
就算有 core.xxx,gdb ./myapp core.xxx 报错“not in executable format”或找不到符号,大概率是二进制变了或没调试信息。
- 确保 gdb 加载的是**崩溃时运行的那个 exact 二进制**:重编译过、strip 过、甚至只是 relink 了,都可能导致栈帧无法解析
- 编译时必须带
-g(推荐-g -O0开发期;上线可保留-g但开优化,只要不strip) - 如果用
strip ./myapp清除了符号,gdb 就只剩地址,看不到函数名和变量 —— 即便有 core 也基本没法查 - 验证是否匹配:用
file ./myapp和file core.xxx看架构一致;再用readelf -n ./myapp | grep 'NT_PRSTATUS'确认它确实含核心寄存器信息
core_pattern 配置错了,core 文件去哪了?
很多同学搜不到 core 文件,不是没生成,是写到别的地方去了,或者被管道吞掉了。
- 查真实路径:
cat /proc/sys/kernel/core_pattern - 如果输出是
core或core.%e.%p这类纯文件名,core 会生成在**进程当前工作目录**(不是源码目录,也不是 home,是chdir()后的位置,常是 / 或 /tmp) - 如果含
/(如/var/crash/core.%e.%p),要确认该路径存在且进程有写权限(尤其 daemon 常以 nobody 运行) - 如果以
|开头(如|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h),core 不落地,systemd 会接管并存进二进制格式 —— 此时用coredumpctl list查记录,coredumpctl dump -o mycore ./myapp导出原始 core 文件
gdb 里看堆栈为什么全是 ?? ?注意符号和 shared library 路径
能打开 core,但 bt 显示一堆 ??,说明符号缺失或动态库没加载上。
- 先
info sharedlibrary:看 gdb 是否识别到所有 so,状态列显示Yes才表示符号已读入;若为No,说明路径不对或文件缺失 - so 路径必须和崩溃时一致:用
ldd ./myapp记下依赖路径,再在 gdb 里用set solib-search-path /path/to/libs或set sysroot /(若跨环境调试) - 如果 so 是 dlopen 加载的,且没带
RTLD_GLOBAL,gdb 可能无法自动关联符号 —— 此时手动add-symbol-file /path/to/libxxx.so 0x7ffff7bc0000(地址从info proc mappings里找) - 避免 strip system 库:
strip --strip-unneeded /lib/x86_64-linux-gnu/libc.so.6会导致所有基于它的 core 都丢 libc 符号,bt一跳就断
实际调试时,最耗时间的往往不是 crash 现场本身,而是花半小时发现 core 其实被 systemd 拦截了,或者 gdb 加载的是三天前编译的旧 binary。路径、权限、符号、时间戳——四个点缺一不可。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!









