Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何查看是什么在Xcode中启动了线程?_Multithreading_Debugging_Instruments_Grand Central Dispatch_Nsoperation - Fatal编程技术网

Multithreading 如何查看是什么在Xcode中启动了线程?

Multithreading 如何查看是什么在Xcode中启动了线程?,multithreading,debugging,instruments,grand-central-dispatch,nsoperation,Multithreading,Debugging,Instruments,Grand Central Dispatch,Nsoperation,我被要求调试并改进一个复杂的多线程应用程序,它是由我无权访问的人编写的,使用并发队列(GCD和NSOperationQueue)。我没有访问多线程体系结构的计划,也就是说,一个高级设计文档,它描述了什么时候应该发生什么。我需要制定这样一个计划,以便了解应用程序的工作原理和功能 在运行代码和调试时,我可以在Xcode的调试导航器中看到正在运行的各种线程是否有一种方法可以识别源代码中某个特定线程的生成位置?是否有办法确定NSOperation属于哪个NSOperationQueue? 例如,我可以在

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

在运行代码和调试时,我可以在Xcode的调试导航器中看到正在运行的各种线程是否有一种方法可以识别源代码中某个特定线程的生成位置?是否有办法确定NSOperation属于哪个NSOperationQueue?

例如,我可以在Debug Navigator(或通过使用LLDB的“thread backtrace”命令)中看到线程的stacktrace,但我可以查看的“最早”用户代码是重写的(NSOperation*)
start
方法-在堆栈中退后一步,而不是仅显示调用该方法的框架的汇编指令(例如,
\u阻塞\u全局\u 6
\u调度\u呼叫\u阻塞\u和\u释放
等)

我已经调查并寻找了各种调试方法,但没有成功。最近我得到的是方法swizzling的想法,但我认为这对排队的NSOperation线程不起作用。请原谅我的含糊不清:我知道,尽管我看起来很难,但我可能问错了问题,因此可能是这样我自己还没有很清楚地想到这个问题,但我正在向社区寻求帮助!
谢谢

我能想到的最好办法就是在
dispatch\u async
-[NSOperation init]
-[NSOperation queue addOperation::][/code>等等上设置断点。您可以将这些断点配置为记录其堆栈跟踪,可能还有一些其他信息(如
dispatch\u async
的块地址,或
addOperation:
的队列和操作地址),然后继续运行。当您想知道某个特定块来自何处时,可以查看日志,查看调用了什么以及从何处调用。(这仍然需要一些检测工作。)


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

谢谢Jesse-这很有帮助。是的,我希望有一种方法,而不是拼凑断点输出。我对dtrace没有任何经验,所以我现在正在研究。dtrace有点复杂;您可能可以如果您将断点配置为立即继续,则可以不使用断点。(右键单击断点,在Xcode中选择“编辑断点”)。另一个想法:通过仪器可以进行此类跟踪吗?我已经查看了系统跟踪模板,但仍然看不到方法。是的,仪器将允许您使用dtrace构建此类跟踪。