一、LLDB
默認(rèn)內(nèi)置于Xcode中的動(dòng)態(tài)調(diào)試工具。標(biāo)準(zhǔn)的 LLDB 提供了一組廣泛的命令,旨在與老版本的 GDB 命令兼容。 除了使用標(biāo)準(zhǔn)配置外,還可以很容易地自定義 LLDB 以滿足實(shí)際需要。在日常的開發(fā)和調(diào)試過程中給開發(fā)人員帶來了非常多的幫助。
二、LLDB語法
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
<command>(命令)和<subcommand>(子命令):LLDB調(diào)試命令的名稱。
<action>:執(zhí)行命令的操作
<options>:命令選項(xiàng)
<arguement>:命令的參數(shù)
[]:表示命令是可選的,可以有也可以沒有
三、常用的LLDB調(diào)試命令
(一)斷點(diǎn)設(shè)置
| 命令 | 效果 |
|---|---|
| breakpoint set -n 某函數(shù)名 | 給某函數(shù)下斷點(diǎn) |
| breakpoint set -n "[類名 SEL]" -n "[類名 SEL]" ... | 給多個(gè)方法下斷點(diǎn),形成斷點(diǎn)組 |
| breakpoint list | 查看當(dāng)前斷點(diǎn)列表 |
| breakpoint disable(enable) 組號(編號) | 禁用(啟用)某一組(某一個(gè))斷點(diǎn) |
| breakpoint delete 編號 | 禁用某一個(gè)斷點(diǎn) |
| breakpoint delete 組號 | 刪除某一組斷點(diǎn) |
| breakpoint delete | 刪除所有斷點(diǎn) |
| breakpoint set --selectore 方法名 | 全局方法斷點(diǎn),工程所有該方法都會(huì)下斷點(diǎn) |
| brepoint set --file 文件名.m --selector 方法名 | 給.m實(shí)現(xiàn)文件某個(gè)方法下斷點(diǎn) |
| breakpoint set -r 字符串 | 遍歷整個(gè)工程,含該字串的方法、函數(shù)都會(huì)下斷點(diǎn) |
| breakpoint command add 標(biāo)號 | 某標(biāo)號斷點(diǎn)過后執(zhí)行相應(yīng)命令,以Done結(jié)束,類似于Xcode界面Edit breakpoint |
| breakpoint command list 標(biāo)號 | 列出斷點(diǎn)過后執(zhí)行的命令 |
| breakpoint command delete | 刪除斷點(diǎn)過后執(zhí)行的命令 |
(二)流程控制
| 命令 | 效果 |
|---|---|
| c continue | 繼續(xù)執(zhí)行 |
| n next | 單步運(yùn)行,將子函數(shù)當(dāng)做整體一步執(zhí)行 |
| ni | 單步運(yùn)行匯編級別 |
| s | 單步運(yùn)行,遇到子函數(shù)會(huì)進(jìn)去 |
| si | 單步運(yùn)行可跳轉(zhuǎn)指令內(nèi)部,匯編級別 |
| finish | 返回上層調(diào)用棧 |
(三)其他命令
| 命令 | 效果 |
|---|---|
| p 語句 | 動(dòng)態(tài)執(zhí)行語句(expression的縮寫),內(nèi)存操作(下同) |
| expression 語句 | 同上,可縮寫成exp |
| po 語句 | 打印對象desc信息 |
| image list | 列出所有加載的模塊 縮寫im li |
| image list -o -f 模塊名 | 只列出輸入模塊名信息,常用于主模塊 |
| bt | 查看當(dāng)前調(diào)用棧 |
| up | 查看上一個(gè)調(diào)用函數(shù) |
| down | 查看下一個(gè)調(diào)用函數(shù) |
| frame variable | 查看函數(shù)參數(shù) |
| frame select 標(biāo)號 | 查看指定調(diào)用函數(shù) |
| dis -a $pc | 反匯編指定地址,此處為pc寄存器對應(yīng)地址 |
| thread info | 輸出當(dāng)前線程信息 |
| b trace -c xxx | 滿足某個(gè)條件后中斷 |
| target stop-hook add -o "frame variable" | 斷點(diǎn)進(jìn)入后默認(rèn)做的操作,這里是打印參數(shù) |
| help 指令 | 查看指令信息 |
| thread return | 不再執(zhí)行往下代碼,直接從當(dāng)前調(diào)用棧返回一個(gè)值 |
| register read | 讀取所有寄存器值 |
| register read $x0 | 讀取x0寄存器值 |
| register write $x1 10 | 修改x1寄存器的值為10 |
| p/x | 以十六進(jìn)制形式讀取值,讀取的對象可以很多 |
| watchpoint set variable p->_name | 給屬性添加內(nèi)存斷點(diǎn),屬性改變時(shí)會(huì)觸發(fā)斷點(diǎn),可以看到屬性的新舊值,類似KVO效果 |
| watchpoint set expression 變量內(nèi)存地址 | 效果同上。 |
四LLDB高級調(diào)試
(一)、使用Python腳本
lldb提供了很多(API)[https://lldb.llvm.org],可以使用Python腳本調(diào)用。
開源庫:
chisel :Facebook開源LLDB命令工具
LLDB:Derek Selander開源的工具
chisel安裝:

安裝成功后,重啟Xcode或者在lldb下輸入commdnd source ~/.lldbinit,即可使用chisel.
LLDB安裝:
git clone代碼,配置~/.lldbinit
command script import /opt/LLDB/lldb_commands/dslldb.py
(二)、常用命令用法
以下參數(shù)address均為對象內(nèi)存地址
| 命令 | 效果 |
|---|---|
| pviews | 打印當(dāng)前界面結(jié)構(gòu)和View,如果出錯(cuò),先導(dǎo)入U(xiǎn)IKit |
| pvc | 打印主窗口所有ViewController |
| methods address | 打印類的所有方法以及對應(yīng)的IMP地址 |
| ivars address | 打印類所有的成員變量 |
| presponder address | 打印控件的響應(yīng)鏈 |
| pactions address | 打印控件的action |
| pblock address | 打印block的信息,IMP地址、簽名,參數(shù)為block地址 |
| search UIButton | 搜索當(dāng)前界面下的所有UIButton類及其子類,其他控件同理 |
| flicker address | 快速顯示和隱藏視圖,以快速幫助可視化它的位置 |
| dismiss <viewController> | dismiss一個(gè)正在顯示的控制器 |
| visualize address | 預(yù)覽UIImage,CGImageRef, UIView, CALayer, NSData (of an image), UIColor, CIColor, or CGColorRef類型的對象 |
| fv classNameRegex | 匹配給出的類名正則表達(dá)式,在當(dāng)前界面結(jié)構(gòu)View的繼承層次上查找視圖 |
| fvc classNameRegex | 匹配給出的類名正則表達(dá)式,在當(dāng)前界面結(jié)構(gòu)ViewController的繼承層次上查找VC |
| show/hide address 、tv address | 顯示或隱藏某個(gè)view或者layer,無須繼續(xù)程序執(zhí)行,即時(shí)性。經(jīng)測試,show的時(shí)候不用,hide的時(shí)候需要resuming |
| mask/unmask address | 在某個(gè)view/layer上覆蓋一層view,主要是定位目標(biāo)視圖、層的范圍 |
| border/unborder address | 在某個(gè)view/layer上添加邊框,查找目標(biāo)的位置 |
| caflush | 強(qiáng)制核心動(dòng)畫刷新,將重新繪制UI,可能會(huì)打亂正在進(jìn)行的動(dòng)畫 |
| bmessage <expressign> | 在類的方法或?qū)嵗姆椒ㄉ显O(shè)置符號斷點(diǎn),不必?fù)?dān)心層次結(jié)構(gòu)中的哪個(gè)類實(shí)際實(shí)現(xiàn)了該方法,eg:bmessage -[0x1063e0290 continueButtonClicked] |
| wivar <object> <ivarName> | 給某對象實(shí)例變量設(shè)置一個(gè)watchpoint |
| sbt | 打印還原符號表的函數(shù)調(diào)用棧 |
五、小結(jié)
LLDB調(diào)試工具十分強(qiáng)大,以上 介紹的只是一些常用的命令,,如需要更詳細(xì)的命令請查詢LLDB 的官方API文檔