1

我正在尝试调试具有多个线程的进程,并且我的一个线程卡住等待NSRecursiveLock可用 - 由GDB. 源代码写在Objective C.

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

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

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

    isa = 0xac94a3d0  
}  

    members of NSRecursiveLock:  
       _priv = 0x0  
}

如您所见,上面的输出信息量不是很大。

如何判断谁持有锁?

4

1 回答 1

0

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

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

然后只需使用您的类而不是普通的 NSRecursiveLock 并查看哪个线程持有锁。

于 2013-07-02T05:49:26.440 回答