是什么 -》有什么用 -》怎么用
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幫助文檔

二、打印
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 --"

三、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)

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á)到效果。

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

六、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)用的返回值

八、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)行啦。