文中相關的調度技巧均在Xcode4.5+環境中完成。
初學者調試技巧推薦聯接:
http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1
http://www.raywenderlich.com/10505/my-app-crashed-now-what-part-2
這篇文章給大家帶來的是一些Xcode實用技巧,比如:
• 擺脫NSlog打印輸出,使用斷點日志。
• 擺脫TODOs注釋來進行編譯警告。
• 使用條件表達式來進行斷點。
• 使用LLDB動態修改數據。
• 等等。
• 設置調試控制台
可以通過cmd+shift+Y組合鍵或按如下方式調出控制台
可以根據習慣,在Xcode\Preferences設置控制台輸出環境,一般設置為控制台+變量視圖顯示。
• 添加異常斷點
通過cmd+6或如下方式進入斷點導航欄。
點擊+添加異常斷點
下面是斷點編輯界面,異常斷點的類型有Object C和C++2種,一般情況下選擇All,當你的代碼中有C++代碼時,如果你只是定位Object C代碼問題,建議選擇Object C,如果你選擇All,在調度過程中可能會在很多C++的代碼處停住,但相關代碼其實並沒有錯誤(筆者現在的項目中碰到了此類問題)。
斷點行為(Action),這個提供了非常強大的功能,能夠在拋出異常的時候,執行Apple腳本,Debugger命令,log打印,執行Shell腳本,還可以播放聲音等等。
Automatically continue after evaluating選項可以使項目運行到斷點時,不進入暫停狀態,常用於斷點打印信息(后面會講到)。
一般使用異常斷點,是為了定位拋出異常的代碼位置,幫助快速解決Bug。
PS:可以在LLDB中輸入bt命令,控制台會列出相關的函數棧Crash信息(LLDB相關使用方法,后面會講到)。
• 運行時修改變量的值
相關LLDB命令:
在下面例子中,斷點處,在LLDB中利用expr命令修改相關變量的值。
(關於expr命令需要說明的是需要知道明確的返回類型,即使返回類型為void,例如expr (void)NSLog(@"test"))
下面我們用斷點來完成相同的功能。先編輯斷點(或cmd+option,點擊斷點),執行相關Debugger命令。
執行輸出結果如下,用斷點,完成了相同的功能,變量值在運行是被改變了。
• 觸發條件斷點
這是一個很有用的技巧,可以檢測程序是束運行在正確的軌道上,條件生效時,進入調度模式,使用方式類似於斷言語句(Assert) 。
程序運行,進入斷點並執行Action。
ps:使用條件斷點時,Automatically continue after evaluating復選框不要勾上,否則斷點永遠不會生效。
• 符號斷點
也是一個非常有用的調試技巧,程序會在遇到特殊符號時進入調試模式,符號可以是一個方法名、類中的一個方法、或者任意C方法(objc_msgSend)。
PS:通常用於觀察你需要關注的方法,比如:-[NSException raise],malloc_error_break,-[NSObject doesNotRecognizeSelector:]等,可以快速幫你定義EXC_BAD_ACCESS等異常問題。
應用啟動后,進入調試模式,並執行Action。
• 一些注釋符號的使用
1、#warning add warning info,使用warning后,編譯會產生警告,加在臨時修改代碼的地方,可以有效的防止錯誤提交代碼等,特別是發布版本的時候,保證無任何編譯警告,可以有效的降低風險。
2、#error add error warning info,error的使用更加嚴格,會讓你的代碼不能通過編譯,適合忽略編譯警告的人使用。
3、// TODO:這里還沒有寫完 優先級:1,TODO不會有編譯問題,它會顯示在跳轉欄里(是不是很醒目),這個可以用來保留任務列表和評論,很實用。