Xcode中LLDB使用CheatSheet

2018-04-08  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读