使用 GDB 從崩潰中檢查 Objective C 類(HandleDelegateSource 錯誤訪問)

itchaindev發表於2022-04-10

問題

我正在嘗試除錯 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章