我正在研究多线程应用程序,我想使用GDB进行调试。
问题是,我的一个线程一直在消息:
pure virtual method called
terminate called without an active exception
Abort
我知道该消息的原因,但我不知道我的帖子在哪里发生。回溯真的很有帮助。
当我在GDB中运行我的应用程序时,每次线程暂停或恢复时它都会暂停。我希望我的应用程序继续正常运行,直到其中一个线程因该异常而死,此时所有内容都应该暂停,以便我可以获得回溯。
答案 0 :(得分:140)
您可以尝试使用“catchpoint”(catch throw
)在生成异常的位置停止调试器。
以下excerpt来自gdb手册介绍了catchpoint功能。
5.1.3设置捕获点
您可以使用catchpoints使调试器停止某些类型的程序事件,例如C ++异常或加载共享库。使用catch命令设置一个catchpoint。
抓住事件
发生事件时停止。事件可以是以下任何一种:
掷
抛出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的值,可以在引发特定异常时停止程序。当引发任何异常时,您可以使用多个条件断点来停止程序。
答案 1 :(得分:5)
在__pure_virtual
上设置断点答案 2 :(得分:4)
FWIW,显然,在gcc 4.1中,相应的函数名已经改变,必须在此函数中设置一个断点。
__ cxa_pure_virtual
答案 3 :(得分:2)
只有以下一种适用于我的gdb 8.3:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link href="positioningTrial.css" type="text/css" rel="stylesheet" />
</head>
<body>
<div id="seperate">
<div class="inside">
<h1>hello</h1>
</div>
<div class="inside">
</div>
</div>
<!-- ------------------------------------------------------------------------------------------- -->
<div id="main-cont">
<div class="row">
<div class="left">
<h1>hello</h1>
</div>
<div class="middle"></div>
<div class="right"></div>
</div>
<div class="row">
<div class="left"></div>
<div class="middle"></div>
<div class="right"></div>
</div>
<div class="row">
<div class="left"></div>
<div class="middle"></div>
<div class="right"></div>
</div>
<div class="row">
<div class="left"></div>
<div class="middle"></div>
<div class="right"></div>
</div>
</div>
</body>
</html>
h1,
p {
padding: 0;
margin: 0;
}
#seperate {
border: 1px solid red;
height: 10vw;
width: 400px;
text-align: center;
margin-bottom: 5px;
}
.inside {
display: inline-block;
border: 1px solid red;
height: 100%;
width: 40%;
}
/* ---------------------------------------------- */
#main-cont {
width: 100vw;
height: 100vh;
border: 3px solid blue;
text-align: center;
}
.row {
width: 100%;
height: 20%;
border: 3px solid #ff0000;
}
.left,
.middle,
.right {
display: inline-block;
width: 20%;
height: 100%;
border: 2px solid black;
}
.left {
}
.middle {
width: 40%;
}
.right {
}
/* --------------------------------------------- */
[1]: https://i.stack.imgur.com/nGHtm.jpg
“接球”或“击破__cxx_throw”对我不起作用。