gdb必须加载core dump文件才能定位段错误崩溃现场,仅运行gdb ./myapp后run无法获取完整调用栈;需确保ulimit -c unlimited、可执行文件带-g调试信息,且gdb ./myapp core正确加载匹配的core文件。

段错误发生后,GDB必须加载core dump才能定位
程序崩溃时只看到 Segmentation fault 而没有其他信息,说明没生成或没加载 core dump 文件。GDB 本身无法凭空还原崩溃现场——它需要两样东西:可执行文件(带 -g 编译) 和 core 文件。缺一不可。
常见错误现象:直接运行 gdb ./myapp 后 run,程序崩溃但 backtrace 显示不完整、函数名被裁成 ??,甚至栈帧为空。这是因为没启用 core dump,或者 core 文件没被生成。
- 先确认系统允许生成 core:
ulimit -c输出应为非零值;若为 0,执行ulimit -c unlimited - 编译时务必加
-g(推荐同时加-O0避免优化干扰行号):g++ -g -O0 -o myapp main.cpp - 运行触发崩溃后,检查当前目录是否生成了
core或类似core.1234的文件 - 用
gdb ./myapp core(不是gdb -c core)加载,这是唯一可靠方式
backtrace 显示 ?? 时,检查调试符号和路径一致性
backtrace 出现大量 ??,通常不是 GDB 问题,而是调试信息缺失或路径错位。核心原因是:你加载的 core 文件对应的是旧版本可执行文件,而当前 ./myapp 已被重新编译过,两者符号表不匹配。
另一个常见场景是程序依赖动态库(如 libxxx.so),而该库未编译带 -g,导致调用栈深入到库内部时无法解析函数名。
- 用
file ./myapp查看可执行文件是否包含调试信息(输出中应有with debug_info) - 用
readelf -S ./myapp | grep debug确认存在.debug_*段 - 如果 core 是由不同机器/不同构建环境产生的,
gdb可能找不到源码路径,此时可用set substitute-path /old/path /new/path修复 - 对第三方库,优先用系统包管理器安装带
-dbg或-debuginfo的调试包(如 Ubuntu 的libc6-dbg)
定位空指针/野指针,用 x 和 p 结合看内存地址
段错误绝大多数来自非法内存访问,backtrace 只告诉你“在哪崩”,不告诉你“为什么崩”。真正要确认是空指针、越界还是释放后使用,得手动查内存。
比如 backtrace 指向 foo.cpp:42 的 *ptr = 5;,这时不能只信 print ptr,因为指针可能非空但已失效。
- 先
print ptr:若输出$1 = 0x0,基本确认是空指针解引用 - 若输出类似
$1 = 0x7fffffabc000,再用x/1xb $1尝试读取该地址第一个字节——若报Cannot access memory at address ...,说明地址无效(野指针或已释放) - 结合
info proc mappings查看该地址是否落在合法内存映射区间内(如不在[heap]、[stack]或任何.so区域,则大概率非法) - 对疑似越界数组,用
print &arr[0]@10查看连续 10 个元素地址,对比ptr是否落在其中
用 watch 监控变量被改写,比单步更高效
有些段错误是“延迟触发”的:比如某个指针在 A 函数被意外置空,到 B 函数才解引用。手动单步从头跑效率极低,尤其在多线程或循环调用中。
watch 是硬件断点,只要目标内存被写入就立即中断,适合追踪“谁悄悄改了我的指针”。
- 在疑似出问题前的函数入口设断点,例如
break main,然后run - 停住后,对关键指针设观察点:
watch ptr(注意不是watch *ptr) - 执行
continue,GDB 会在任何修改ptr值的地方自动暂停,并显示修改它的代码行 - 若提示
Could not insert hardware watchpoint,说明目标变量不在内存中(如被优化进寄存器),此时加-O0重编译即可
段错误调试最易忽略的一点:别只盯着崩溃那一行。真正的问题往往发生在几十行甚至几个函数之前——比如 delete ptr 后没置 nullptr,或者 std::vector::data() 返回的指针在 vector 重分配后失效。GDB 提供的是证据链,不是结论;你需要用 backtrace 找位置,用 x/watch 找原因,用 info registers 和 info proc mappings 验证假设。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











