我正在尝试使用多个线程调试进程,并且我的一个线程正在等待NSRecursiveLock
变为可用 - 由GDB
确认。源代码以Objective C
编写。
因此,我要回答的一个重要问题是,当发生这种情况时,谁会持有锁。我查看了我的进程中所有其他线程的调用堆栈,但没有发现任何线索。
这是我在转储锁定状态时在GDB
中看到的内容:
(gdb) p \*(NSRecursiveLock\*)0x4c0cf30 $24 = { `NSObject = {`
isa = 0xac94a3d0
}
members of NSRecursiveLock:
_priv = 0x0
}
正如您所看到的,上述输出信息量不大。
如何弄清楚谁在握锁?
答案 0 :(得分:0)
您可以浏览代码并找到NSRecursiveLock被锁定的所有位置。然后在gdb thread apply all bt
中搜索其中一些地方。
或者您可以创建NSRecursiveLock的自定义衍生产品并覆盖lock,unlock,tryLock和lockBeforeDate方法,以便它们打印线程ID然后完成它们的工作:
(void)lock
{
NSLog(@"%@", [NSThread currentThread]);
[super lock];
}
然后只使用你的类而不是普通的NSRecursiveLock,看看哪个线程持有锁。