美文网首页
Xcode中LLDB使用CheatSheet

Xcode中LLDB使用CheatSheet

作者: 乐鹰神骑骏 | 来源:发表于2018-04-08 16:18 被阅读23次

    使用LLDB可以减少使用NSLog大大提高调试的效率,尤其是使用下面提及的断点设置选项、界面调试技巧的时候。

    基础命令

    1. help 查看所有的command列表。
    2. po 打印对象信息,即description函数打印出的信息。
    3. p 打印变量的详细信息,包括地址和值。
        p/x 以16进制输出,p/t 以二进制输出,p/c 以字符类型输出,p/s 打印以空终止的字符串
    4. e int $a = 2,执行表达式。
    5. p (char)[[$array objectAtIndex:$a] characterAtIndex:0] 打印数组中的值,由于LLDB不知道输出数据的类型,所以需要一个强制类型转换告诉它按照对应的格式显示。
    6. image lookup --address 0x4676489373,用于定位代码位置。
    

    断点控制(通过命令)

    Xcode断点控制区域.png
    1. c 继续执行,相当于上图的按钮1。
    2. n 执行下一行,相当于上图的按钮2。
    3. s 进入该行对应的函数,如果不是函数效果和上一条一样,相当于上图的按钮3。
    4. thread step-out 跳出当前函数,相当于上图的按钮4。
    5. frame info 打印当前的行数和源码文件,以及其他一些信息。
    //下面几个不常用,完全可以通过UI界面实现。
    6. br li 命令全称breakpoint list,所有断点列表,查看每个断点的ID和被执行的次数。
    7. br en 命令全称breakpoint enable <breakpointID> 开启断点。
    8. br dis 命令全称breakpoint disable <breakpointID> 关闭断点。
    9. br set -f main.m -l 80 设置一个断点。
    

    断点控制(通过UI)

    1.设置某个系统函数的断点。注意其中填入部分需要加上"",其中Automatically continue after evaluating actions 如果勾选表示执行完断点设置的逻辑后直接往下运行。

    添加断点.jpg 设置断点.png

    2.编辑代码中的某一个断点

    编辑某个断点.png

    可以给断点指定捕获条件,设置多个Action,下面的例子中设置了index==10的时候捕获的中段条件,并且设置了3个对应的Action,它们可以向控制台打印index信息,用语音提示断点已经捕获并且打印一些其他的信息。

    给断点添加Action.png

    这里需要提到的很重要一个使用场景就是在Debugger Commander中可以模拟函数的返回值,比如下面这个函数,在return语句处打上断点,并在Debugger Commander中填入下面命令,则函数会直接返回10,跳过后面的执行逻辑,在调试时就可以模拟函数的返回结果了,模拟BOOL、NSString、Dictionary等可以。

    在函数的开头执行这个命令,是个非常好的隔离这个函数方法,伪造返回值的方式 。它有一个可选参数,在执行时它会把可选参数加载进返回寄存器里,然后立刻执行返回命令,跳出当前栈帧。这意味这函数剩余的部分不会被执行。这会给 ARC 的引用计数造成一些问题,或者会使函数内的清理部分失效。所以一般在函数开头用比较好。

    thread return 10
    
    设置断点直接返回.png

    界面调试

    1. po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]获得当前UI的层级结构,用处不大,一般会关心的只是最上面的VC对应的界面,要获得当前展示的VC借助后面提到的chisel会比较方便。
    2. 更新一个View的背景颜色
       e id $myView = (id)0x7f82b1d01fd0
       e (void)[$myView setBackgroundColor:[UIColor blueColor]]
    3. e (void)[CATransaction flush] 立即刷新刚刚对界面的更改。否则只有程序继续运行后更新才会显示在界面上。 
    4. Push 一个 View Controller
       e id $nvc = [[[UIApplication sharedApplication] keyWindow] rootViewController]
       e id $vc = [UIViewController new]
       e (void)[[$vc view] setBackgroundColor:[UIColor yellowColor]]
       e (void)[$vc setTitle:@"Yay!"]
       e (void)[$nvc pushViewContoller:$vc animated:YES]
    5. 查找按钮的 target
       po [$myButton allTargets]
    

    UI调试的LLDB命令Facebook有一个比较好的开源库Chisel,简单来说就是一个Python脚本的集合,可以使用方法参考这里Chisel

    其他的一些功能

    1. 观察实例变量的变化
    2. 非重写方法的符号断点
    3. LLDB 和 Python的无缝对接

    ref

    https://objccn.io/issue-19-2/ 与调试器共舞 - LLDB 的华尔兹
    https://blog.cnbluebox.com/blog/2015/03/05/chisel/ Chisel-LLDB命令插件,让调试更Easy

    相关文章

      网友评论

          本文标题:Xcode中LLDB使用CheatSheet

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