在GDB中运行应用程序,直到发生异常

Ank*_*thi 100 c++ debugging polymorphism gdb multicore

我正在研究多线程应用程序,我想使用GDB进行调试.

问题是,我的一个线程一直在消息中消失:

pure virtual method called
terminate called without an active exception
Abort
Run Code Online (Sandbox Code Playgroud)

我知道该消息的原因,但我不知道我的帖子在哪里发生.回溯真的很有帮助.

当我在GDB中运行我的应用程序时,每次线程暂停或恢复时它都会暂停.我希望我的应用程序继续正常运行,直到其中一个线程因该异常而死亡,此时所有内容都应该暂停,以便我可以获得回溯.

Dan*_*Dan 143

您可以尝试使用"catchpoint"(catch throw)来在生成异常的位置停止调试器.

以下摘录来自gdb手册介绍了catchpoint功能.


5.1.3设置捕获点

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

  • 抓住事件

    发生事件时停止.事件可以是以下任何一种:

    • 抛出C++异常.

    • 抓住

      捕获C++异常.

    • EXEC

      致电执行官.目前仅适用于HP-UX.

    • 叉子

      对fork的调用.目前仅适用于HP-UX.

    • vfork的

      打电话给vfork.目前仅适用于HP-UX.

    • 加载加载libname

      动态加载任何共享库,或加载库libname.目前仅适用于HP-UX.

    • 卸载卸载libname

      卸载任何动态加载的共享库,或卸载库libname.目前仅适用于HP-UX.

  • tcatch事件

    设置仅为一次停止启用的捕获点.捕获事件后第一次自动删除捕获点.

使用该info break命令列出当前的捕获点.

目前GDB中的C++异常处理(catch throw和catch catch)存在一些限制:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);
Run Code Online (Sandbox Code Playgroud)

有时catch不是调试异常处理的最佳方法:如果您需要确切地知道引发异常的位置,最好在调用异常处理程序之前停止,因为这样您可以在任何展开之前看到堆栈.如果在异常处理程序中设置断点,则可能不容易找出引发异常的位置.

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

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);
Run Code Online (Sandbox Code Playgroud)

要使调试器在任何堆栈展开之前捕获所有异常,请在__raise_exception上设置断点(请参阅断点;观察点和异常部分).

使用取决于id值的条件断点(请参阅断点条件部分),可以在引发特定异常时停止程序.当引发任何异常时,您可以使用多个条件断点来停止程序.

  • 您还可以指定要捕获的异常类型,例如“catch throw std::runtime_exception”。 (2认同)

sou*_*g78 9

只有下面的一个对我来说适用于 gdb 8.3:

break _Unwind_RaiseException
Run Code Online (Sandbox Code Playgroud)

“catch throw”或“break __cxx_throw”对我不起作用。


小智 7

FWIW,显然,在 gcc 4.1 中,适当的函数名称已更改,必须在此函数中设置断点。

__cxa_pure_virtual


Ste*_*lly 5

在__pure_virtual上设置断点