Xcode 除錯技巧

BigNerdCoding發表於2018-03-12

Cover

在使用正確的情形下,IDE 內建的除錯工具能夠幫我們節省大量時間。例如,與原始手動控制檯列印相比,最簡單設定斷點進行單步除錯的效率則要高出一個量級。而且這還僅僅只是除錯武器庫裡的冰山一角,Xcode 有一整套方便的工具,旨在加快除錯工作流程。

斷點處自動執行任務

先來回顧一下斷點除錯時的常見場景:程式碼執行到了斷點處暫停後,我們一般都會在控制檯輸入 po myVariable 等 LLDB 命令來獲取上下文資訊,然後再繼續程式碼執行操作。

顯然如果上述手動敲命令列的事情需要多次執行的話,那麼除錯過程也就變得非常乏味了,理想的情形應該是將其自動化,步驟如下:

  • 選中斷點右鍵進行編輯
  • 點選 Add Action
  • 選中 Debugger Command
  • 輸入你想執行的 LLDB 命令
  • 勾選 Automatically continue after evaluating actions,如果你希望執行相關命令後,繼續執行程式。

Breakpoints

這樣當每次斷點被觸發後,我們設定的自定義命令就會被執行。整個過程無需手動敲 LLDB 命令,節約不少的開發時間。

條件斷點

有時候我們可能希望設定的斷點只會在特定情形下才會觸發。一個常見的例子就是:在某迴圈語句程式碼中,我們希望某斷點在特定情形下被觸發。這樣我們就能避免大量無效觸發,而且將自己從持續的 continue 點選下解脫出來。

Conditional breakpoints

上面的例子中斷點只會在 counter > 20 時才會被觸發。當然你還可以使用更為複雜的 BOOL 語句,甚至是執行函式呼叫。

斷點忽略

與條件斷點相反,有時候我們可能需要在特定的時候跳過斷點。例如,某個功能函式在生命週期內會被多次呼叫,但是我們對第一次呼叫不感興趣。因此我們可以如下進行設定,使其在首次呼叫時直接跳過觸發斷點的行為:

Ignore

異常斷點

上述幾個情形下,我們都會明確在某行程式碼設定斷點,但是有時候我們需求的斷點則無法提前預設。例如,當程式在執行時發生異常並且未被捕獲,此時程式會出現 Crash 。雖然 Xcode 會在控制檯的列印出具體的呼叫棧等資訊,並且大多數時候這些資訊對於錯誤定位都非常有用,但是它畢竟沒有直接將我們帶到特定的上下文。

為了解決這個問題,我們就需要針對特定事件設定斷點而非特定程式碼。你可以根據自己感興趣的事件型別進行具體設定:

Exception breakpoints

符號斷點

異常斷點嚴格意義上來說是符號斷點的一個具體型別,我們還可以定義更多自定義型別的通用斷點。例如,我們可以對 viewDidLoad 方法的呼叫設定一個通用斷點,在每次呼叫時進行觸發:

Symbolic breakpoints

通過這種方式,我們就無需在每個呼叫處手動設定斷點。

變數跟蹤

上述的那些斷點都是針對程式中的程式碼執行。但是應用卻不是隻包含程式碼,其中還有非常重要的另一個物件:資料。所以除了程式碼執行需要設定斷點之外,某些資料的變化過程也有可能是我們所關心事件。

為了實現資料變化過程的跟蹤,首先我們需要在變數可見域內設定斷點。然後我們那在控制檯右鍵設定變數觀察,最後你可以取消該輔助斷點。

watchpoint

當然,我們也可以在控制檯通過 LLDB 命令來完成設定:

watchpoint set variable self.counter

完成設定後,變數在整個生命週期內發生的任何變化都會觸發斷點。

總結

上述這些除錯技巧僅僅只是很小的一部分,但是如果運用得當的話還是能夠極大優化除錯體驗和速度。如果你想了解更多相關內容的話,可以檢視官方文件或者 raywenderlich 的高階除錯技巧這本書。

原文地址

相關文章