Xcode之斷點除錯詳解

發表於2016-07-28

平常大家在開發專案中,凡是遇到Bug,都會說你打個斷點看看問題出在哪裡,那麼斷點到底是什麼?它在Xcode編譯器中到底是如何工作的,此篇我們就來重點論述一下什麼是斷點以及它所附帶的一些除錯技巧。


所謂斷點,其實就是一個讓應用暫停執行的機制,這是為了方便開發人員執行除錯,檢視暫存器的某些值。既然設定了斷點,可以讓應用停在某一時刻,那麼這一時刻應用所處的環境我們便一目瞭然,這個環境就是案發現場,而斷點就是幫助我們破案的工具。這個時候我們便可以使用各項除錯命令,而編譯器則會給我們反饋線索。

Xcode編譯器允許我們在程式碼中的任意位置設定斷點,但是如何打斷點也是一門手藝,有些斷點的設定是毫無意義的,比如說你將斷點設定在了一處宣告某個常量的地方,那麼編譯器便會跳過這處,直到它遇見真正的可執行指令處。

與斷點協同破案的便是斷點導航器,這個內容我在之前的文章中有介紹。不在此贅述。下面講述一些基本的斷點除錯技巧


1.設定斷點

設定斷點,就不說了,大家都知道,在你想要除錯的程式碼處點選設定就行了。通過快捷鍵”Command+\”也可以。

2.斷點的自定義設定

(1)在你設定斷點的地方,右擊該斷點,會彈出一個欄,選擇Edit Breakpoint,可以對斷點進行自定義設定,如下圖2-1所示。

111013398-c8f9230d0af56e94
2-1

(2)點選Edit Breakpoint選項後,彈出如下設定框2-2

121013398-8866594f4c50ad7e
2-2

藍色對勾後面的,表示當前斷點所處的位置,其實我忘了把程式碼行數弄出來,但它還是顯示了當前斷點在第43行。至於程式碼行數顯示你可以在選單欄Xcode->Preferences->Test Editing->勾選Line Numbers,將程式碼行數字顯示出來。將對勾抹去,表示該斷點失效。

Condition:指的是條件表示式,該項允許我們對斷點生效設定條件,表示當滿足某一特定條件的前提下,該斷點才生效。(該條件的錄入,不能夠識別預處理的巨集定義,也不能識別斷點作用域之外的變數和方法)。

Ignore:忽略次數。它指定了在斷點生效,應用暫停之前,程式碼忽略斷點的次數。你如果希望應用執行一段時間後斷點才生效,那麼就可以使用這個選項。比如說在除錯某一迴圈體的時候。

Action:動作。它表示當斷點生效時,Xcode作出反應後的行為動作。點選右邊的Add Action選項會彈出如圖2-3選單。

131013398-f34c2b904b78b17f
2-3

圖中所示紅色方框中的選項,可以讓你指定那一種動作。預設的是Debugger Command。還有以下幾種動作供選擇,下面逐一介紹。
1.AppleScript
它是蘋果提供的一種指令碼語言,用來執行一些預先指定的行為。選中該選項,將會出現如圖2-4所示的AppleScript語言的輸入框。

141013398-48906cd2742a811c
2-4

大家可能看到了,我在輸入框中輸入了本門至高無上的心法祕訣,它的意思是彈出一個顯示“Hello World!”的對話方塊。點選Compile按鈕後,如果沒有錯誤,會顯示成功資訊。而點選Test按鈕,會測試執行效果,如圖2-5所示。

151013398-2af791f8f3db0221
2-5

至於紅色方框中的內容是三種特殊符號相對應的定義。

符號標記 定義
@expression@ LLDB表示式
%B 斷點的名稱
%H 遇到該斷點的次數

2.Capture GPU Frame
這個功能用於當斷點生效時,捕獲GPU當前所繪製的幀。該功能是輔助圖形除錯的。

3.Debugger Command
預設的選項,可以讓斷點執行LLDB除錯命令。

4.Log Message
使用Log命令可以生成訊息佇列,將相關的訊息輸出到控制檯上,還有一個Speak Message選項,可以播報訊息。

5.Shell Command
該動作接收一個命令檔案和引數列表。如下圖2-6所示

161013398-44a59671feb2c696
2-6

命令檔案必須是一個可執行的二進位制程式或者指令碼。可以複製貼上輸入路徑,也可以點選Choose按鈕選擇具體檔案。
引數通過空格表示分割,也可以在兩個@字元之間包含LLDB表示式。
一般情況下,Xcode會非同步執行Shell Command,也就是說,Shell Command 和偵錯程式將會同步執行。如果希望偵錯程式在Shell Command命令完成後執行,則可以勾選下面的Wait until done選項。

6.Sound
動作會在斷點被觸發時,彈出聲音提示。

3.斷點型別

上面講到的都是普通斷點,斷點的型別還包括以下幾種:

1.異常斷點

異常斷點是程式碼出現問題導致編譯器丟擲異常時觸發的斷點。它在斷點導航器中設定。點選+號,選擇Exception Breakpoint選項。如下圖3-1所示

171013398-28965d3a1ecb8705
3-1

Exception選項可以讓你選擇響應Objective-C物件丟擲的異常,也可以選擇響應C++物件丟擲的異常。

Break則是選擇斷點所接收的異常,是接收“Throw”語句丟擲的異常還是Catch語句的。

由於有一些異常的出現,是在不滿足某些特定條件下而導致的,比如說在複雜迴圈中陣列越界,這個時候往往不容易根據異常資訊確定錯誤的出處,這個時候設定異常斷點便能發揮作用。

2.符號斷點

他可以中斷某個方法的呼叫,可謂是異常強大,在斷點導航器介面,點選+號,選擇Add Symbolic Breakpoint選項,然後會彈出如圖3-2所示的對話方塊。

181013398-f57af7ad4adc62c8
3-2

大家可以看到它比普通斷點的自定義設定介面多出了兩個內容,其一是Symbol,他用來設定當前斷點作用域所能識別的方法,這裡面既可以是自定義的方法,也可以是系統的API方法。(注意必須表明是類方法還是成員方法)

另一個Module是模組的意思,用來限制滿足符號的方法,編譯器將只會在斷點滿足這個模組的符號的時候才回暫停。

3.OpenGL ES錯誤斷點(OpenGl ES Error Breakpoint)

這個斷點的作用和異常斷點類似,只不過這個斷點只有在openGL ES錯誤發生的時候才會觸發。

4.測試失敗斷點

僅在測試斷點失敗的時候才會執行,這個時候,應用將會暫停在引發測試失敗的程式碼處,而不是停止在測試程式碼處。

今天就到此為止,下篇將繼續講述各種除錯細節。祝大家元宵節快樂,在家人的陪伴下開開心心的吃元宵。


下面的連結都是有關Xcode除錯技巧的,以供參考。
5個Xcode開發除錯技巧
在xcode除錯斷點不能停在程式碼區的終極解決方案
Xcode斷點除錯技巧 譯者:破船
Xcode中斷點的威力

相關文章