gpt4 book ai didi

c++ - 多线程 C 程序中断言上的 gdb 断点

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:32 25 4
gpt4 key购买 nike

我正在使用 assert来自 <cassert>检查我的多线程 C++11 程序中的不变量。当断言失败时,我希望能够检查失败函数的状态,以及失败断言时仍然完整的回溯、变量状态等。问题似乎是 SIGABRT 之间的一些互动和我的线程,作为我的 std::threadpthread_kill ed,大概是由一些默认的信号处理程序。如何在断言失败时立即暂停 gdb?

以下是我尝试过的一些方法:

  1. SIGABRT 上设置一个捕获点.这种捕获确实发生了,但为时已晚(在 __pthread_kill 中)。

  2. 定义__assert_fail ,即 extern<assert.h> 中声明, 并在其上设置 gdb 断点。这从未被捕获,因此推测 pthread 在调用之前被杀死(?)。

此处推荐的方法是什么?

最佳答案

我做了以下事情:

示例程序:

#include <cassert>
void f2()
{
assert(0);
}

void f1()
{
f2();
}

int main()
{
f1();
}

现在我在 f2 上设置了一个断点,希望以后可以使用 stepi 执行断言:

gdb > break f2
gdb > run
Breakpoint 11, f2 () at main.cpp:5
gdb > stepi // several times!!!!
0x080484b0 in __assert_fail@plt ()

啊啊啊!正如我们所看到的,stepi 转到 symbol,它告诉我们有一个具有该名称的函数。因此,只需为 __assert_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

对我有用!

关于c++ - 多线程 C 程序中断言上的 gdb 断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39399227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com