工欲善其事,必先利其器。以下是各常用LLDB調(diào)試操作(文章精簡自http://www.itdecent.cn/p/d6a0a5e39b0e)
從快捷鍵開始
| 快捷鍵功能 | 命令 |
|---|---|
| 暫停/繼續(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 |
開始時(shí)候記住cmd+K 以及 cmd+ctrl+Y基本也就夠用了,當(dāng)然熟悉各種快捷操作會(huì)大大加大Coding時(shí)逼格,提高撩妹(漢) 成功率
HELP
LLDB入門時(shí)可以通過和help查詢命令的意義
終端操作截圖(當(dāng)然可以直接在Xcode的命令行直接輸入 help thread backtrace查看)
查詢命令
p,po都可以在命令行做變量查詢。所不同是·po·是expression -o --縮寫,可以打印對(duì)象而不是對(duì)象指針(可重寫對(duì)象description方法,增加調(diào)試時(shí)可讀性),p即是print,也是expression --的縮寫,所不同是只會(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的縮寫,作用為執(zhí)行一個(gè)表達(dá)式(當(dāng)然直接'e' + 變量可以實(shí)現(xiàn)查詢),最主要作用是通過執(zhí)行表達(dá)式,調(diào)試過程中動(dòng)態(tài)修改當(dāng)前線程堆棧。
例如上例中判斷位置的斷點(diǎn),
e string = nil后可實(shí)現(xiàn)動(dòng)態(tài)修改判斷。
e操作也可以通過執(zhí)行表達(dá)式,改變UI。例如修改UI背景色,判斷布局是否正確
斷點(diǎn)修改前
命令行操作
修改后(注意此時(shí)仍在斷點(diǎn)中,但頁面UI已經(jīng)刷新了)
'@improt UIkit'操作在沒有引入相應(yīng)頭文件時(shí)很必要,此處多余。UI調(diào)試時(shí)有個(gè)特殊問題,當(dāng)斷點(diǎn)或者暫停時(shí),UI更新的線程也被暫停了,e修改后的UI當(dāng)然也不會(huì)立即更新,此時(shí)如果還不想放開斷點(diǎn)讓UI更新,可以通過[CATransaction flush]表達(dá)式來進(jìn)行UI刷新操作。例如修改后截圖
PS: 玩轉(zhuǎn)修改操作可以大大減少調(diào)試編譯時(shí)間,非常有用的技巧。
斷點(diǎn)
1.breakpoint,GUI如何添加添加沒必要再說了。
- 全局?jǐn)帱c(diǎn)
Add Exception Breakpoint
會(huì)在拋出異常的堆棧自動(dòng)暫停,當(dāng)然實(shí)際開發(fā)中靠譜度有限
- 符號(hào)斷點(diǎn)
Add Symbolic Breakpoint
這個(gè)很有趣,我在看http://www.itdecent.cn/p/d6a0a5e39b0e文章前也沒有留意過,當(dāng)開發(fā)過程中經(jīng)常會(huì)有一些Api接口不知道是在什么時(shí)候調(diào)用的,可以通過在斷點(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è)置在變量內(nèi)存地址上的,所以當(dāng)變量被釋放后,watchpoint仍然會(huì)在該內(nèi)存地址上生效.
GUI中可以通過命令行左邊添加(例:給viewcontroller對(duì)象的testNumber屬性字段添加watchpoint)
testNumber字段被修改
堆棧
1.bt 即thread backtrace,作用是打印當(dāng)前線程信息。

2.
thread retrun<expr>,調(diào)試時(shí)候可以直接在斷點(diǎn)位置retrun想要的值。
修改前
修改后
寫在最后
做iOS開發(fā)這么久終于決定開始寫自己的博客了,這篇文章除了整理LLDB知識(shí)外也是為了熟悉下markdown語法















