c ++ - 在GDB中运行应用程序直到发生异常

我正在处理多线程应用程序,我想使用GDB进行调试。

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

pure virtual method called
terminate called without an active exception
Abort

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

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

Ankur Sethi asked 2019-08-13T02:47:34Z
3个解决方案
137 votes

您可以尝试使用" catchpoint" (info break)在生成异常的位置停止调试器。

以下摘录来自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)存在一些限制:

* If you call a function interactively, GDB normally returns control to you when the function has finished executing. If the call raises an exception, however, the call may bypass the mechanism that returns control to you and cause your program either to abort or to simply continue running until it hits a breakpoint, catches a signal that GDB is listening for, or exits. This is the case even if you set a catchpoint for the exception; catchpoints on exceptions are disabled within interactive calls.

* You cannot raise an exception interactively.

* You cannot install an exception handler interactively. 

有时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);

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

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

Dan answered 2019-08-13T02:50:55Z
5 votes

在__pure_virtual上设置断点

Steve Folly answered 2019-08-13T02:51:19Z
3 votes

FWIW,显然,在gcc 4.1中,相应的函数名已经改变,并且必须在此函数中设置断点。

__cxa_pure_virtual

Jeffrey Hill answered 2019-08-13T02:51:51Z
translate from https://stackoverflow.com:/questions/1115428/run-an-application-in-gdb-until-an-exception-occurs