捕获异常时可以使用gdb进行回溯吗?

时间:2012-05-15 00:01:42

标签: c++ exception exception-handling gdb

我刚刚开始使用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:)

2 个答案:

答案 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