我正试图用多个线程调试一个进程,但我的一个线程在等待NSRecursiveLock
可用时卡住了——GDB
确认了这一点。源代码是用Objective C
编写的。
因此,我试图回答的一个大问题是,当这种情况发生时,谁在掌权。我查看了进程中所有其他线程的调用堆栈,没有发现任何线索。
这是我在GDB
中转储锁的状态时看到的:
(gdb) p *(NSRecursiveLock*)0x4c0cf30 $24 = { `NSObject = {`
isa = 0xac94a3d0
}
members of NSRecursiveLock:
_priv = 0x0
}
正如您所看到的,上面的输出并不是很有信息。
如何弄清楚谁拿着锁?
您可以扫描代码,找到NSRecursiveLock被锁定的所有位置。然后在gdb thread apply all bt
中搜索其中的一些地方。
或者,您可以创建NSRecursiveLock的自定义派生方法,并覆盖lock、unlock、tryLock和lockBeforeDate方法,以便它们打印线程id,然后完成它们的工作:
(void)lock
{
NSLog(@"%@", [NSThread currentThread]);
[super lock];
}
然后只需使用您的类,而不是普通的NSRecursiveLock,并查看持有锁的线程。