問題
我正在嘗試除錯 iPhone 上的間歇性錯誤,崩潰的痕跡如下所示:
objc_message_send
__invoking__
[NSInvocation invoke]
HandleDelegateSource
MainRunLoop
....
當 GDB 停止時,我希望能夠確定有關係統嘗試呼叫哪個選擇器的詳細資訊 – 我現在在 [NSInvocation Invoke] 周圍設定了一個斷點,但從那時起無法弄清楚如何檢查詳細資訊我停止的 NSInvocation 物件。
解決方案
如果您檢視objc_msgSend的參考資訊,您將看到選擇器是第二個引數。現在應該更容易破譯偵錯程式的輸出了。
objc_msgSend
將帶有簡單返回值的訊息傳送到類的例項。
id objc_msgSend(id theReceiver, SEL theSelector, …)
引數
theReceiver
指向要接收訊息的類的例項的指標。
theSelector
處理訊息的方法的選擇器。
…
包含方法引數的變數引數列表。
在 GDB 中,您可以簡單地檢視帶有被呼叫選擇器名稱的暫存器(lothar 答案中的 Selector 引數)。它是一個 C 字串,因此您可以使用以下命令之一觀察它(取決於您是在模擬器還是裝置中執行):
Simulator: display /s $ecx
Device: display /s $r1
原文連結:
使用 GDB 從崩潰中檢查 Objective C 類(HandleDelegateSource 錯誤訪問)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016198/viewspace-2886374/,如需轉載,請註明出處,否則將追究法律責任。