2016-01-09 68 views
4

有時它發生在你使用非託管代碼的項目,所以你不知道如何解決一個簡單的問題。在大多數情況下,調試器可以幫助我們達到根本目的,我只想知道xcode調試器的強大程度。因爲我使用了像OllyDbg這樣的一些asm調試器,這些爲我們提供了一個不。我選擇的斷點最多的是點擊事件或點擊事件的斷點。那麼有什麼辦法可以在xcode項目上放置類似的斷點嗎?有什麼辦法可以斷點按鈕touchUpInside的所有方法嗎?

回答

8

聽起來像你正在尋找一種方法來捕獲任何時間一個UIButton被挖掘。要做到這一點,我會設置一個符號斷點。在斷點導航器(⌘7),點擊加號在屏幕的底部,選擇添加符號斷點

enter image description here

在對話中,添加以下到符號領域:

-[UIControl sendAction:to:forEvent:] 

enter image description here

這是多一點比你所要求的。它實際上會捕獲除了UIButton之外的大量事件的所有事件。不過,我敢打賭,你可以讓它滿足你的需求。現在運行該應用程序並點擊一個按鈕。當它遇到斷點時,調試器看起來會有點不同於你可能習慣看到的正常堆棧跟蹤,因爲你將在沒有源代碼匹配符號的地方碰到斷點。通過一些命令,您可以解密相當數量的數據。例如,請參閱下面的屏幕截圖。

enter image description here

下面是我做什麼,什麼一些,這意味着。首先要跳過(F6)到下一個命令(例如第12行)的開頭,以確保傳入變量的所有寄存器都已正確填充。從那裏開始,我開始在寄存器中尋找有趣的信息。在本例中,寄存器r15是調用對象(按鈕!),r14,r12和rbx是參數(第4-7行)。當寄存器中的值是一個指向對象的指針時,當你處於'正常'棧幀時,你可以'打印對象'。例如:

(lldb) register read r15 
r15 = 0x00007fc6f4a24510 
(lldb) po 0x00007fc6f4a24510 
<UIButton: 0x7fc6f4a24510; frame = (0 0; 414 100); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fc6f4a247b0>> 

(lldb) po [[(UIButton *)0x00007fc6f4a24510 titleLabel] text] 
Done 
+2

其他可能有用的東西。 Xcode的符號斷點也將與選擇器匹配。所以如果你想捕獲所有實現對foo:bar:baz:selector的響應的方法,你可以只指定選擇器名稱,而省略類和 - []。 –

+1

此外,如果您嘗試調試代碼,但您沒有調試信息,則如果在函數的一開始停止,則打印參數更容易,然後使用lldb「註冊別名」$ arg1,$ arg2等,它指向用於將arg1,arg2等傳遞給函數的寄存器。這對任何使用寄存器傳遞參數的目標體系結構都適用,這是我們目前除32位英特爾之外的所有體系結構所做的。請注意,您必須在函數的開頭停止,以在參數插槽重用之前捕獲狀態。 –

+0

酷!謝謝@Jimngger!這真的很方便。 :) – Daniel

相關問題