如何在Xcode中查看启动线程的内容?

时间:2013-05-12 19:47:18

标签: multithreading debugging instruments grand-central-dispatch nsoperation

我被要求调试并改进一个复杂的多线程应用程序,该应用程序由我无法访问的人编写,使用并发队列(GCD和NSOperationQueue)。我无法访问多线程体系结构的计划,也就是说有关应该在什么时候发生的事情的高级设计文档。我需要创建这样一个计划,以便了解应用程序的工作原理以及它正在做什么。

运行代码和调试时,我可以在Xcode的Debug Navigator中看到正在运行的各种线程。 有没有办法确定特定线程产生的源代码在哪里?有没有办法确定NSOperationQueue和NSOperation属于哪个?

例如,我可以在Debug Navigator中(或者通过使用LLDB的“thread backtrace”命令)看到一个线程的堆栈跟踪,但我可以查看的'最早'用户代码是被覆盖的(NSOperation *)start方法 - 在堆栈中较早退回而不是仅显示调用该方法的框架的汇编指令(例如__block_global_6_dispatch_call_block_and_release等)。

我调查并寻求各种调试方法但没有成功。我最接近的是方法调配的想法,但我认为这不会对排队的NSOperation线程起作用。请原谅我的模糊性:我知道看起来像我一样努力,我可能会问错误的问题,因此可能在我自己的脑海中没有形成清楚的问题,但我问的是社区求助! 感谢

1 个答案:

答案 0 :(得分:3)

我能想到的最好的方法是在dispatch_async-[NSOperation init]-[NSOperationQueue addOperation:]等处加入断点。您可以配置这些断点以记录其堆栈跟踪,可能还有其他一些信息(例如dispatch_async的块地址,或addOperation:的队列和操作的地址),然后继续运行。然后,当您对特定块的来源感到好奇并查看调用的内容以及从何处查看时,您可以查看日志。 (它仍然需要一些侦探工作。)

如果断点方法太慢,你也可以用dtrace完成类似的事情。