開發(fā)中常見的一類崩潰錯誤是遇到:unrecognized selector sent to instance 0xaxxxx…而backtrace又無法明確說明錯誤在哪行代碼,如何快速定位BUG呢?
有時讀代碼一下很難找到是哪個instance出的問題脸哀,這時定制有效的DEBUG斷點是最好的辦法倒彰,方法如下:
在Debug菜單中選擇 Breakpoints -> Create Symbolic Breakpoint
在Symbol中填寫如下方法簽名:
-[NSObject(NSObject) doesNotRecognizeSelector:]
然后再運行復(fù)現(xiàn)錯誤時斷點會停在真正導(dǎo)致崩潰的地方拉馋。
Symbolic Beakpoint 功能很強大, 具體的設(shè)置可以添加時進行設(shè)置, 也可以添加后, 在斷點瀏覽面板(Command + 7)進行設(shè)置.
Symbol:
觸發(fā)斷點的函數(shù)
C函數(shù)樣式只需要寫函數(shù)名亲雪,不用寫后面的()和參數(shù)跑揉。例如NSLog锅睛。
OC方法樣式的[className methodName] className是類名,methodName是方法名(不區(qū)分類方法和實例方法)历谍。如果寫標(biāo)記的這個類的方法被子類重寫了則子類的方法也會觸發(fā)斷點现拒。例如[UIViewController viewDidLoad]。
Module:
模塊篩選望侈∮∈撸可以避免不同庫中方法名或者函數(shù)名相同。
Condition
觸發(fā)條件脱衙。這里可以添加一些指定觸發(fā)條件侥猬,比如添加第一個參數(shù)不能為nil例驹。這里$arg3代表第1個參數(shù),$arg4代表第2個參數(shù)陵究,以此類推眠饮。這里也可以調(diào)用方法來判斷奥帘,但必須是類方法铜邮,并且返回值必須為BOOL類型。
樣例:找出給[UIImage imageNamed:]傳nil的代碼寨蹋。這里就需要設(shè)置Symbol為[UIImage imageNamed:]松蒜,然后Condition設(shè)置為$arg3 == nil。這樣在運行中如果遇到傳nil就會觸發(fā)斷點已旧。
Action
觸發(fā)活動秸苗。這里是當(dāng)斷點觸發(fā)后要執(zhí)行的動作,可以添加多條运褪,執(zhí)行的順序是從上到下惊楼。一共有6種可執(zhí)行類型。
- AppleScript
會在斷點觸發(fā)的時候執(zhí)行Mac OS X內(nèi)置的一種功能強大的腳本語言秸讹,具體寫法可以自行百度AppleScript檀咙。 - Capture GPU Frame
- Debugger Command
會在斷點觸發(fā)的時候執(zhí)行LLDB命令×Ь鳎可以打印對象弧可、修改對象值等功能。 - Log Message
會在斷點觸發(fā)的時候打印日志劣欢。其中@exp@
打印對象值棕诵,exp
為對象名;%B
表示斷點名凿将;%H
表示當(dāng)前斷點觸發(fā)的次數(shù)校套。 - Shell Command
會在斷點觸發(fā)的時候執(zhí)行Shell命令。
Sound
觸發(fā)聲音牧抵。感覺很炫酷笛匙,但沒點用的功能。適合裝逼灭忠。 - Options
是否進入DEBUG界面膳算。勾選這個斷點觸發(fā)后不進入DEBUG界面,斷點打印日志或者聲音斷點一般都勾選弛作。