LLDB是XCode內(nèi)置調(diào)試工具
我們加了斷點瓤的,然后在運行到斷點處就停了下來吞歼,接下來我們看到lldb這里了嗎篙骡?我們可以通過lldb所提供的命令來操作。
常用p、po老虫、call命令
從官方的描述來看祈匙,p夺欲、print些阅、call是一樣的市埋,但是po就不太一樣了,輸入一樣但是輸出不一樣抒倚。po的輸出的是具體對象的內(nèi)容托呕。
lldb聲明變量
我們可以使用e命令定義變量项郊,然后在調(diào)試中使用呆抑∪蛋看如下的例子:
(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命令打印出來的都是$開頭的變量了嗎楼眷?我們在聲明和使用時也需要加上$符號熊尉,與PHP一樣狰住!
在調(diào)試時催植,有時候想臨時計算一下某個值來比較時,就可以通過這種方式來實現(xiàn)了创南,再也不用到源代碼處添加上聲明實現(xiàn)然后添加一句打印了伦忠,是否便利了很多?
調(diào)用變量的API
當(dāng)我們在斷點處稿辙,定義了blogName變量了昆码,因此我們可以通過調(diào)試命令來調(diào)用
(lldb) po [blogName uppercaseString]
標(biāo)哥的技術(shù)博客
(lldb) po [blogName substringFromIndex:2]
的技術(shù)博客
強轉(zhuǎn)返回值類型
當(dāng)我們調(diào)用API返回值類型不指定時,有時候所打印出來的東西是我們看不懂的邻储,比如下面的獲取結(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è)置斷點觸發(fā)條件
看下圖,筆者是怎么設(shè)置觸發(fā)條件的:
我們在NSLog這一行芥备,設(shè)置了條件冬耿,只有當(dāng)條件滿中時,才會進入斷點萌壳,不過這里并沒有讓它進入斷點,而條件滿足時就發(fā)出聲音并打印提示語爱咬。
這種應(yīng)用場景主要是在循環(huán)遍歷數(shù)據(jù)時,想要斷點跟蹤就只能通過這種方式了,除非添加NSLog打印师枣,但是這種需要手動添加代碼,在調(diào)試時才想到要添加一些打印語句,這時候又得重新運行兴革,這太慢了箕昭。如果懂得如何設(shè)置斷點條件泌霍,那么就能滿足我們的需求了积暖,直接可以設(shè)置條件缅疟。
常用打印視圖層次結(jié)構(gòu)
當(dāng)我們想要知道某個視圖的結(jié)構(gòu)時耘斩,可以通過調(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>>
臨時刷新界面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)驗總結(jié)出這一條技巧青责,現(xiàn)在也分享出來給大家~
使用很簡單暇检,就是這樣的規(guī)則:
expr variable = newValue
可以輸入help查看酿矢!
感謝作者在標(biāo)哥的技術(shù)博客