開發(fā)這么長(zhǎng)時(shí)間朴读,現(xiàn)在才知道原來(lái)有l(wèi)ldb這個(gè)東西谢翎,感覺真是找到救星了捍靠,以后再也不用再一個(gè)一個(gè)添加NSLog,然后再command+R來(lái)調(diào)試森逮。
簡(jiǎn)單的使用
一般情況下榨婆,我們最常用的命令有三個(gè),p, po, expr褒侧。
p 其主要功能是輸出原生類型(boolean良风、integer、float闷供、etc)的信息烟央。
po 其主要功能是輸出objective-c中對(duì)象(objects)的信息
expr 在運(yùn)行時(shí)修改變量的值。
使用方法
1歪脏、 **p, po **打印變量的值
在xcode中打開一個(gè)app疑俭,在想要break的行號(hào)上單擊,即可生成一個(gè)深色的箭頭標(biāo)識(shí)--斷點(diǎn)婿失。如下圖钞艇,在viewDidLoad:中設(shè)置了斷點(diǎn)。
運(yùn)行app豪硅,等待哩照。。懒浮。就可以看到xcode在斷點(diǎn)處進(jìn)入調(diào)試模式飘弧,現(xiàn)在讓我們把視線移到xcode右下角的控制臺(tái),有木有看到(lldb)這樣一行砚著,鼠標(biāo)移到此行眯牧,輸入
po [self view]
回車,看看控制臺(tái)上是不是多了一些view的信息赖草,如下圖:
po(printobject)是LLDB的一個(gè)命令学少,其主要功能是輸出objective-c中對(duì)象(objects)的信息,與之相似的另外一個(gè)命令是p(print)秧骑,其主要功能是輸出原生類型(boolean版确、integer扣囊、float、etc)的信息绒疗。
控制臺(tái)輸入
p (int)[[[self view] subviews] count]
結(jié)果如下(int) $2 = 2
注意這個(gè)使用了類型轉(zhuǎn)換告知調(diào)試器應(yīng)該如何處理返回值侵歇。
2、expr:運(yùn)行時(shí)修改變量的值
你以前怎么驗(yàn)證是不是某個(gè)變量的值導(dǎo)致整段程序不能正常工作吓蘑?修改代碼中的變量的值惕虑,然后cmd+r重新啟動(dòng)app?現(xiàn)在你不需要這么做了磨镶,只需要設(shè)置一個(gè)斷點(diǎn)溃蔫,當(dāng)程序在這進(jìn)入調(diào)試模式后,使用expr命令即可在運(yùn)行時(shí)修改變量的值琳猫。
假如有一個(gè)loginWithUsername:
方法伟叛,需要兩個(gè)參數(shù):username,password脐嫂。
首先設(shè)置好斷點(diǎn)统刮,如下圖所示:
運(yùn)行app,進(jìn)入斷點(diǎn)模式后账千,在(lldb)后輸入
expr username =@"username"
expr password =@"badpassword"
控制臺(tái)會(huì)返回以下信息
(NSString *) $0 =0x3d3504c4 @"username"
(NSString *) $1 =0x1d18ef60 @"badpassword"
現(xiàn)在跳出斷點(diǎn)侥蒙,執(zhí)行斷點(diǎn)之后的兩條輸出語(yǔ)句,控制臺(tái)會(huì)有以下輸出
(0x1c59aae0) A line for the breakpoint
(0x1c59aae0) Username andPassword after: username:badpassword
看到看吧匀奏,我們?cè)谶\(yùn)行時(shí)修改了變量的值辉哥,事情還可以變的更簡(jiǎn)單一些,我們可以編輯斷點(diǎn)攒射,讓它自動(dòng)填充需要的修改的變量的值醋旦,并且可以選擇在此斷點(diǎn)處不進(jìn)入斷點(diǎn)模式,僅僅修改指定變量的值会放,然后自動(dòng)執(zhí)行后續(xù)代碼饲齐。
右擊斷點(diǎn)選擇“EditBreakpoint...”(或者按住cmd+option,單擊斷點(diǎn))咧最,然后如下圖所示設(shè)置斷點(diǎn)
注意選中了最后一行(“Automatically continue afterevaluating”)的選擇框捂人,這就保證運(yùn)行到這個(gè)斷點(diǎn)的時(shí),填充變量的值矢沿,然后繼續(xù)運(yùn)行滥搭,并不在此處斷點(diǎn)進(jìn)入調(diào)試模式。
運(yùn)行app捣鲸,你會(huì)得到和上述手動(dòng)設(shè)置變量的值一樣的輸出瑟匆。
接下來(lái)單擊斷點(diǎn),使其處于禁用狀態(tài)栽惶,現(xiàn)在箭頭的顏色應(yīng)該是淺藍(lán)色的愁溜,重新運(yùn)行app疾嗅,你會(huì)發(fā)現(xiàn)username和password的值沒有在運(yùn)行時(shí)被改變了。
3冕象、設(shè)置斷點(diǎn)觸發(fā)條件
斷點(diǎn)的另外一個(gè)重要作用代承,是可以設(shè)置觸發(fā)斷點(diǎn)生效的條件,這樣我們就可以在運(yùn)行時(shí)針對(duì)特定的數(shù)據(jù)進(jìn)行分析渐扮,觀察app是否運(yùn)行在正確的軌道上论悴。如下圖:
上述截圖可以看到如下語(yǔ)句
(BOOL)[(NSString*)[itemvalueForKey:@"ID"] isEqualToString:@"93306"]
通過這行語(yǔ)句,我們告訴編譯器:當(dāng)item中ID等于93306時(shí)墓律,此斷點(diǎn)生效膀估,進(jìn)入斷點(diǎn)調(diào)試模式。
4只锻、格式化輸出數(shù)據(jù)
如果你厭倦了代碼里無(wú)窮無(wú)盡的NSLog玖像,幸運(yùn)的是我們可以在編輯斷點(diǎn)使其輸出格式化字符串就像平常編碼時(shí)一樣紫谷。不過有一點(diǎn)需要注意齐饮,平常編碼時(shí)可能會(huì)使用NSString‘s stringWithFormat:輸出格式化字符串,不過這個(gè)方法貌似在斷點(diǎn)中木有效果笤昨,你需要使用alloc/init形式的方法祖驱,如下:
po [[NSString alloc]initWithFormat:@"Item index is:%d", index]
簡(jiǎn)單捺僻!強(qiáng)大!這就是LLDB給你的選擇崇裁,從此代碼里可以不用再有NSLog滿天飛的情況了匕坯,代碼變得更干凈了,心情變得更愉悅了拔稳!
LLDB還有很多強(qiáng)大的地方葛峻。
如果想要有更了了解可以搜索這篇文章:
淺談LLDB調(diào)試器
熟練使用 LLDB,讓你調(diào)試事半功倍