4

我被要求调试和改进一个复杂的多线程应用程序,该应用程序由我无权访问的人编写,它使用并发队列(GCD 和 NSOperationQueue)。我无权访问多线程架构的计划,也就是说,一份关于什么时候应该发生的高级设计文档。我需要制定这样一个计划,以了解应用程序是如何工作的以及它在做什么。

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

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

我已经调查并寻求了各种调试方法,但没有成功。我得到的最接近的是方法混合的想法,但我认为这不会适用于排队的 NSOperation 线程。请原谅我的含糊之处:我知道我看起来像我一样努力,我可能问错了问题,因此可能在我自己的脑海中还没有很清楚地形成这个问题,但我在问社区求助!谢谢

4

1 回答 1

3

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

dtrace如果断点方法太慢,您也可以完成类似的操作。

于 2013-05-12T19:55:38.403 回答