工欲善其事上枕,必先利其器寄锐。以下是各常用LLDB調(diào)試操作(文章精簡(jiǎn)自http://www.reibang.com/p/d6a0a5e39b0e)
從快捷鍵開(kāi)始
快捷鍵功能 | 命令 |
---|---|
暫停/繼續(xù) | cmd+ctrl+Y |
控制臺(tái)顯示/隱藏 | cmd+Y |
光標(biāo)切換到控制臺(tái) | cmd+shift+C |
清空控制臺(tái) | cmd+k |
step over | F6 |
step into | F7 |
step out | F8 |
開(kāi)始時(shí)候記住cmd+K 以及 cmd+ctrl+Y基本也就夠用了纽绍,當(dāng)然熟悉各種快捷操作會(huì)大大加大Coding時(shí)逼格要尔,提高撩妹(漢) 成功率
HELP
LLDB入門(mén)時(shí)可以通過(guò)和help
查詢命令的意義
終端操作截圖(當(dāng)然可以直接在Xcode的命令行直接輸入 help thread backtrace查看)
查詢命令
p,po
都可以在命令行做變量查詢铁瞒。所不同是·po·是expression -o --
縮寫(xiě)妙色,可以打印對(duì)象而不是對(duì)象指針(可重寫(xiě)對(duì)象description
方法,增加調(diào)試時(shí)可讀性)慧耍,p即是print
身辨,也是expression --
的縮寫(xiě)丐谋,所不同是只會(huì)打印一個(gè)$符號(hào),數(shù)字煌珊,加一段地址信息(不會(huì)打印處description
內(nèi)容号俐,當(dāng)進(jìn)行一些指針BUG調(diào)試時(shí)p更加實(shí)用)。
代碼塊定庵,斷點(diǎn)位置
po操作
po與p的比較
ps:$
符號(hào)在LLDB中代表著變量的分配吏饿。每次使用p后,會(huì)自動(dòng)為你分配一個(gè)變量蔬浙,后面再次想使用這個(gè)變量時(shí)猪落,就可以直接使用。我們可以直接使用這個(gè)地址做一些轉(zhuǎn)換畴博,獲取對(duì)象的信息
修改操作
'e' 即expression
的縮寫(xiě)笨忌,作用為執(zhí)行一個(gè)表達(dá)式(當(dāng)然直接'e' + 變量可以實(shí)現(xiàn)查詢),最主要作用是通過(guò)執(zhí)行表達(dá)式俱病,調(diào)試過(guò)程中動(dòng)態(tài)修改當(dāng)前線程堆棧官疲。
例如上例中判斷位置的斷點(diǎn),
e string = nil
后可實(shí)現(xiàn)動(dòng)態(tài)修改判斷亮隙。
e
操作也可以通過(guò)執(zhí)行表達(dá)式袁余,改變UI。例如修改UI背景色咱揍,判斷布局是否正確
斷點(diǎn)修改前
命令行操作
修改后(注意此時(shí)仍在斷點(diǎn)中颖榜,但頁(yè)面UI已經(jīng)刷新了)
'@improt UIkit'操作在沒(méi)有引入相應(yīng)頭文件時(shí)很必要,此處多余煤裙。UI調(diào)試時(shí)有個(gè)特殊問(wèn)題掩完,當(dāng)斷點(diǎn)或者暫停時(shí),UI更新的線程也被暫停了硼砰,e
修改后的UI當(dāng)然也不會(huì)立即更新且蓬,此時(shí)如果還不想放開(kāi)斷點(diǎn)讓UI更新,可以通過(guò)[CATransaction flush]
表達(dá)式來(lái)進(jìn)行UI刷新操作题翰。例如修改后截圖
PS: 玩轉(zhuǎn)修改操作可以大大減少調(diào)試編譯時(shí)間恶阴,非常有用的技巧。
斷點(diǎn)
1.breakpoint
豹障,GUI如何添加添加沒(méi)必要再說(shuō)了冯事。
- 全局?jǐn)帱c(diǎn)
Add Exception Breakpoint
會(huì)在拋出異常的堆棧自動(dòng)暫停,當(dāng)然實(shí)際開(kāi)發(fā)中靠譜度有限
- 符號(hào)斷點(diǎn)
Add Symbolic Breakpoint
這個(gè)很有趣血公,我在看http://www.reibang.com/p/d6a0a5e39b0e文章前也沒(méi)有留意過(guò)昵仅,當(dāng)開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)有一些Api接口不知道是在什么時(shí)候調(diào)用的,可以通過(guò)在斷點(diǎn)列表中添加
添加[ViewController testCalled]方法被調(diào)用時(shí)候的斷點(diǎn)
斷點(diǎn)觸發(fā)
當(dāng)然自定義的方法可以在實(shí)現(xiàn)里添加斷點(diǎn),但是對(duì)于一些框架接口的調(diào)用調(diào)試時(shí)'Symbolic Breakpoint'就格外有用了
watchpoint
watchpoint可以跟蹤對(duì)象某一字段的修改摔笤,(屬性修改可以在setter方法自己添加斷點(diǎn)觀察够滑,但是屬性字段修改并不一定都會(huì)走setter方法)。值得一提的是watchpoint是直接設(shè)置在變量?jī)?nèi)存地址上的吕世,所以當(dāng)變量被釋放后彰触,watchpoint仍然會(huì)在該內(nèi)存地址上生效.
GUI中可以通過(guò)命令行左邊添加(例:給viewcontroller對(duì)象的testNumber屬性字段添加watchpoint)
testNumber字段被修改
堆棧
1.bt
即thread backtrace
,作用是打印當(dāng)前線程信息命辖。
2.
thread retrun<expr>
渴析,調(diào)試時(shí)候可以直接在斷點(diǎn)位置retrun想要的值。
修改前
修改后
寫(xiě)在最后
做iOS開(kāi)發(fā)這么久終于決定開(kāi)始寫(xiě)自己的博客了吮龄,這篇文章除了整理LLDB知識(shí)外也是為了熟悉下markdown語(yǔ)法