如何让GDB跟随C++异常的完整执行流程?
如何在GDB中追踪C++异常的完整执行流程
问题场景
我用g++ -g -O0 test.cpp编译以下C++代码:
#include <stdexcept> #include <iostream> int main() { int a = 2; try { throw std::runtime_error("Example"); a = 4; } catch (const std::exception &) { a = 5; } std::cout << a << std::endl; }
使用gdb ./a.out调试时,执行到抛出异常的代码行后,输入next或step命令不会进入a = 5所在的catch块,程序直接输出5并退出。我需要追踪异常的处理位置,GDB版本为GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1。
补充:已通过objdump -drwC -Mintel a.out确认二进制文件中仍保留异常逻辑,部分汇编如下:
objdump -drwC -Mintel a.out a.out: file format elf64-x86-64 Disassembly of section .init: 0000000000001000 <_init>: 1000: f3 0f 1e fa endbr64 1004: 48 83 ec 08 sub rsp,0x8 1008: 48 8b 05 d1 2f 00 00 mov rax,QWORD PTR [rip+0x2fd1] # 3fe0 <__gmon_start__@Base> 100f: 48 85 c0 test rax,rax 1012: 74 02 je 1016 <_init+0x16> 1014: ff d0 call rax 1016: 48 83 c4 08 add rsp,0x8 101a: c3 ret ...(其余汇编代码省略)
解决方案
1. 设置异常断点
GDB默认的next/step不会自动停在异常处理节点,需手动设置两类异常断点:
- 输入
catch throw:在任何C++异常抛出时触发断点。 - 输入
catch catch:在异常被捕获时触发断点。
设置完成后执行run启动程序,程序会先停在异常抛出位置,此时可通过step深入异常构造逻辑,或用continue跳转到异常捕获断点,即可进入catch块的a = 5代码行逐步调试。
2. 启用全局异常追踪
若希望每次调试自动追踪异常,可执行set exception-catchpoint on,该选项会让GDB自动为所有异常的抛出和捕获设置断点,无需每次手动输入上述命令。
3. 关键验证
你已经使用-g -O0编译,确保了调试信息完整且无优化干扰,这是正确的前提,避免因编译优化导致调试流程异常。
内容的提问来源于stack exchange,提问作者Raven
相关产品推荐
相关产品推荐

