Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多线程C程序中assert on上的gdb断点_C++_Multithreading_Gdb - Fatal编程技术网

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

以下是我尝试过的一些事情:

  • 在SIGABRT上设置一个捕捉点。此捕获确实发生,但为时已晚(在
    \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