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值的条件断点(请参阅断点条件部分),可以在引发特定异常时停止程序.当引发任何异常时,您可以使用多个条件断点来停止程序.
只有下面的一个对我来说适用于 gdb 8.3:
break _Unwind_RaiseException
Run Code Online (Sandbox Code Playgroud)
“catch throw”或“break __cxx_throw”对我不起作用。
归档时间: |
|
查看次数: |
38864 次 |
最近记录: |