程序員日常開(kāi)發(fā)中有大量時(shí)間都會(huì)花費(fèi)在 debug 上弯洗,從事 iOS 開(kāi)發(fā)不可避免地需要使用 Xcode。這篇博客就主要介紹了 Xcode 中幾種能夠大幅提升代碼調(diào)試效率的方式。
“If debugging is the process of removing bugs, then programming must be the process of putting them in.”——Edsger W. Dijkstra
添加條件
有時(shí)候我們可能會(huì)在某個(gè)循環(huán)中創(chuàng)建斷點(diǎn),但一次又一次地點(diǎn)擊 continue 直到我們想要的條件出現(xiàn),顯然是一種非常低效的方式跳夭。好在 Xcode 為我們提供了條件斷點(diǎn)。
首先在下列代碼中插入一個(gè)普通的斷點(diǎn)

1424831572989019.jpg
右鍵點(diǎn)擊斷點(diǎn)榜掌,選擇 Edit Breakpoint优妙,在 Condition 一欄輸入 i > 50

1424831626482600.jpg
這樣一來(lái),只有當(dāng)程序運(yùn)行滿足條件之后才會(huì)觸發(fā)斷點(diǎn)了憎账。
Symbolic Breakpoint
Symbolic Breakpoint 是一種非常強(qiáng)大的斷點(diǎn)套硼。在 Xcode 中找到 Breakpoint navigator(你可以通過(guò)快捷鍵 command + 7),在最下方點(diǎn)擊加號(hào)胞皱,可以看到它邪意。

1424831668585500.jpg
添加之后在 Symbol 一欄輸入 viewDidLoad。這樣一來(lái)反砌,在程序中所有的 viewDidLoad 方法被調(diào)用時(shí)都會(huì)觸發(fā)斷點(diǎn)雾鬼。

1424831693490575.jpg
當(dāng)然,我們也可以僅僅為特定的某個(gè)類的方法添加斷點(diǎn)宴树。在 Symbol 一欄輸入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 即可净捅。
監(jiān)控?cái)帱c(diǎn)
我們調(diào)試程序的大部分時(shí)候都是為了監(jiān)控某個(gè)變量的變化褥傍,在代碼中變量出現(xiàn)的地方添加斷點(diǎn)不僅累而且還可能漏掉,事后還得一個(gè)一個(gè)刪掉,實(shí)在很累骂删。
我們可以通過(guò)為變量添加監(jiān)控?cái)帱c(diǎn)來(lái)簡(jiǎn)單地做到這一點(diǎn)牲剃。
找到變量第一次出現(xiàn)的地方初家,添加一個(gè)普通斷點(diǎn)傲醉,進(jìn)入 debug 模式后在 Variables View 中右鍵變量,選擇 Watch 變量名零如。這樣躏将,每一次該變量被改變都會(huì)觸發(fā)斷點(diǎn)告知我們锄弱。

1424831869195137.png
我們可以在 Console 中看到其變化。(注:在 Xcode 6.1.1 版本中祸憋,在監(jiān)控 Swift 變量時(shí)似乎還有一些問(wèn)題会宪,無(wú)法正確地顯示變量的值)

1424831794610254.jpg
日志信息斷點(diǎn)
最常見(jiàn)的 Debug 方式應(yīng)該就是 NSLog and println 了。通常我們會(huì)通過(guò)這種方式來(lái)打印輸出各種實(shí)例信息以檢測(cè)程序運(yùn)行狀態(tài)蚯窥。
但這一調(diào)試方式也有很明顯缺陷:
無(wú)法在運(yùn)行時(shí)添加
添加數(shù)量過(guò)多之后干擾視線狈谊,又需要麻煩地刪除或注釋掉
會(huì)編譯進(jìn) App,在正式版本中需要關(guān)閉(當(dāng)然沟沙,我們可以通過(guò)宏來(lái)判斷是否應(yīng)該編譯,但這也需要額外的操作不是嗎)
所幸在 Xcode 中我們還有另一種選項(xiàng)壁榕。
在如下代碼中添加一個(gè)普通的斷點(diǎn)矛紫,選擇 Edit Breakpoint,然后點(diǎn)擊 Add Action牌里,選擇 Log Message颊咬,在輸入框中輸入 The number is: @number@。

1424831947863583.jpg
運(yùn)行效果如下圖所示

1424832022723354.jpg
這里因?yàn)橛腥罩据敵瞿盗桑晕覀兛梢怨催x上最下面的 Automatically continue after evaluating actions喳篇,這樣這個(gè)斷點(diǎn)就只會(huì)安安靜靜地為我們輸出日志了。
發(fā)聲斷點(diǎn)
同日志信息斷點(diǎn)态辛,編輯普通斷點(diǎn)麸澜,Action 選擇 Sound。當(dāng)觸發(fā)斷點(diǎn)時(shí)會(huì)發(fā)出設(shè)置的聲音奏黑。此 Action 配合 Automatically continue after evaluating actions 選項(xiàng)炊邦,可以做到酷炫的聽(tīng)聲識(shí) Bug。:)
總結(jié)
上述的日志信息斷點(diǎn)及發(fā)生斷點(diǎn)都是可以添加觸發(fā)條件的熟史。通過(guò)這些斷點(diǎn)操作馁害,自然是能夠極大地提升日常開(kāi)發(fā)中調(diào)試代碼的效率了。
參考資料
WWDC 2013 Debugging with Xcode
Intermediate Breakpoints
原文地址:http://www.cocoachina.com/ios/20150225/11190.html