iOS調(diào)試工具 - LLDB 簡(jiǎn)單使用

是什么 -》有什么用 -》怎么用

LLDB是一個(gè)調(diào)試器,功能較為強(qiáng)大,集成在xcode的內(nèi)部。

調(diào)試代碼有多種方法,但當(dāng)你用打印方式調(diào)試時(shí)不僅影響效率,而且整個(gè)過(guò)程有些許low,用lldb不僅高效率,面試也是一大加分點(diǎn)哦。

lldb調(diào)試工具怎么用呢?以下就列舉出lldb的簡(jiǎn)單使用,首先我們打開(kāi)xcode,在xcode主窗口底部的控制臺(tái)中進(jìn)行一些操作。

一、Help命令

當(dāng)接觸一個(gè)新功能或者安裝一新軟件時(shí),感覺(jué)無(wú)從下手,首先用Help命令。再不行就help help,就會(huì)列出所有的lldb命令,再根據(jù)你所需要的選擇相應(yīng)的命令就能達(dá)到你的效果。也可以用help + 具體命令,查看其詳情。apropos file 命令則是搜索LLDB幫助文檔


help.png

二、打印

1.print/p 打印一些基本數(shù)據(jù) 當(dāng)打印對(duì)象時(shí)只是個(gè)指針,看不出東西 用help print 可以看到輸出 'print' is an abbreviation for 'expression --' 是"expression --"的簡(jiǎn)稱
2.po 打印oc對(duì)象,也可以是基本數(shù)據(jù) 簡(jiǎn)稱為"expression -O --"


image.png

三、Breakpoint

直接用寫(xiě)命令的方式打斷點(diǎn)、調(diào)試、編輯斷點(diǎn)信息。
1. b 某文件.m:30 給某文件的第30行打個(gè)斷點(diǎn)
2.br l 列出當(dāng)前工程的所有斷點(diǎn)信息
3.br delete n 刪除第n個(gè)斷點(diǎn)
4.br enable n 使第n個(gè)斷點(diǎn)有效
5.br disable n 使第n個(gè)斷點(diǎn)失效
6.br set -n 某方法 設(shè)置關(guān)于這個(gè)方法的符號(hào)斷點(diǎn),在調(diào)用這個(gè)方式時(shí),程序都會(huì)暫停
7.br mod -c "某文件" n 設(shè)置條件斷點(diǎn)

image.png

8.Continue 簡(jiǎn)稱c 斷點(diǎn)繼續(xù)執(zhí)行 直接輸入在lldb控制臺(tái)上
9.stepOver 簡(jiǎn)稱n 一步一步執(zhí)行方法
10.stepInto 簡(jiǎn)稱s 進(jìn)入方法調(diào)用里面
11.stepOut 簡(jiǎn)稱finish 跳出方法調(diào)用

四、Expression

1.expr 簡(jiǎn)單的打印操作 expre -- 相當(dāng)于print expre -O --相當(dāng)于po
2.expr+結(jié)構(gòu)體 可以打印結(jié)構(gòu)體的值
3.expr + 變量賦值 這個(gè)會(huì)改變變量的值 expression a = 20
4.expr+方法調(diào)用 可以給在運(yùn)行時(shí)加一些行為
如下圖,在斷點(diǎn)處調(diào)用增加轉(zhuǎn)換背景色的方法。是不是特別方便,不需要重新編輯代碼,也不用重新運(yùn)行就可以達(dá)到效果。


image.png

五、Frame

運(yùn)行時(shí)直接查看變量的值
1.frame variable 直接查看當(dāng)前變量的值
2.frame variable 變量名 查看指定變量名的值


image.png

六、Backtrace

bt 當(dāng)程序crash掉時(shí),可以用bt查看程序運(yùn)行時(shí)函數(shù)調(diào)用的堆棧信息
bt all
bt 顯示的是當(dāng)前線程函數(shù)調(diào)用的信息,可以加all顯示所有線程的堆棧信息

七、Thread

可以操作線程,顯示當(dāng)前線程信息,在運(yùn)行時(shí),直接改變方法調(diào)用的返回值
1.thread list 顯示所有線程信息
2.thread select n 選擇第n個(gè)線程
3.thread backtrace 顯示當(dāng)前thread的堆棧信息
4.thread backtrace all 顯示所有thread的堆棧信息
5.thread until i 使線程運(yùn)行,并在第i行時(shí)停下
6.thread return 返回值 直接改變當(dāng)前方法調(diào)用的返回值


