2008-11-25 33 views
3

我試圖在iPhone上,帶着一絲看起來崩潰調試間歇性錯誤,如:使用GDB從碰撞檢查目標C類(HandleDelegateSource壞接入)

objc_message_send 
__invoking__ 
[NSInvocation invoke] 
HandleDelegateSource 
MainRunLoop 
.... 

當GDB停止,我我希望能夠確定系統試圖調用什麼選擇器的詳細信息 - 我已經在[N​​SInvocation Invoke]周圍設置了一個斷點,但是從這一點無法弄清楚如何檢查NSInvocation對象的細節I我已停止。

回答

5

This article,最近發表在Phrack應回答你所有的問題。啓發閱讀。

+1

笑+1用於鏈接相關Phrack文章 – pestilence669 2010-02-05 01:44:00

1

如果您查看objc_msgSend的參考信息,您會看到選擇器是第二個參數。現在應該更容易破譯調試器輸出。

objc_msgSend
發送消息以簡單的返回值的類的實例。
ID objc_msgSend(ID theReceiver,SEL theSelector,...)

參數
theReceiver
指向類的實例,它是接收該消息的指針。
theSelector
處理消息的方法的選擇器。
...
包含方法參數的變量參數列表。

2

一個簡單的最終答案 - 在GDB中,您可以簡單地使用被調用的選擇器的名稱(lothar的答案中的選擇器參數)來查看寄存器。這是一個C字符串,因此使用下面的命令之一是觀察(取決於如果你是在模擬器或設備上運行):

Simulator: display /s $ecx 
Device: display /s $r1