2013-07-01 42 views
1

我試圖調試一個進程與多個線程和我的一個線程卡住等待NSRecursiveLock成爲可用 - 確認GDB。來源寫在Objective CMac OS編程和GDB:確定哪個線程擁有一個NSRecursiveLock

所以我試圖回答的一個大問題是誰在這種情況發生時持有鎖。我查看了我的進程中所有其他線程的調用堆棧,並沒有發現任何線索。

這是我在GDB看到我的時候我傾倒鎖的狀態:

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

    isa = 0xac94a3d0 
} 

    members of NSRecursiveLock: 
     _priv = 0x0 
} 

正如你可以看到上面的輸出也不是很豐富。

如何找出誰持有鎖?

回答

0

您可以掃描您的代碼並找到所有NSRecursiveLock被鎖定的位置。然後在gdb thread apply all bt中搜索一些這些地方。
或者你也可以創建NSRecursiveLock的自定義衍生物和覆蓋鎖定,解鎖的tryLock和lockBeforeDate方法,所以他們會打印線程ID,然後做好自己的工作:

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

然後,只需使用你的類,而不是簡單的NSRecursiveLock並查看哪個線程持有鎖。

相關問題