首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用gdb获取C++中当前异常的值和类型?

如何使用gdb获取C++中当前异常的值和类型?
EN

Stack Overflow用户
提问于 2013-05-01 13:29:36
回答 3查看 12.7K关注 0票数 33

gdb允许在抛出异常和捕获异常时捕获异常。但有时抛出异常的行没有符号,或者在异常处理期间触发断点。如何检查当前异常的值?

EN

Stack Overflow用户

发布于 2013-05-02 02:28:36

已更新

以下是GDB手册中的一些信息

目前在gdb中对C++异常处理(catch throw和catch catch)有一些限制:

如果以交互方式调用函数,gdb通常会在函数执行完毕后将控制权返回给您。但是,如果调用引发异常,则调用可能会绕过将控制权返回给您的机制,并导致程序中止或简单地继续运行,直到到达断点、捕获gdb正在侦听的信号或退出。即使为异常设置了catchpoint,情况也是如此;在交互式调用中禁用异常的catchpoint。您不能以交互方式引发异常。不能以交互方式安装异常处理程序。有时,catch不是调试异常处理的最佳方法:如果您需要确切地知道异常在何处引发,最好在调用异常处理程序之前停止,因为这样您就可以在任何展开发生之前看到堆栈。如果改为在异常处理程序中设置断点,则可能不容易找出异常引发的位置。

要在调用异常处理程序之前停止,您需要对实现有一些了解。在gnu C++的情况下,通过调用名为__raise_exception的库函数引发异常,该库函数具有以下ANSI接口:

/*地址是存储异常标识符的位置。id是异常标识符。*/ void __raise_exception (void **addr,void *id);为了使调试器在任何堆栈展开发生之前捕获所有异常,

在__raise_exception上设置断点(请参阅断点、观察点和异常)。

也就是说

这取决于代码和您在堆栈中的位置。如果您实际捕获了异常,如下所示:

代码语言:javascript
复制
try { .... } catch (std::exception &e) {
   //do stuff
}

您可以尝试打印e.what(),或者查看异常的成员。如果你只是把它当做(...)那我就不确定你能收集到什么。

你可以做的另一件处理事情是在gdb中捕获“抛出”,如果你真的想跟踪整个流程,也可以捕获“catch”。

代码语言:javascript
复制
gdb> catch catch  
gdb> catch throw

这样,您将在抛出异常之前获得断点,并在捕获到它们时正确地获取断点,然后您可以遍历堆栈以获得有关发生了什么的更多信息。即使您处于另一个断点,您也应该能够向上遍历堆栈(使用向上或向下),以获得其中异常可见的帧。

票数 8
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16313227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档