LLDB調(diào)試

一、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安裝:


A70626E40DCD164BE3E3D8C8BE31F2E7.png

安裝成功后,重啟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文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容