image.png

八、Command

1、command script import "文件路徑/文件名"
導(dǎo)入已有的腳本文件,在調(diào)試時(shí)可以直接用這個(gè)文件
2、command import "文件路徑/文件名"
導(dǎo)入已有的 lldb 調(diào)試腳本文件
3、command unalias pf
刪除用戶自定義的 aliases
4、command history 打印在當(dāng)前運(yùn)行狀態(tài)下,lldb 調(diào)試時(shí)command 歷史。

九、Script

lldb 內(nèi)置了 Python 的腳本解釋器,可以解釋運(yùn)行 Python 代碼
1.breakpoint command add -s python n 給第n個(gè)斷點(diǎn)添加python代碼
2.breakpoint command add -F "python文件名"."python方法名" n
給第n個(gè)斷點(diǎn)添加導(dǎo)入的 python 文件中的方法調(diào)用

十、Watchpoint

當(dāng)變量變化時(shí),程序暫停,顯示W(wǎng)atchpoint的變化
1.Watchpoint list 顯示當(dāng)前所有Watchpoint
2.watchpoint set variable 變量名 給變量設(shè)置watchpoint
3.watchpoint modify -c "條件" n 給第n個(gè)斷點(diǎn)添加條件,只有滿足條件時(shí),watchpoint 才會(huì)觸發(fā)
4.watchpoint modify -c "" n
條件置空時(shí),即為給這個(gè) watchpoint 刪除條件
5.watchpoint set expression -- 內(nèi)存地址
對(duì)任意內(nèi)存地址進(jìn)行觀察
十一、Alias
當(dāng)遇到較為復(fù)雜的命令,可以給這些命令定義一個(gè)別名,每次調(diào)用別名即可
1.command alias "別名" 具體命令 給具體命令設(shè)置一個(gè)別名 但這種只在當(dāng)前運(yùn)行過(guò)程有效
2.也可永久保存使用 LLDB在啟動(dòng)時(shí)會(huì)讀取~/.lldbinit文件,所以可以打開(kāi)這文件自己操作并保存。

十二、其他
image的用法也蠻多
1.可以查看工程中的庫(kù) image list
2.當(dāng)我們有一個(gè)地址,想查找這個(gè)地址具體對(duì)應(yīng)的文件位置,可以使用image lookup --address,簡(jiǎn)寫(xiě)為image lookup -a
3.當(dāng)我們想查找一個(gè)方法或者符號(hào)的信息,比如所在文件位置等。我們可以使用image lookup --name,簡(jiǎn)寫(xiě)為image lookup -n。
4.image lookup --type 查看具體類型

Chisel 是 Facebook 開(kāi)源的一款 lldb 命令集合文件,我們可以直接使用一些定義好的 lldb 命令來(lái)調(diào)試程序。
安裝十分簡(jiǎn)單,確保 Mac 已經(jīng)安裝了 homebrew 環(huán)境
$ brew update
$ brew install chisel  即可安裝

其實(shí)剛開(kāi)始開(kāi)發(fā)時(shí)就簡(jiǎn)單的用了下po,直到有次面試被問(wèn)還會(huì)些其他lldb命令么,當(dāng)時(shí)有點(diǎn)蒙,才開(kāi)始多學(xué)多用。
只有在調(diào)試過(guò)程中多用,才能感覺(jué)到它的便利,再也不用NSLog一堆日志啦,再也不用就為了個(gè)小驗(yàn)證就改代碼重新運(yùn)行啦。

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

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載 與調(diào)試器共舞 - LLDB 的華爾茲: https://objccn.io/issue-19-2/ 推薦:i...
    F麥子閱讀 3,459評(píng)論 0 10
  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    我是啊梁閱讀 888評(píng)論 1 1
  • [轉(zhuǎn)]淺談LLDB調(diào)試器文章來(lái)源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc閱讀 2,735評(píng)論 2 6
  • LLDB的Xcode默認(rèn)的調(diào)試器,它與LLVM編譯器一起,帶給我們更豐富的流程控制和數(shù)據(jù)檢測(cè)的調(diào)試功能。平時(shí)用Xc...
    小笨狼閱讀 20,823評(píng)論 31 186
  • ??LLDB的Xcode默認(rèn)的調(diào)試器,它與LLVM編譯器一起,帶給我們更豐富的流程控制和數(shù)據(jù)檢測(cè)的調(diào)試功能。平時(shí)用...
    Thinkdifferents閱讀 1,972評(píng)論 1 4

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