C++ 在GDB中运行应用程序,直到发生异常
我正在处理一个多线程应用程序,我想用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中运行我的应用程序时,每当线程挂起或恢复时,它都会暂停。我希望我的应用程序继续正常运行,直到其中一个线程因该异常而死亡,此时一切都应该停止,以便我可以获得回溯。
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正在侦听的信号或退出。即使为异常设置了捕获点,情况也是如此;在交互调用中禁用异常的捕获点
- 不能以交互方式引发异常
- 无法以交互方式安装异常处理程序
/* 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
。