iOS LLDB調(diào)試

LLDB是XCode內(nèi)置調(diào)試工具


1.png

我們加了斷點(diǎn),然后在運(yùn)行到斷點(diǎn)處就停了下來,接下來我們看到lldb這里了嗎?我們可以通過lldb所提供的命令來操作。

常用p、po、call命令

從官方的描述來看,p、print、call是一樣的,但是po就不太一樣了,輸入一樣但是輸出不一樣。po的輸出的是具體對象的內(nèi)容。

lldb聲明變量

我們可以使用e命令定義變量,然后在調(diào)試中使用??慈缦碌睦樱?/p>

(lldb) e NSString *$str = @"http://www.huangyibiao.com"
(lldb) po $str
http://www.huangyibiao.com
 
(lldb) e int $count = 10
(lldb) p $count
(int) $count = 10
(lldb) e NSArray *itemArray = @[@"Test", @"Demo", @"huangyibiao"]
(lldb) po $count
10
 

我們使用e聲明了$str變量,然后下面就可以使用了。我們看到通過p命令打印出來的都是$開頭的變量了嗎?我們在聲明和使用時(shí)也需要加上$符號(hào),與PHP一樣!

在調(diào)試時(shí),有時(shí)候想臨時(shí)計(jì)算一下某個(gè)值來比較時(shí),就可以通過這種方式來實(shí)現(xiàn)了,再也不用到源代碼處添加上聲明實(shí)現(xiàn)然后添加一句打印了,是否便利了很多?

調(diào)用變量的API

當(dāng)我們在斷點(diǎn)處,定義了blogName變量了,因此我們可以通過調(diào)試命令來調(diào)用

(lldb) po [blogName uppercaseString]
標(biāo)哥的技術(shù)博客
 
(lldb) po [blogName substringFromIndex:2]
的技術(shù)博客
強(qiáng)轉(zhuǎn)返回值類型

當(dāng)我們調(diào)用API返回值類型不指定時(shí),有時(shí)候所打印出來的東西是我們看不懂的,比如下面的獲取結(jié)果應(yīng)該是“標(biāo)”字,但是不同類型打印結(jié)果卻不一樣:

(lldb) po [blogName characterAtIndex:0]
26631
 
(lldb) po (unsigned int)[blogName characterAtIndex:0]
26631
 
(lldb) po (char)[blogName characterAtIndex:0]
'\a'
 
(lldb) po (NSString *)[blogName characterAtIndex:0]
0x0000000000006807
 
(lldb) po (unichar)[blogName characterAtIndex:0]
U+6807 u'標(biāo)'
設(shè)置斷點(diǎn)觸發(fā)條件

看下圖,筆者是怎么設(shè)置觸發(fā)條件的:

2.png

我們在NSLog這一行,設(shè)置了條件,只有當(dāng)條件滿中時(shí),才會(huì)進(jìn)入斷點(diǎn),不過這里并沒有讓它進(jìn)入斷點(diǎn),而條件滿足時(shí)就發(fā)出聲音并打印提示語。

這種應(yīng)用場景主要是在循環(huán)遍歷數(shù)據(jù)時(shí),想要斷點(diǎn)跟蹤就只能通過這種方式了,除非添加NSLog打印,但是這種需要手動(dòng)添加代碼,在調(diào)試時(shí)才想到要添加一些打印語句,這時(shí)候又得重新運(yùn)行,這太慢了。如果懂得如何設(shè)置斷點(diǎn)條件,那么就能滿足我們的需求了,直接可以設(shè)置條件。

常用打印視圖層次結(jié)構(gòu)

當(dāng)我們想要知道某個(gè)視圖的結(jié)構(gòu)時(shí),可以通過調(diào)用recursiveDescription方法來打印出來,那么其結(jié)構(gòu)就一目了然了:

(lldb) po [self.view recursiveDescription]
<UIView: 0x7fdd1052af10; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fdd1052b290>>
   | <UIButton: 0x7fdd10529070; frame = (66 183; 188 40); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fdd1051bff0>>
   |    | <UIButtonLabel: 0x7fdd104162f0; frame = (41.5 11; 105 18); text = '標(biāo)哥的技術(shù)博客'; alpha = 0.2; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fdd10412590>>
   |    |    | <_UILabelContentLayer: 0x7fdd12804f30> (layer)
   | <_UILayoutGuide: 0x7fdd1052b300; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x7fdd1052b710>>
   | <_UILayoutGuide: 0x7fdd1052c070; frame = (0 568; 0 0); hidden = YES; layer = <CALayer: 0x7fdd1052c200>>
臨時(shí)刷新界面UI

最開始按鈕的背景顏色是blueColor,現(xiàn)在我們要在調(diào)試過程中修改其背景色為紅色,并刷新界面。執(zhí)行下面的命令行,App界面的按鈕背景顏色是:

(lldb) e ((UIButton *)sender).backgroundColor = [UIColor redColor]
(UICachedDeviceRGBColor *) $41 = 0x00007fdd10715b00
(lldb) e (void)[CATransaction flush]
修改變量值

本小節(jié)通過使用expr在調(diào)試過程中修改變量的值,感謝我的大徒弟在看完之后根據(jù)自己的經(jīng)驗(yàn)總結(jié)出這一條技巧,現(xiàn)在也分享出來給大家~

使用很簡單,就是這樣的規(guī)則:

expr variable = newValue

可以輸入help查看!

感謝作者在標(biāo)哥的技術(shù)博客

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

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

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