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
相关产品推荐
相关产品推荐

