使用pthread互斥锁(linux)调试死锁

时间:2010-11-23 05:07:59

标签: debugging pthreads deadlock mutex

我在我的一个应用程序(它的一个大代码)中面临死锁,我能够调试我打印互斥锁的阶段。它看起来像下面 -

          {__data = 
              {__lock = 2,
               __count = 0, 
               __owner = 15805, 
               __nusers = 1, 
               __kind = 0, 
               __spins = 0, 
               __list = {__prev = 0x0, __next = 0x0}
              },
            __size = "\002\000\000\000\000\000\000\000½=\000\000\001", '\0' <repeats 26 times>, 
            __align = 2
         }

现在我可以理解__owner是持有这个互斥锁的线程的线程ID,同一个线程最终导致这个互斥锁的死锁。有没有人知道其他字段的含义,例如_ lock, _count,__ spins等可能对调试死锁有用吗?任何提示/技巧也会受欢迎吗? (基于调试,我理解线程试图锁定它已经存在的互斥锁,最终导致死锁,其他线程也在为这个互斥锁而烦恼)

也可以通过调试器(gdb)观察进程/线程(当然调试信息和代码就在手边),而不需要仔细的代码遍历代码,从而找出已被锁定的代码行?我已经多次查看了我的代码,但在从函数返回之前无法找到此锁未被释放的位置。

由于 讨厌的

1 个答案:

答案 0 :(得分:-1)

其他字段对于调试死锁并不是特别有用。重要的信息是你已经找到的 - 线程是死锁的,因为它锁定了一个已经被自己锁定的互斥锁。

要使用gdb进行调试,您可以在感兴趣的线程锁定该互斥锁的每一行设置断点。每次断点触发时,只需继续执行。发生死锁时,最近的上一次锁定操作显然是没有相应解锁的操作。