今天簡單介紹一下斷點(diǎn)以及l(fā)ldb調(diào)試程序汁汗。
每個(gè)程序員都在入門的時(shí)候接觸過斷點(diǎn),也在入門的時(shí)候程序各種崩潰。最開始我相信都是通過NSLog來對程序進(jìn)行調(diào)試找bug的衔憨。那么為什么有了NSLog可以調(diào)試程序還要用lldb調(diào)試呢黑忱?
首先我們要知道NSLog不是簡單的封裝了printf宴抚,NSLog的大量使用會(huì)嚴(yán)重影響程序的運(yùn)行效率,這個(gè)可以從蘋果的API中找到關(guān)于NSLog的詳細(xì)介紹甫煞。
Logs an error message to the Apple System Log facility.
NSLog就不是設(shè)計(jì)作為普通的debug log的菇曲,而是error log。
NSLog也并非是printf的簡單封裝抚吠,而是Apple System Log(后面簡稱ASL)的封裝常潮。
在使用NSLog 時(shí),NSLog會(huì)向ASL寫log楷力,同時(shí)向Terminal寫log喊式,而且同時(shí)會(huì)出現(xiàn)在Console.app中(Mac自帶軟件,用NSLog打出的log在其中全部可見)萧朝;不僅如此岔留,每一次NSLog都會(huì)新建一個(gè)ASL client并向ASL守護(hù)進(jìn)程發(fā)起連接,log之后再關(guān)閉連接检柬。
總之献联,因?yàn)镹SLog的大量使用(特別在循環(huán)中出現(xiàn)NSLog)對我們程序的運(yùn)行造成嚴(yán)重的不良影響,因此我們轉(zhuǎn)投LLDB的懷抱對程序進(jìn)行調(diào)試何址。
LLDB出現(xiàn)在xcode4.3版本之后里逆,之前用的是gdb,不過兩者差別不是很大头朱,熟練使用了gdb那么也能輕易的掌握lldb运悲。
LLDB是Xcode默認(rèn)的調(diào)試器,我們可以直接在xcode的控制臺進(jìn)行輸入lldb命令项钮。
LLDB的命令遵循唯一匹配原則:假如根據(jù)前n個(gè)字母已經(jīng)能唯一匹配到某個(gè)命令班眯,則只寫前n個(gè)字母等效于寫下完整的命令希停。
下面我們通過實(shí)際操作來看看關(guān)于lldb的一些簡單命令
1:首先我們通過打斷點(diǎn)(如上圖點(diǎn)擊24行)看一下最常見的四條命令
p po? exp? call這四條命令我們可以通過輸入help+p或者h(yuǎn)elp+po等等來查看命令的使用介紹
如下:
在我們看完使用介紹之后我們會(huì)發(fā)現(xiàn)它們表示的意思是一模一樣的,換句話來說署隘,這四條命令可以替換使用宠能,只不過輸出結(jié)果有所區(qū)別,這里我以對象為例,也可以輸出基本數(shù)據(jù)類型磁餐。下圖是對四條命令的使用:
上面提到了唯一匹配原則违崇,因此ca能唯一的代表call。如下:
細(xì)心的我突然發(fā)現(xiàn)一個(gè)問題诊霹,那就是輸出結(jié)果$0,$2,$3這些變量是什么意思呢羞延?其實(shí)它們是用來表示之前的self.lab,在之后的打印中我們可以直接使用? 命令+$7,如下圖:
2:接下來再講一些其它常用指令
如上圖程序脾还,運(yùn)行之后肯定直接崩潰伴箩,崩潰信息如下
只需要輸入image lookup -a 地址 就可以找到bug所在的位置
bt :打印當(dāng)前線程調(diào)用的堆棧
bt all? :打印所有線程調(diào)用的堆棧
image :用于尋址
通過指令得到bug位置出現(xiàn)在viewController的m文件31行
3:上面講了通過lldb打印結(jié)果,那么假如我在運(yùn)行的過程中要改變程序的運(yùn)行結(jié)果鄙漏,如果通過代碼直接修改這樣會(huì)很麻煩嗤谚,那么怎么可以非常的改變卻又不修改代碼呢?
這是原來的運(yùn)行結(jié)果怔蚌,那么接下來我要將lab變成黃色怎么操作呢巩步?
我們只需要在控制臺輸入以下命令,按回車鍵最后點(diǎn)擊繼續(xù)執(zhí)行(紅線所示)桦踊。
最后模擬器的結(jié)果如下:
4:剛才我們的程序都是通過中止程序的運(yùn)行來進(jìn)行調(diào)試椅野,那么是否可以不終止程序執(zhí)行也能進(jìn)行調(diào)試呢?
結(jié)果肯定是可以钞钙,那么接下來按住command+option鍵然后點(diǎn)擊斷點(diǎn)鳄橘;或者直接右擊斷點(diǎn)声离,之后會(huì)彈出提示框芒炼,接下來點(diǎn)擊edit breakpoint,彈出如下圖所示的界面术徊。
接下來我們以此分析界面上的幾個(gè)參數(shù)
其中action里面又有幾個(gè)不同的選項(xiàng)本刽,黨執(zhí)行此斷點(diǎn)的時(shí)候,可以同時(shí)執(zhí)行以下幾個(gè)選項(xiàng)
AppleScript:蘋果的腳本語言
Capture GPU Frame:做圖形界面的時(shí)候使用
Debugger Command :debugger調(diào)試的使用赠涮,默認(rèn)就是此項(xiàng)
Log Message:日志信息
Shell Command:可執(zhí)行的文件
Sound:提示的聲音
接下來我們使用一下此斷點(diǎn)子寓,如下圖:
上面的斷點(diǎn)表示的意思是如果lab的背景顏色為紅色就執(zhí)行此斷點(diǎn),執(zhí)行斷點(diǎn)觸發(fā)兩個(gè)動(dòng)作笋除,一個(gè)是將lab的背景顏色改為黃色斜友,一個(gè)是有聲音提示。最后一個(gè)options表示執(zhí)行此斷點(diǎn)不會(huì)中斷程序執(zhí)行
5:這里需要注意的一點(diǎn)直接打印self.lab.frame的時(shí)候垃它,會(huì)提示無此屬性;需要顯示的指定數(shù)據(jù)類型鲜屏,用po(CGRect)[self.lab frame]