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

时间:2013-07-01 07:06:24

标签: multithreading macos gdb

我正在尝试使用多个线程调试进程,并且我的一个线程正在等待NSRecursiveLock变为可用 - 由GDB确认。源代码以Objective C编写。

因此,我要回答的一个重要问题是,当发生这种情况时,谁会持有锁。我查看了我的进程中所有其他线程的调用堆栈,但没有发现任何线索。

这是我在转储锁定状态时在GDB中看到的内容:

(gdb) p \*(NSRecursiveLock\*)0x4c0cf30  $24 = {  `NSObject = {`  

    isa = 0xac94a3d0  
}  

    members of NSRecursiveLock:  
       _priv = 0x0  
}

正如您所看到的,上述输出信息量不大。

如何弄清楚谁在握锁?

1 个答案:

答案 0 :(得分:0)

您可以浏览代码并找到NSRecursiveLock被锁定的所有位置。然后在gdb thread apply all bt中搜索其中一些地方。
或者您可以创建NSRecursiveLock的自定义衍生产品并覆盖lock,unlock,tryLock和lockBeforeDate方法,以便它们打印线程ID然后完成它们的工作:

(void)lock
{
    NSLog(@"%@", [NSThread currentThread]);
    [super lock];
}

然后只使用你的类而不是普通的NSRecursiveLock,看看哪个线程持有锁。