用gdb加载core dump文件直接执行gdb 即可,前提是二者严格匹配:可执行文件必须是生成该core的同一份未修改、未strip、未重编译的二进制;若提示“no symbol table loaded”或“not a core dump”,需检查路径、文件完整性(如file/readelf验证)、core_pattern配置及权限(ulimit -c、suid_dumpable等)。

怎么用GDB加载core dump文件
直接用 gdb <core></core> 即可加载,前提是两者匹配:可执行文件必须是生成该 core 的同一份二进制(未被修改、重编译或 strip 过)。如果看到 "No symbol table loaded" 或 "not a core dump: File format not recognized",大概率是路径错、文件不匹配,或 core 被截断。
- 确认 core 文件大小是否异常小(比如只有 0 字节或几 KB)——系统可能因
/proc/sys/kernel/core_pattern配置被重定向到管道或压缩程序,实际没落盘为普通文件 - 用
file <core></core>检查是否确实是 ELF core dump;用readelf -n <core></core>看能否解析 note section - 若程序是动态链接的,GDB 不需要目标机器环境,但符号表必须内嵌或可通过
debuginfo包补充(见下一条)
为什么GDB找不到函数名和行号
因为可执行文件被 strip 过,或调试信息存放在分离的 .debug 文件中。GDB 默认只从主 binary 读符号,不会自动找外部 debuginfo。
- Ubuntu/Debian 系统上,安装对应
xxx-dbgsym包(用apt install xxx-dbgsym),然后在 GDB 中执行set debug-file-directory /usr/lib/debug - CentOS/RHEL 系统用
debuginfo-install xxx(需启用debuginforepo),debuginfo 通常放在/usr/lib/debug/usr/bin/xxx - 自己编译时加
-g -O0(避免优化干扰栈帧),不要加-s或strip - 用
nm -C <binary> | grep main</binary>快速验证符号是否存在;objdump -t <binary> | head</binary>看是否有 .symtab
core dump里线程状态怎么看
用 info threads 列出所有线程,thread <n></n> 切换,bt 查看当前线程调用栈。注意:默认只显示当前线程,不是崩溃线程——崩溃线程通常标有 process xxx is executing 或在 info program 输出里注明 signal。
- 崩溃信号(如 SIGSEGV)会记录在 core 中,用
info program可看到类似It stopped with signal SIGSEGV, Address not mapped to object. - 多线程程序中,主线程不一定崩溃,
thread apply all bt能一次性打出所有线程栈,但输出可能很长,建议先用info threads定位疑似异常线程 - 如果
bt显示#0 0x0000... in ?? (),说明该帧缺少调试信息或栈已损坏,此时看寄存器(info registers)和内存(x/10i $pc)更可靠
常见误操作和权限陷阱
core 文件生成失败或 GDB 加载失败,80% 和权限与配置有关,和代码本身无关。
- 检查
ulimit -c是否为 0(表示禁用 core dump);临时开启用ulimit -c unlimited,但仅对当前 shell 及子进程有效 -
/proc/sys/kernel/core_pattern若以|开头(如|/usr/share/apport/apport %p %s %c %d %P),表示 core 被管道捕获,不会生成文件——改回普通路径如/tmp/core.%e.%p才能拿到文件 - core 文件权限受
/proc/sys/fs/suid_dumpable和进程 effective UID 影响;SUID 程序默认不生成 core,除非显式设置该值为 2 - 容器环境(如 Docker)中,需加
--ulimit core=-1:-1并挂载/proc/sys才能生效,否则即使宿主机开了,容器内仍为 0
真正麻烦的不是命令记不住,而是 core 文件和 binary 的构建环境稍有差异(比如用了不同版本的 libc 或编译器),GDB 就可能解析出错栈或错误寄存器值。动手前,先用 gdb --version 和 readelf -V <binary> | head</binary> 确认工具链兼容性,比反复重启程序更省时间。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











