我刚刚开始使用c ++异常并想要正确使用它。我想到的是在捕获异常时生成某种回溯信息。最初我有类似于Call-stack for exceptions in C++的想法,但最终发现它并不是很好。
我还阅读了How to generate a stacktrace when my gcc C++ app crashes,但不想为我当前的项目增加更多的复杂性。因为,我只需要在调试模式下进行回溯,我希望我可以为此目的使用gdb。
我的策略是在catch
块中插入断点,然后通过调用堆栈来准确找出为什么首先抛出异常(或导致它的原因)?不幸的是,我似乎无法做到这一点,因为当gdb到达断点时,它会清除调用堆栈,我只能看到main(这就是我捕获的地方)。这应该发生还是我在这里做错了什么?
修改 我只想总结一下其他人的方法:
第一种方法(由paulsm4提供)。通过catch throw
设置一个捕获点用于捕获,或者catch catch
用于捕获捕获!然后拨打backtrace
第二种方法(由aschepler提供)在__cxa_throw
然后backtrace
第三种方法(在Qt Creator中 - 如果你碰巧使用的话)你可以在throw或catch上轻松设置一个断点!
Edit_2:使用Qt Creator调试器,似乎在__cxa_begin_catch
上设置断点也等同于catch catch
:)
答案 0 :(得分:17)
这个:
http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
您可以使用catchpoints使调试器停止运行 各种程序事件,例如C ++异常或加载a 共享库。使用catch命令设置一个catchpoint。
所以答案应该是“是”,它应该避免你引用的两个链接的问题。
如果有帮助请回复!就个人而言,我自己从未尝试过这个GDB功能:)
答案 1 :(得分:1)
评论的答案摘要:
第一种方法(由paulsm4提供)。通过catch throw
设置一个捕获点用于捕获,或者catch catch
用于捕获捕获!然后拨打backtrace
第二种方法(由aschepler提供)在__cxa_throw
然后backtrace
第三种方法(在Qt Creator中 - 如果你碰巧使用的话)你可以在throw或catch上轻松设置一个断点!
使用Qt Creator调试器,似乎在__cxa_begin_catch
上设置断点也等同于catch catch