LLDB除錯利器及高階用法

Qinz
LLDB全稱Low Level Debugger ,並不是低水平的偵錯程式,而是輕量級的高效能偵錯程式,預設內置於Xcode中。能夠很好的運用它會使我們的開發效率事半功倍,接下來將講解lldb常用命令及一些高階用法。下面將不會講解命令的基本格式及命令的縮寫來源,我會把重點放在常用命令的使用方式和技巧上。
一、 LLDB常用除錯命令
❶ p、po及 image命令
-
是列印物件,
是列印物件的description,演示如下:
01
-
命令修改變數,演示如下:
02
-
用於尋找棧地址對應的程式碼位置,演示如下:
03
- 3.1 從上圖中我們可以看到當程式崩潰時並不能定位到指定的程式碼位置,使用image定址命令可以定位到具體的崩潰位置在viewDidLoad方法中的第51行。
04
- 3.2 這裡說明為什麼是程式的名稱,因為LLDBDebug在編譯後就是一個Macho的可執行檔案,也可以理解為映象檔案,image並不是影象的意思,而是代表映象。這裡跟上我們自己的工程名,即用image定位定址才是尋找我們自己的程式碼。
❷ bt及frame命令
- 使用
命令可以檢視函式呼叫堆疊,然後用
命令即可檢視對應函式詳細,演示如下:
05
- 1.1 上面函式執行的順序如下:點選登入按鈕--驗證手機號--驗證密碼--開始登入。
- (IBAction)login:(UIButton *)sender { [self validationPhone]; } #pragma mark --驗證手機號 -(void)validationPhone{ [self validationPwd]; } #pragma mark --驗證密碼 -(void)validationPwd{ [self startLogin]; } #pragma mark --開始登陸 -(void)startLogin{ NSLog(@"------開始登入...------"); }
- 1.2 從
命令的列印資訊中,我們可以很清楚看到函式呼叫順序,如下圖:
06
- 1.3 接下來我們執行
命令即可以檢視函式相關資訊,同時配合
和
命令追蹤函式的呼叫和被呼叫關係,演示如下:
07
- 1.4 同時可以使用
很方便的查方法的呼叫者及方法名稱,如下圖:
08
❸ breakpoint命令
-
命令給函式下斷點,演示如下圖:
09
- 1.1 當我們的斷點下成功後,控制檯會列印如下資訊:
Breakpoint 1: where = LLDBDebug`-[ViewController login:] at ViewController.m:53, address = 0x00000001034fb0a0
- 1.2 我們可以看到斷點的位置在.m檔案的53行,Breakpoint 1這裡的1代表的是編號為1的組斷點。
- 使用
我們可以看到斷點的數量,同時使用
後面跟上組號,即可刪除,演示如下:
10
-
的
,
,
以及
命令,對應關係如下圖:
11
- 3.1 我們執行
,
,
及
命令演示如下:
12
❹ breakpoint命令
1.target stop-hook add -o "frame variable"每次進入斷點都會自動列印詳細的引數資訊,演示如下:

13
二、 LLDB高階用法

14
- 1.1
命令可以列印當前物件的屬性和方法,如下所示:
(lldb) methods p1 <Person: 0x60000003eac0>: in Person: Properties: @property (copy, nonatomic) NSString* name;(@synthesize name = _name;) @property (nonatomic) long age;(@synthesize age = _age;) Instance Methods: - (void) eat; (0x1098bf3e0) - (void) .cxx_destruct; (0x1098bf4f0) - (id) description; (0x1098bf410) - (id) name; (0x1098bf430) - (void) setName:(id)arg1; (0x1098bf460) - (void) setAge:(long)arg1; (0x1098bf4c0) - (long) age; (0x1098bf4a0) (NSObject ...)
- 1.2
命令可以列印當前檢視的層級結構,如下所示:
(lldb) pviews <UIWindow: 0x7fd1719060a0; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x60c000058660>; layer = <UIWindowLayer: 0x60c0000364c0>> | <UIView: 0x7fd16fc06d10; frame = (0 0; 414 736); alpha = 0.8; autoresize = W+H; layer = <CALayer: 0x60000003e7e0>> || <UIButton: 0x7fd16fe0b520; frame = (54 316; 266 53); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x60400003b040>> ||| <UIButtonLabel: 0x7fd16fe023f0; frame = (117.667 17.6667; 30.6667 18); text = '登入'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x60400008ac80>> |||| <_UILabelContentLayer: 0x600000220260> (layer) || <UILabel: 0x7fd16fc04a60; frame = (164 225; 80 47); text = 'Qinz'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x600000088fc0>> (lldb)
- 1.3 如果你在原生的XCode中,是敲不出這些命令的,上面只是演示了兩個常見的LLDB外掛命令的用法,更加高階的用法下面會詳細說明。不過在這之前,我們要安裝兩個外掛,接下來先講解環境的配置。
❷ LLDB外掛配置:chisel及LLDB
- 2.1 chisel是facebook開源的一款LLDB外掛,裡面封裝了很多好用的命令,當然這些命令都是基於蘋果提供的api。 chisel下載
- 2.2 這裡建議使用包管理工具Homebrew來安裝,然後配置指令碼路徑,演示如下:
15
- 2.3 然後在lldb視窗執行命令,演示如下:
16
- 2.4 看到輸出"command script import /usr/local/opt/chisel/libexec/fblldb.py"即代表安裝成功,這裡還會看到一個"command script import /opt/LLDB/lldb_commands/dslldb.py
"路徑,這是我們接下來要安裝的第二個外掛。
Executing commands in '/Users/Qinz/.lldbinit'. command script import /usr/local/opt/chisel/libexec/fblldb.py command script import /opt/LLDB/lldb_commands/dslldb.py (lldb)
- 2.5 這個外掛的名稱也叫LLDB, LLDB下載 。我們先clone檔案,我這裡放置在opt資料夾下,你可以選擇自己的檔案目錄放置,然後依次找到dslldb檔案,在~/.initlldb檔案中配置路徑,演示如下:
17
- 2.6 接下來依然在lldb視窗執行 command source ~/.lldbinit命令。到此LLDB外掛的配置環境完成,接下來我們講解這些外掛的實用命令。
❸ lldb高階用法

18
- 1.1 taplog是點選控制元件,會列印控制元件的地址,大小及透明度等資訊,我們拿到地址後執行flicker 0x7fd321e09710命令,此時控制元件會進行閃爍,這裡動態圖顯示的閃爍效果明顯。

19

20
- 3.1 當我們執行
命令後會進入動態除錯階段,會出現以下五個命令,每個命令我做了詳細註釋如下:
(lldb) vs 0x7fe73550a090 Use the following and (q) to quit. (w) move to superview //移動到父檢視 (s) move to first subview //移動到第一個子檢視 (a) move to previous sibling//移動上一個兄弟檢視 (d) move to next sibling//移動下一個兄弟檢視 (p) print the hierarchy//列印檢視層級結構

20

21
- 5.1 這裡的-c即是color,-w即設定邊框的寬度。通過這個命令我們可以很方便的檢視邊框的邊緣的問題,而不需要每次重啟執行。

22

23
8. 這個命令會重新渲染,即可以重新繪製介面, 相當於執行了 [CATransaction flush] 方法,演示如下:

24

25

26
- 10.1 上面的搜尋會搜尋所用映象模組,我們重點看與我們工程名字相同的模組,即可檢視哪些地方呼叫了這些方法。

27
總結:上面詳細講解了LLDB常用命令及高階命令的用法,熟練掌握必定會使你的Debug能力提升不少,大幅度提高開發效率。
我是Qinz,希望我的文章對你有幫助。