美文网首页
iOS开发中实用的lldb命令

iOS开发中实用的lldb命令

作者: FindCrt | 来源:发表于2017-05-28 02:23 被阅读165次

    p & po

    ppo实际都是expression命令,pe --(e就是expression的简写)的别名,poe -o --的简写。

    p用于执行一段表达式,如p button.backgroundColor = [UIColor blueColor];用在下面的情况,原本是红色的按钮,会变成蓝色

        UIButton *button = [[UIButton alloc] initWithFrame:(CGRectMake(30, 100, 100, 30))];
        button.backgroundColor = [UIColor redColor];
        [self.view addSubview:button];
    

    这个的好处就是可以在运行之后,我们还可以操控变量的值的来配合调试。比如有些流程会根据值不同,走不同的代码,用p命令就可以在运行后继续修改调试。

    po用来输出一个指针指向的对象的值。

    (lldb) p button
    (UIButton *) $1 = 0x00007fb39c50c1f0
    (lldb) po button
    <UIButton: 0x7fb39c50c1f0; frame = (30 100; 100 30); opaque = NO; layer = <CALayer: 0x608000031a60>>
    

    比如对于一个按钮,使用p命令,输出的是指针的数据,也就是它执行那个内存的地址,而我们实际需要的信息在指向的对象里,用po就可以直接输出对象信息。

    thread backtrace 或 bt

    可以用来显示当前的方法调用栈信息。虽然在Xcode里可以查看,但操作可能没有在这里来的快捷。

    (lldb) bt
    * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
      * frame #0: 0x0000000107df7562 TestDemo`-[ViewController viewDidLoad](self=0x00007fb39c405600, _cmd="viewDidLoad") at ViewController.m:28
        frame #1: 0x0000000108f26cca UIKit`-[UIViewController loadViewIfRequired] + 1235
        frame #2: 0x0000000108f2710a UIKit`-[UIViewController view] + 27
        frame #3: 0x0000000108def63a UIKit`-[UIWindow addRootViewControllerViewIfPossible] + 65
        frame #4: 0x0000000108defd20 UIKit`-[UIWindow _setHidden:forced:] + 294
        frame #5: 0x0000000108e02b6e UIKit`-[UIWindow makeKeyAndVisible] + 42
        frame #6: 0x0000000108d7c31f UIKit`-[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4346
        frame #7: 0x0000000108d82584 UIKit`-[UIApplication _runWithMainScene:transitionContext:completion:] + 1709
        frame #8: 0x0000000108d7f793 UIKit`-[UIApplication workspaceDidEndTransaction:] + 182
        frame #9: 0x000000010bfc35f6 FrontBoardServices`__FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
        frame #10: 0x000000010bfc346d FrontBoardServices`-[FBSSerialQueue _performNext] + 186
        frame #11: 0x000000010bfc37f6 FrontBoardServices`-[FBSSerialQueue _performNextFromRunLoopSource] + 45
        frame #12: 0x0000000108906c01 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
        frame #13: 0x00000001088ec0cf CoreFoundation`__CFRunLoopDoSources0 + 527
        frame #14: 0x00000001088eb5ff CoreFoundation`__CFRunLoopRun + 911
        frame #15: 0x00000001088eb016 CoreFoundation`CFRunLoopRunSpecific + 406
        frame #16: 0x0000000108d7e02f UIKit`-[UIApplication _run] + 468
        frame #17: 0x0000000108d840d4 UIKit`UIApplicationMain + 159
        frame #18: 0x0000000107df79cf TestDemo`main(argc=1, argv=0x00007fff57e085c0) at main.m:14
        frame #19: 0x000000010b85865d libdyld.dylib`start + 1
    (lldb) 
    

    watchpoint

    这个断点类型没法通过界面添加而且很有用。使用watchpoint可以用来观察一个变量或者地址,只要变量发生变化就触发断点。

    有些时候,我们会发现某个对象的值和我们预期的不一样,可是又不知道是哪个环节修改了这个值,如果一个个的查会特别麻烦。而有了watchpoint事情就简单了。

    但是它只能观察这个指针本身,不能指针指向的对象的变化,所以用处大大受限。比如watchpoint set variable button,那么:button.backgroundColor = [UIColor blackColor];不会触发watchpoint,而button = nil;会变。

    2017.6.8更新


    1、 可以使用内存直接打印,比如输出了一个按钮:

    Printing description of $18:
    <UIButton: 0x7fdb44d16dc0; frame = (100 60; 100 40); opaque = NO; layer = <CALayer: 0x600000037140>>
    

    这个是使用Debug View Hierarchy查看的时候,用鼠标操纵打印的。如果你想看UIButton内部的其他属性怎么办?比如查看enabled属性。

    (lldb) po [0x7fdb44d16dc0 isEnabled]
    0x0000000000000101
    

    使用po + 执行方法的形式,因为enabled属性的getter方法是isEnabled,所以用了isEnabled,而不是enabled

    2、 使用p/po命令来声明一个变量:

    Printing description of $9:
    <UIButton: 0x7feadc520090; frame = (125 0; 125 40); opaque = NO; tag = 1001; layer = <CALayer:0x60000023aec0>>
    
    (lldb) po id $myButton = [0x7feadc520090 self]
    

    直接等于内存地址是不行的,所以搞了个self方法把对象返回。注意声明变量的时候,前面是带了一个符号$的,使用的时候也需要:

    (lldb) po $myButton
    <UIButton: 0x7feadc520090; frame = (125 0; 125 40); opaque = NO; tag = 1001; layer = <CALayer: 0x60000023aec0>>
    

    有了这些,可以更方便的使用lldb来查看和探究对象的性质了!!

    相关文章

      网友评论

          本文标题:iOS开发中实用的lldb命令

          本文链接:https://www.haomeiwen.com/subject/gbecfxtx.html