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

C++ 在GDB中运行应用程序,直到发生异常,c++,debugging,gdb,polymorphism,multicore,C++,Debugging,Gdb,Polymorphism,Multicore,我正在处理一个多线程应用程序,我想用GDB调试它 问题是,我的一个线程一直随着消息而消亡: pure virtual method called terminate called without an active exception Abort 我知道该消息的原因,但我不知道它发生在我的线程中的什么地方。回溯真的很有帮助 当我在GDB中运行我的应用程序时,每当线程挂起或恢复时,它都会暂停。我希望我的应用程序继续正常运行,直到其中一个线程因该异常而死亡,此时一切都应该停止,以便我可以获得回溯。

我正在处理一个多线程应用程序,我想用GDB调试它

问题是,我的一个线程一直随着消息而消亡:

pure virtual method called
terminate called without an active exception
Abort
我知道该消息的原因,但我不知道它发生在我的线程中的什么地方。回溯真的很有帮助


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

在纯虚拟上设置一个断点。

您可以尝试使用“捕获点”(
捕获抛出
)在生成异常的点停止调试器

gdb手册中的以下内容介绍了catchpoint功能


5.1.3设置捕集点

可以使用C驱赶点来导致调试器停止某些类型的程序事件,例如C++异常或加载共享库。使用catch命令设置捕捉点

  • 捕捉事件

    事件发生时停止。事件可以是以下任一事件:

    • 抛出C++异常.

    • 抓住

      C++异常的捕获. < /P>

    • 执行官

      给执行官的电话。这目前仅适用于HP-UX

    • 叉子

      呼叫fork。这目前仅适用于HP-UX

    • 工作

      对vWork的调用。这目前仅适用于HP-UX

    • 加载或加载libname

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

    • 卸载或卸载libname

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

  • tcatch事件

    设置仅为一个停止启用的捕捉点。首次捕获事件后,将自动删除捕获点

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

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

  • 如果以交互方式调用函数,GDB通常会在函数完成执行后将控制权返回给您。但是,如果调用引发异常,则该调用可能会绕过将控制权返回给您的机制,并导致您的程序中止或继续运行,直到它遇到断点、捕获GDB正在侦听的信号或退出。即使为异常设置了捕获点,情况也是如此;在交互调用中禁用异常的捕获点

  • 不能以交互方式引发异常

  • 无法以交互方式安装异常处理程序

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

要在调用异常处理程序之前停止,需要了解一些实现知识。在GNU C++的情况下,调用一个名为“y-RaSeeAuxExchange”的库函数来引发异常,该函数具有以下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值的条件断点(请参阅“分段条件”),您可以在引发特定异常时停止程序。当引发多个异常中的任何一个时,可以使用多个条件断点来停止程序

FWIW,显然,在GCC4.1中,相应的函数名已更改,必须在此函数中设置断点


__cxa_pure_virtual

只有下面一个适合我使用gdb 8.3:

break _Unwind_RaiseException

“抓球”或“断球”对我不起作用。

GDB暂停时会报告什么信号?您应该能够在@JeffreyHill answer中运行类似于
handle SIGUSR1 pass noprint nostop
的命令,它现在被称为uuuucxa\upure\uvirtual。我不知道如何检查自己,所以我不想编辑答案。我不打算否决投票,但现在答案可能是错误的,应该由知道正确答案的人编辑。您还可以指定要捕获的异常类型,例如
catch throw std::runtime\u exception