LLDB

不用斷點(diǎn)調(diào)試
如果你正在運(yùn)行 iOS app,你可以試試這個(gè): (因?yàn)槿肿兞渴强稍L問的)

(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow: 0x7fbb61726ac0; frame = (0 0; 375 812); gestureRecognizers = <NSArray: 0x60c0002440b0>; layer = <UIWindowLayer: 0x60c000038c60>>
   | <UILayoutContainerView: 0x7fbb61606620; frame = (0 0; 375 812); autoresize = W+H; gestureRecognizers = <NSArray: 0x608000058ea0>; layer = <CALayer: 0x600000421aa0>>
   |    | <UINavigationTransitionView: 0x7fbb6140a9f0; frame = (0 0; 375 812); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x608000033d20>>
   |    |    | <UIViewControllerWrapperView: 0x7fbb61403b60; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x60800002fe80>>
   |    |    |    | <UIView: 0x7fbb6160b280; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x600000421ba0>>
   |    |    |    |    | <UIView: 0x7fbb616044b0; frame = (100 100; 100 100); layer = <CALayer: 0x600000421ae0>>
   |    |    |    |    | <UIButton: 0x7fbb61605cb0; frame = (200 200; 100 30); opaque = NO; layer = <CALayer: 0x600000421980>>
   |    | <UINavigationBar: 0x7fbb6171b9c0; frame = (0 44; 375 44); opaque = NO; autoresize = W; layer = <CALayer: 0x60c0000388e0>>
   |    |    | <_UIBarBackground: 0x7fbb6171c1b0; frame = (0 -44; 375 88); userInteractionEnabled = NO; layer = <CALayer: 0x60c000038480>>
   |    |    |    | <UIImageView: 0x7fbb6171cea0; frame = (0 88; 375 0.333333); userInteractionEnabled = NO; layer = <CALayer: 0x60c000038940>>
   |    |    |    | <UIVisualEffectView: 0x7fbb6171d0d0; frame = (0 0; 375 88); layer = <CALayer: 0x60c000038960>>
   |    |    |    |    | <_UIVisualEffectBackdropView: 0x7fbb61607b50; frame = (0 0; 375 88); autoresize = W+H; userInteractionEnabled = NO; layer = <UICABackdropLayer: 0x600000422560>>
   |    |    |    |    | <_UIVisualEffectSubview: 0x7fbb61608dc0; frame = (0 0; 375 88); autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x600000422700>>
   |    |    | <_UINavigationBarLargeTitleView: 0x7fbb6171e7e0; frame = (0 0; 0 44); clipsToBounds = YES; hidden = YES; layer = <CALayer: 0x60c000038cc0>>
   |    |    |    | <UILabel: 0x7fbb6171f580; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x60c000282440>>
   |    |    | <_UINavigationBarContentView: 0x7fbb6171db60; frame = (0 0; 375 44); layer = <CALayer: 0x60c0000389c0>>
   |    |    | <_UINavigationBarModernPromptView: 0x7fbb61723c30; frame = (0 0; 0 44); alpha = 0; hidden = YES; layer = <CALayer: 0x60c000039b60>>
   |    |    |    | <UILabel: 0x7fbb61724050; frame = (0 25.3333; 0 0); text = ''; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x60c000282760>>

有了上面的輸出,我們可以獲取這個(gè) view:

(lldb) e id $myView = (id)0x7fbb616044b0

然后在調(diào)試器中改變它的背景色:
(lldb) e (void)[$myView setBackgroundColor:[UIColor blueColor]]

但是只有程序繼續(xù)運(yùn)行之后才會(huì)看到界面的變化。因?yàn)楦淖兊膬?nèi)容必須被發(fā)送到渲染服務(wù)中,然后顯示才會(huì)被更新。

渲染服務(wù)實(shí)際上是一個(gè)另外的進(jìn)程 (被稱作 backboardd)。這就是說即使我們正在調(diào)試的內(nèi)容所在的進(jìn)程被打斷了,backboardd 也還是繼續(xù)運(yùn)行著的。

這意味著你可以運(yùn)行下面的命令,而不用繼續(xù)運(yùn)行程序:

(lldb) e (void)[CATransaction flush]

Push 一個(gè) View Controller
想象一個(gè)以 UINavigationController 為 root ViewController 的應(yīng)用。你可以通過下面的命令,輕松地獲取它:

(lldb) e id $nvc = [[[UIApplication sharedApplication] keyWindow] rootViewController]

然后 push 一個(gè) child view controller:

(lldb) e id $vc = [UIViewController new]
(lldb) e (void)[[$vc view] setBackgroundColor:[UIColor yellowColor]]
(lldb) e (void)[$vc setTitle:@"Yay!"]
(lldb) e (void)[$nvc pushViewContoller:$vc animated:YES]

最后運(yùn)行下面的命令:

e (void)[CATransaction flush]

navigation Controller 就會(huì)立刻就被 push 到你眼前。
查找按鈕的 target
想象你在調(diào)試器中有一個(gè) $myButton 的變量,可以是創(chuàng)建出來的,也可以是從 UI 上抓取出來的,或者是你停止在斷點(diǎn)時(shí)的一個(gè)局部變量。你想知道,按鈕按下的時(shí)候誰會(huì)接收到按鈕發(fā)出的 action。非常簡單:

(lldb) po [$myButton allTargets]
{(
    <MagicEventListener: 0x7fb58bd2e240>
)}
(lldb) po [$myButton actionsForTarget:(id)0x7fb58bd2e240 forControlEvent:0]
<__NSArrayM 0x7fb58bd2aa40>(
_handleTap:
)

現(xiàn)在你或許想在它發(fā)生的時(shí)候加一個(gè)斷點(diǎn)。在 -[MagicEventListener _handleTap:] 設(shè)置一個(gè)符號(hào)斷點(diǎn)就可以了,在 Xcode 和 LLDB 中都可以,然后你就可以點(diǎ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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 轉(zhuǎn)載 與調(diào)試器共舞 - LLDB 的華爾茲: https://objccn.io/issue-19-2/ 推薦:i...
    F麥子閱讀 3,463評(píng)論 0 10
  • 與調(diào)試器共舞 - LLDB 的華爾茲 nangege 2014/12/19 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試...
    McDan閱讀 958評(píng)論 0 0
  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    paraneaeee閱讀 1,338評(píng)論 0 7
  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    我是啊梁閱讀 888評(píng)論 1 1
  • 前言 今天花了一天的時(shí)間終于把iOS的幾種常見的調(diào)試方法給學(xué)習(xí)了一下,在這里給大家分享一下LLDB的使用,同時(shí)也是...
    Peak_One閱讀 11,304評(píng)論 5 33

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