23

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

4

2 回答 2

19

这个:

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

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

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

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

于 2012-05-15T00:04:36.223 回答
5

评论中的答案摘要:

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

第二种方法(通过 aschepler)设置断点__cxa_throw,然后backtrace

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

使用 Qt Creator 调试器,似乎设置断点 on__cxa_begin_catch也相当于catch catch

于 2015-02-11T20:34:59.727 回答