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

GDB调试catch块时无法打印std::exception对象问题求助

问题:GDB无法打印catch块中的异常对象ex

我的程序会执行到第50行的catch代码块,想使用GDB调试其中的异常对象,相关代码及操作如下:

// main.cpp

try {
  ...
} catch (std::exception& ex) { // line 50
  ...
}
(gdb) b main.cpp:50

程序命中该行后,打印ex对象及调用ex.what()均报错:

(gdb) p ex
No symbol "ex" in current context.

(gdb) p ex.what()
No symbol "ex" in current context.

其他变量可正常打印,但ex无法打印,请问如何实现该变量的打印?


解决方法
  • 调整断点位置到catch块内部
    断点打在catch声明行(line50)时,异常对象ex还未完成绑定,GDB上下文里找不到该符号。把断点移到catch块内的第一行代码上,比如如果catch块内第一行是line51,执行:

    (gdb) b main.cpp:51
    

    程序停在此处时,ex已完成初始化,可正常执行p ex或p ex.what()。

  • 使用catch throw命令捕获异常抛出点
    执行GDB命令:

    (gdb) catch throw
    

    程序会在任何异常抛出时自动中断,此时可以直接查看抛出的异常对象:

    (gdb) p $_exception
    (gdb) call $_exception.what()
    

    之后执行continue就能让程序走到catch块,此时ex也能正常访问。

  • 检查编译调试选项
    确保编译时添加了-g生成调试符号,且未开启过高优化(如-O2及以上可能会优化掉调试相关的符号)。建议用以下命令重新编译:

    g++ -g -O0 main.cpp -o main
    

内容的提问来源于stack exchange,提问作者ssssssleeeeee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:54:14