3

我被要求調試和改進一個複雜的多線程應用程序,由我無權訪問的人編寫,使用併發隊列(包括GCD和NSOperationQueue)。我無法訪問多線程體系結構的計劃,也就是說需要在什麼時候發生的高級設計文檔。我需要制定這樣的計劃,以瞭解應用程序的工作原理以及它正在做什麼。如何查看在Xcode中啓動了一個線程?

運行代碼和調試時,我可以在Xcode的Debug Navigator中看到正在運行的各種線程。 有沒有一種方法可以識別源代碼中特定線程的產生?是否有辦法確定NSOperation屬於哪一個NSOperationQueue?

例如,我可以在調試導航看到(或者通過使用LLDB的「線程回溯」命令)線程的堆棧跟蹤,但「最早」用戶代碼我可以查看是被覆蓋的(的NSOperation *)start方法 - 在堆棧之前的位置比剛纔顯示的調用該方法的框架的彙編指令(例如__block_global_6_dispatch_call_block_and_release等)要早。

我調查過並尋求各種調試方法,但沒有成功。離我最近的是方法混合的想法,但我認爲這不適用於排隊的NSOperation線程。請原諒我的模糊性:我知道,儘管我看起來很辛苦,但我可能提出了錯誤的問題,因此可能沒有在我的腦海中形成相當清晰的問題,但我問社區求助! 謝謝

+1

另一個想法是:這樣的追蹤可能通過儀器?我查看了系統跟蹤模板,但我再也看不到一種方法。 – 2013-05-13 11:21:39

+0

是的,儀器將允許您使用dtrace來建立這種跟蹤。 – 2013-05-13 18:11:30

回答

3

我能想到的最好的就是在dispatch_async,-[NSOperation init],-[NSOperationQueue addOperation:]等等上加上斷點。您可以配置這些斷點以記錄其堆棧跟蹤,可能還有其他一些信息(如dispatch_async的塊地址,或addOperation:的隊列地址和操作地址),然後繼續運行。然後,您可以查看日誌,當您好奇某個特定塊來自何處時,可以查看所調用的內容以及來自哪裏。 (它仍然需要一些偵探工作。)

如果斷點方法太慢,您也可以用dtrace來完成類似的事情。

+0

謝謝Jesse - 這很有幫助。是的,我希望除了拼湊斷點輸出外,還有一種方法。我沒有任何dtrace的經驗,所以我現在正在研究這個。 – 2013-05-13 10:18:39

+0

dtrace有點複雜;如果將它們配置爲立即繼續,那麼您可能會使用斷點。 (右鍵單擊它們,在Xcode中選擇「編輯斷點」。) – 2013-05-13 10:48:46