程序員日常開發中有大量時間都會花費在 debug 上,從事 iOS 開發不可避免地需要使用 Xcode。這篇博客就主要介紹了 Xcode 中幾種能夠大幅提升代碼調試效率的方式。
“If debugging is the process of removing bugs, then programming must be the process of putting them in.”
——Edsger W. Dijkstra
添加條件
有時候我們可能會在某個循環中創建斷點,但一次又一次地點擊 continue 直到我們想要的條件出現,顯然是一種非常低效的方式。好在 Xcode 為我們提供了條件斷點。
首先在下列代碼中插入一個普通的斷點
右鍵點擊斷點,選擇 Edit Breakpoint,在 Condition 一欄輸入 i > 50
這樣一來,只有當程序運行滿足條件之後才會觸發斷點了。
Symbolic Breakpoint
Symbolic Breakpoint 是一種非常強大的斷點。在 Xcode 中找到 Breakpoint navigator(你可以通過快捷鍵 command + 7),在最下方點擊加號,可以看到它。
添加之後在 Symbol 一欄輸入 viewDidLoad。
這樣一來,在程序中所有的 viewDidLoad 方法被調用時都會觸發斷點。
當然,我們也可以僅僅為特定的某個類的方法添加斷點。在 Symbol 一欄輸入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 即可。
監控斷點
我們調試程序的大部分時候都是為了監控某個變量的變化,在代碼中變量出現的地方添加斷點不僅累而且還可能漏掉,事後還得一個一個刪掉,實在很累。
我們可以通過為變量添加監控斷點來簡單地做到這一點。
找到變量第一次出現的地方,添加一個普通斷點,進入 debug 模式後在 Variables View 中右鍵變量,選擇 Watch 變量名。這樣,每一次該變量被改變都會觸發斷點告知我們。
我們可以在 Console 中看到其變化。(注:在 Xcode 6.1.1 版本中,在監控 Swift 變量時似乎還有一些問題,無法正確地顯示變量的值)
日志信息斷點
最常見的 Debug 方式應該就是 NSLog and println 了。通常我們會通過這種方式來打印輸出各種實例信息以檢測程序運行狀態。
但這一調試方式也有很明顯缺陷:
無法在運行時添加
添加數量過多之後干擾視線,又需要麻煩地刪除或注釋掉
會編譯進 App,在正式版本中需要關閉(當然,我們可以通過宏來判斷是否應該編譯,但這也需要額外的操作不是嗎)
所幸在 Xcode 中我們還有另一種選項。
在如下代碼中添加一個普通的斷點,選擇 Edit Breakpoint,然後點擊 Add Action,選擇 Log Message,在輸入框中輸入 The number is: @number@。
運行效果如下圖所示
這裡因為有日志輸出,所以我們可以勾選上最下面的 Automatically continue after evaluating actions,這樣這個斷點就只會安安靜靜地為我們輸出日志了。
發聲斷點
同日志信息斷點,編輯普通斷點,Action 選擇 Sound。當觸發斷點時會發出設置的聲音。此 Action 配合 Automatically continue after evaluating actions 選項,可以做到酷炫的聽聲識 Bug。:)
總結
上述的日志信息斷點及發生斷點都是可以添加觸發條件的。通過這些斷點操作,自然是能夠極大地提升日常開發中調試代碼的效率了。
參考資料
WWDC 2013 Debugging with Xcode
Intermediate Breakpoints