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

Debugging 使用pthread互斥体调试死锁(linux),debugging,pthreads,deadlock,mutex,Debugging,Pthreads,Deadlock,Mutex,我的一个c应用程序(它是一个大代码)面临死锁,我能够在打印互斥锁的阶段进行调试。它看起来像下面- {__data = {__lock = 2, __count = 0, __owner = 15805, __nusers = 1, __kind = 0, __spins = 0,

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

          {__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
         }
{uuuuu数据=
{uuuu lock=2,
__计数=0,
__业主=15805,
__努瑟斯=1,
__种类=0,
__自旋=0,
__列表={{uuuuu-prev=0x0,{uuuuu-next=0x0}
},
__size=“\002\000\000\000\000\000\000½=\000\000\000\001”、“\0”,
__对齐=2
}
现在我可以理解uu owner是持有这个互斥锁的线程的线程id,同一个线程在这个互斥锁的死锁中结束。是否有人知道其他字段的含义,如_lock、_count、u spins等,这些字段在调试死锁时可能很有用?欢迎提供任何提示/窍门?(根据调试,我知道线程试图锁定它已经持有的互斥锁,结果是死锁,其他线程也在等待这个互斥锁)

也可以通过调试器(gdb)(当然是调试信息,代码就在手边)观察进程/线程,而不需要仔细的代码演练,来找出锁定在哪一行代码上?我已经检查了我的代码好几次,但在从函数返回之前,无法找到该锁未释放的位置

谢谢
Nerdy

其他字段对于调试死锁不是特别有用。重要的信息是您已经发现的-线程是死锁的,因为它正在锁定一个已经被自身锁定的互斥体


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

其他字段对于调试死锁不是特别有用。重要的信息是您已经发现的-线程是死锁的,因为它正在锁定一个已经被自身锁定的互斥体

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