1.斷點調試App
a.設置常規(guī)斷點
添加斷點:在xcode中代碼編輯器中右邊單擊你想調試的代碼處就可以添加斷點,再次單擊可以停用斷點,添加斷點后右鍵點擊斷點可以刪除斷點或者快捷鍵(command+\)。
b.編輯斷點
條件斷點在斷點上按住ctrl再鼠標單擊或者右鍵單擊茶宵,可以彈出編輯斷點菜單须肆,在這里我們可以為斷點設置特殊條件尝胆。
下面我們?yōu)檫@段代碼添加斷點并添加如下條件:
)
上面的意思就是只有當i==10的時候斷點才會觸發(fā)键袱。還有一個地方是當我們勾選Automatically continue after evaluating actions
之后程序進入斷點不會中斷執(zhí)行鹉动,只會執(zhí)行我們的action,如果不勾選程序則會和普通斷點一樣爪喘,暫停程序颜曾,等待用戶命令。

可以執(zhí)行AppleScipt(蘋果自己的腳本語言)秉剑,還有capture GPU Frame這個功能現在基本沒撒用了泛豪,最新的調試gpu都采用instruments來調試了,主要常用是打印日志或者播放一段聲音侦鹏,或者執(zhí)行一段shell腳本诡曙。
c.單步執(zhí)行,斷點管理
斷點執(zhí)行面板下面來認識一下調試斷點的界面略水,當程序執(zhí)行到一個斷點的時候价卤,會在xcode下方出現如下面板。
上面四個紅色框中的按鈕分別表示渊涝,1.繼續(xù)執(zhí)行 2.單步執(zhí)行(依次執(zhí)行下一行代碼) 3.進入函數(當前代碼是調用其他方法會進入到該方法) 4.跳出函數
藍色標簽點擊后可以停用所有斷點慎璧。
斷點管理面板
在xcode左側面板第7個tab下是斷點管理面板(command+7),在這里可以管理整個項目中的斷點跨释。這里可以清空所有斷點胸私,或著停用某些斷點。在這里點擊斷點右鍵可以看到又個share BreakPoint選項煤傍,選擇該選項后該斷點會出現在shared下方盖文,這樣這個斷點會被分享給團隊內的所有成員。
d.異常斷點蚯姆,符號斷點(hold住全局異常,快速定位出錯代碼行)
在其他語言或者程序中當程序出現崩潰五续,一般來說調試器會告訴開發(fā)中那一行代碼拋出了異常,但是在ios中會直接報錯跳到程序入口main函數中return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
這讓我們調試起來很痛苦龄恋,但是我們只需要在斷點管理面板的下方添加全局斷點handle所有Exception這樣當有代碼拋出異常崩潰的時候疙驾,xcode就會自動跳到相應代碼行。
添加成功后就會處理所有的Exception

你也可以添加Symbolic Breakpoint這種斷點允許你配置catch指定異常情況郭毕。
2.lldb調試器
LLDB 是一個有著REPL的特性和 C++ ,Python 插件的開源調試器它碎。LLDB 綁定在 Xcode 內部,存在于主窗口底部的控制臺中显押。http://lldb.llvm.org/lldb-gdb.html 這里是一份lldb命令清單扳肛,列出了lldb可用的命令。
c.打印對象(po)
使用po(print out)命令可用輸出對象信息:
a.打印最基本的內容 (p)
使用p(print)可用輸出對象并且為對象該對象會保存在lldb中的一個變量中
這里所有$美元符號后面的變量都是lldb中的乘碑。
接下來我們可以使用這個變量進行計算

我們可以看到p(print)命令和e(expression)命令貌似差不多挖息,可以使用help p查看到p命令其實是對expression命令的一個縮寫包裝'p' is an abbreviation for 'expression --'
現在我們可以在lldb中獲取變量的值以及計算表達式的結果了。但是經常我們的需求是兽肤,在斷點中發(fā)現某些變量期待的值和我們想象的不一樣套腹,這時候我們要修改這個值怎么辦绪抛?
d.修改運行時變量值
這當然也是一件很簡單的事情,像下面這樣电禀,我們使用p命令給frame.size.height 賦值到$23 然后直接修改$23的值即可
需要注意的是修改了內存中的值需要執(zhí)行下一步才會在程序中體現出來幢码。最簡單就是在lldb中再輸入n。
e.lldb控制斷點流程
在lldb中有幾個簡單的命令用來控制斷點流程尖飞,方便調試無需點擊xcode上的控制流程了症副。
上圖上的控制按鈕分別對應lldb中的c(continue),n(thread step-over,next),s(thread step in葫松,step),finish(thread step-out)
就是c瓦糕,n,s腋么,finish。
frame info:列出當前所在文件以及當前所在代碼行
列出斷點:br li(break point list)
添加斷點:br set(br set -f HomeContactViewController.m -l 122)
刪除斷點:br del
caflush:更新界面
lldb模擬函數返回值
當我們發(fā)現一個函數我們不想執(zhí)行亥揖,只需要得到它的結果的時候珊擂,我們可以用lldb來完成這一件事。
在我們進入一個函數中后费变,我們可以使用 thread return [value]來直接返回該函數的值而不用執(zhí)行摧扇。
3.利用facebook開源組件chisel增強llvm調試功能
chisel是facebook編寫的一套擴展lldb命令的工具,下面是它的主頁
https://github.com/facebook/chisel
推薦幾個我常用的調試相關的軟件和插件:
網絡相關:charles chrome插件postman
xcode插件:
Go to sandbox(快速定位到模擬器沙盒)
MCLog(過濾調試日志信息)
參考資料:
http://www.peterfriese.de/debugging-tips-for-ios-developers/
http://www.cnblogs.com/stoic/archive/2012/07/10/2584967.html