0

假设在我的项目中有一些具有这种模式的代码块:

 dispatch_semaphore_wait(mySemaphore);
 // Arbitrary code here that I could get stuck on and not signal    
 dispatch_semaphore_signal(mySemaphore);

假设我在调试器中停下来发现我被卡住了:

 dispatch_semaphore_wait(mySemaphore);

如何轻松查看上次使用信号量的位置?如在哪里可以看到 dispatch_semaphore_wait(mySemaphore); 被调用并通过下一行代码?最简单的方法是使用 NSLog,但是在使用 Xcode 4 的调试器中是否有更好/更快的方法来做到这一点?

4

1 回答 1

1

debugDescription您可以在调试器中打印信号量对象(例如 via po),这将为您提供信号量的当前值和原始值(即创建时的值)。

只要当前值 < 0,dispatch_semaphore_wait就会等待其他人dispatch_semaphore_signal增加该值。

目前没有自动内置方法来跟踪对dispatch_semaphore_signal/dispatch_semaphore_wait的调用,但这是一个有用的功能请求,可在bugreport.apple.com上提交

自己跟踪这一点的一种方法是通过在 Xcode 中的这些函数上创建符号断点,添加执行的“调试器命令”断点操作bt并将标志设置为“评估断点后自动继续”。

另一种选择是使用 DTrace pid 探测器通过调用ustack().

于 2013-06-30T22:58:03.373 回答