You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:30:57