2010-11-23 85 views
2

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

  {__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,同一线程对这个互斥结束死锁。有没有人知道其他领域的意义,如_ 锁, _count,__自旋等可能有用的调试死锁?任何提示/技巧也会受到欢迎? (基于调试,我明白的线程试图锁定它已经拥有的互斥锁,结束在死锁,也是其他线程都为这个互斥锁)

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

由于 书呆子

回答

-1

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

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