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