gdb允许在抛出异常和捕获异常时捕获异常。但有时抛出异常的行没有符号,或者在异常处理期间触发断点。如何检查当前异常的值?
发布于 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上设置断点(请参阅断点、观察点和异常)。
也就是说
这取决于代码和您在堆栈中的位置。如果您实际捕获了异常,如下所示:
try { .... } catch (std::exception &e) {
//do stuff
}您可以尝试打印e.what(),或者查看异常的成员。如果你只是把它当做(...)那我就不确定你能收集到什么。
你可以做的另一件处理事情是在gdb中捕获“抛出”,如果你真的想跟踪整个流程,也可以捕获“catch”。
gdb> catch catch
gdb> catch throw这样,您将在抛出异常之前获得断点,并在捕获到它们时正确地获取断点,然后您可以遍历堆栈以获得有关发生了什么的更多信息。即使您处于另一个断点,您也应该能够向上遍历堆栈(使用向上或向下),以获得其中异常可见的帧。
https://stackoverflow.com/questions/16313227
复制相似问题