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

Gra*_*Guy 19 c++ gdb exception-handling exception

我刚刚开始使用c ++异常并想要正确使用它.我想到的是在捕获异常时生成某种回溯信息.最初我有类似于C++异常的Call-stack的想法,但最终发现它并不是很好.

我还阅读了如何在我的gcc C++应用程序崩溃时生成堆栈跟踪但不想为当前项目添加更多复杂性.因为,我只需要在调试模式下进行回溯,我希望我可以将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:)

pau*_*sm4 17

这个:

http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html

您可以使用catchpoints使调试器停止某些类型的程序事件,例如C++异常或加载共享库.使用catch命令设置捕获点.

所以答案应该是"是",它应该避免你引用的两个链接的问题.

如果有帮助请回复!就个人而言,我自己从未尝试过这个GDB功能:)

  • 是的:D似乎工作正常.现在我可以使用`catch throw`插入一个catchpoint.一旦抛出异常,我可以使用`backtrace`来获得完整的调用堆栈:D:D.非常感谢 (4认同)

amo*_*amo 5

评论中的答案摘要:

第一种方法(通过 paulsm4)。设置一个catch throw接球点,用于接球或catch catch接球!然后打电话backtrace

第二种方法(由 aschepler)设置一个断点__cxa_throw,然后backtrace

第 3 种方法(在 Qt Creator 中——如果您碰巧使用)您可以轻松地在 throw 或 catch 上设置断点!

使用Qt Creator调试器,好像设置断点__cxa_begin_catch也相当于catch catch