我在我的一个应用程序(它的一个大代码)中面临死锁,我能够调试我打印互斥锁的阶段。它看起来像下面 -
{__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)观察进程/线程(当然调试信息和代码就在手边),而不需要仔细的代码遍历代码,从而找出已被锁定的代码行?我已经多次查看了我的代码,但在从函数返回之前无法找到此锁未被释放的位置。
由于 讨厌的
答案 0 :(得分:-1)
其他字段对于调试死锁并不是特别有用。重要的信息是你已经找到的 - 线程是死锁的,因为它锁定了一个已经被自己锁定的互斥锁。
要使用gdb
进行调试,您可以在感兴趣的线程锁定该互斥锁的每一行设置断点。每次断点触发时,只需继续执行。发生死锁时,最近的上一次锁定操作显然是没有相应解锁的操作。