C++ 多线程C程序中assert on上的gdb断点
我正在使用C++ 多线程C程序中assert on上的gdb断点,c++,multithreading,gdb,C++,Multithreading,Gdb,我正在使用中的assert检查我的多线程C++11程序中的不变量。当断言失败时,我希望能够检查失败函数的状态,以及在断言失败时仍然完整的回溯、变量状态等。问题似乎是SIGABRT和我的线程之间的一些交互,因为我的std::threads是pthread\u killed,可能是由某个默认信号处理程序执行的。如何在断言失败时暂停gdb 以下是我尝试过的一些事情: 在SIGABRT上设置一个捕捉点。此捕获确实发生,但为时已晚(在\uuupthread\ukill中) 定义了在中声明的extern,并
中的assert
检查我的多线程C++11程序中的不变量。当断言失败时,我希望能够检查失败函数的状态,以及在断言失败时仍然完整的回溯、变量状态等。问题似乎是SIGABRT
和我的线程之间的一些交互,因为我的std::thread
s是pthread\u kill
ed,可能是由某个默认信号处理程序执行的。如何在断言失败时暂停gdb
以下是我尝试过的一些事情:
\uuupthread\ukill
中)
中声明的extern
,并在其上设置了gdb断点。这永远不会被捕获,因此推测pthread将在调用(?)之前被终止#include <cassert>
void f2()
{
assert(0);
}
void f1()
{
f2();
}
int main()
{
f1();
}
啊!正如我们可以看到的那样,stepi转到symbol,它告诉我们有一个同名函数。因此,只需为\u断言设置一个断点即可_fail@plt
gdb > break __assert_fail@plt
gdb > run
Breakpoint 11, f2 () at main.cpp:5
(gdb) bt
#0 0x080484b0 in __assert_fail@plt ()
#1 0x080485f7 in f2 () at main.cpp:5
#2 0x08048602 in f1 () at main.cpp:10
#3 0x0804861b in main () at main.cpp:15
为我工作 如果出于某种原因需要在assert上设置断点,Klaus关于在
\uu assert\u fail
上中断的回答绝对正确
然而,事实证明,在多线程程序上设置断点以查看gdb中的堆栈跟踪根本没有必要,因为gdb已经在SIGABRT
上中断并切换中止线程。在我的例子中,我有一组错误配置的库,这导致了这条红鲱鱼。如果您正试图使用多线程程序在gdb中查看中止代码(SIGABRT
)的堆栈跟踪,则无需在gdb中执行任何操作,前提是默认信号处理程序已就位
仅供参考,通过运行info signals
,您可以看到默认的信号处理程序,通过运行info signals SIGABRT
,您也可以看到默认的信号处理程序。在我的机器上,我看到了这一点,这表明程序将停止,等等。如果由于某种原因,您的SIGABRT
信号处理程序没有设置为在SIGABRT
上停止,您需要更改该设置。更多信息请访问
@克劳斯:谢谢你的回答,谢谢你的跟进。这被证明是一种转移视线的做法,实际上真正的答案是根本不需要特殊的gdb配置。事实证明,我的gdb设置有一个不同的问题,我认为这是一个没有正确的断点/捕获点的问题,但它一直在工作。我将发布一个澄清的回复。如果有必要,在断言代码中设置断点是正确的。
gdb > break __assert_fail@plt
gdb > run
Breakpoint 11, f2 () at main.cpp:5
(gdb) bt
#0 0x080484b0 in __assert_fail@plt ()
#1 0x080485f7 in f2 () at main.cpp:5
#2 0x08048602 in f1 () at main.cpp:10
#3 0x0804861b in main () at main.cpp:15
(gdb) info signals SIGABRT
Signal Stop Print Pass to program Description
SIGABRT Yes Yes Yes Aborted