Mac OS编程和GDB:确定哪个线程拥有NSRecursiveLock



我正试图用多个线程调试一个进程,但我的一个线程在等待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,并查看持有锁的线程。

最新更新