【发布时间】:2013-05-06 20:32:34
【问题描述】:
我被要求调试和改进一个复杂的多线程应用程序,该应用程序由我无权访问的人编写,它使用并发队列(GCD 和 NSOperationQueue)。我无权访问多线程架构的计划,也就是说,一份关于什么时候应该发生的高级设计文档。我需要制定这样的计划,以了解应用程序的工作原理和用途。
在运行代码和调试时,我可以在 Xcode 的 Debug Navigator 中看到正在运行的各种线程。 有没有一种方法可以确定特定线程在源代码中的哪个位置产生?有没有办法确定一个 NSOperation 属于哪个 NSOperationQueue?
例如,我可以在调试导航器(或使用 LLDB 的“线程回溯”命令)中看到线程的堆栈跟踪,但我可以查看的“最早”用户代码是被覆盖的 (NSOperation*) start 方法 -在堆栈中更早地退一步只是显示调用该方法的框架的汇编指令(例如__block_global_6、_dispatch_call_block_and_release 等)。
我已经调查并寻求了各种调试方法,但没有成功。我得到的最接近的是方法调配的想法,但我认为这不会适用于排队的 NSOperation 线程。请原谅我的含糊之处:我知道我看起来像我一样努力,我可能问错了问题,因此可能还没有在我自己的脑海中清楚地形成这个问题,但我在问社区求助! 谢谢
【问题讨论】:
-
另一个想法:这样的追踪可以通过 Instruments 实现吗?我已经查看了系统跟踪模板,但我还是看不到方法。
-
是的,Instruments 将允许您使用 dtrace 来构建这种跟踪。
标签: multithreading debugging instruments grand-central-dispatch nsoperation