Debugging pthreads调试需要帮助

Debugging pthreads调试需要帮助,debugging,gdb,pthreads,Debugging,Gdb,Pthreads,我有一个服务器-客户机程序,其中服务器和客户机中都有多个线程。客户机和服务器的数量可变(如3台服务器(副本),10台客户机)。我正在调试这个程序中的一个源文件。我认为存在某种僵局,可能如下: 一个互斥锁已经由一个服务器方法持有,来自客户端的请求调用一个希望再次获取互斥锁的服务器方法 该程序由一个测试脚本启动,该脚本生成服务器和客户端,并使客户端向服务器发送特定请求。我在代码的可疑区域使用了以下代码,以查看是否存在死锁,但它似乎不起作用,即代码进入两个块: if (pthread_mutex_lo

我有一个服务器-客户机程序,其中服务器和客户机中都有多个线程。客户机和服务器的数量可变(如3台服务器(副本),10台客户机)。我正在调试这个程序中的一个源文件。我认为存在某种僵局,可能如下:

一个互斥锁已经由一个服务器方法持有,来自客户端的请求调用一个希望再次获取互斥锁的服务器方法

该程序由一个测试脚本启动,该脚本生成服务器和客户端,并使客户端向服务器发送特定请求。我在代码的可疑区域使用了以下代码,以查看是否存在死锁,但它似乎不起作用,即代码进入两个块:

if (pthread_mutex_lock(&a_mutex) == EDEADLK) {
    cout<<"couldnt acquire lock."<<endl;
}
else cout<<"acquired lock"<<endl;
我不知道上述输出中所有内容的含义,但我可以看到一个线程(4193)持有互斥锁。我看到了那根线的背面痕迹(被剪断):

内核vsyscall()中的0 0xb8082430 #1 0xb7e347a6位于/lib/tls/i686/cmov/libc.so.6的nanosleep()中 #来自/lib/tls/i686/cmov/libc.so.6的2 0xb7e345be处于睡眠状态() #3类1::method1中的0x0804cb59(this=0xbfa9fe6c,clt=1,id= {static npos=4294967295,{M_dataplus={={},},{M_p=0xb7c9c11c“l/%\b”}) 在file1.cc:33 我不知道臭虫是怎么来的,在哪里

我非常感谢您对以下问题的帮助:

  • 调试此类条件/程序的好方法是什么
  • 如何检测死锁状态(即锁被保持而未被释放)
  • 在这样一个多进程程序中,有没有更好的方法使用gdb?(即检查所有流程中的状态?配置gdb以在流程开始前观察/显示变量?)
  • 因为,当我在服务器启动后(通过测试脚本)将gdb连接到服务器时,服务器可能已经超前于我要检查的代码。我尝试在可疑区域前添加睡眠(20),以帮助我处理gdb,但我认为这不是一个好方法。我还认为,打开多个终端,手动启动服务器和客户端,并检查每个终端的状态也不是一个好主意(如果我错了,请纠正我)
  • 附:我已经读过了


    非常感谢。

    使用GDB并将其附加到挂起程序。然后使用 “线程应用所有bt”(我想,但我手头没有一个系统)

    它会给你所有线程的回溯,你应该 能够看到哪个线程正在做什么

    如果这个问题也很容易重现,你可以用strace给出答案
    您可以了解正在使用哪些锁。

    我个人使用了“英特尔线程检测器”。我发现捕捉死锁非常有用。我也使用过英特尔线程检测器。hellgrind工具(Valgrind的一部分)也很优秀。这看起来不像是死锁,只是争用。你有第二个互斥锁吗?它是在那里的某个地方获得的?如果是,请确保它们以相同的顺序锁定。
    1: a_mutex = {__data = {__lock = 2, __count = 0, __owner = 4193, __kind = 0, __nusers = 2, 
    {__spins = 0, __list = {__next = 0x0}}}, 
      __size = "\002\000\000\000\000\000\000\000a\020\000\000\000\000\000\000\002\000\000  \000\000\000\000", __align = 2}
    
    #0  0xb8082430 in __kernel_vsyscall ()
    #1  0xb7e347a6 in nanosleep () from /lib/tls/i686/cmov/libc.so.6
    #2  0xb7e345be in sleep () from /lib/tls/i686/cmov/libc.so.6
    #3  0x0804cb59 in class1::method1 (this=0xbfa9fe6c, clt=1, id=
        {static npos = 4294967295, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0xb7c9c11c "l/%\b"}})
    at file1.cc:33