LLDB介绍


LLDB 入门介绍及Chisel安装使用。

iOS开发工具之LLDB介篇


LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。

安装Chisel

  • Facebook 开源的 lldb 插件 Chisel.

  • 1、Chisel 使用 homebrew 来安装,如果你没有安装homebrew
1
2
brew update
brew install chisel
  • 2、安装完成按照安装日志上的提示,在~/.lldbinit文件中添加一行,没有则新建。 提示类似如下:
1
2
3
==> Caveats
Add the following line to ~/.lldbinit to load chisel when Xcode launches:
command script import /usr/local/opt/chisel/libexec/fblldb.py
  • 3、然后重启Xcode

常用的调试指令

pjson

打印json格式数据,调试服务器返回数据时候用。

p/x

打印16进制数据

p/t

打印2进制数据

e

修改属性和调用方法

pviews

这个命令可以递归打印所有的view,并能标示层级,相当于 UIView 的私有辅助方法 [view recursiveDescription]。 善用使用这个功能会让你在调试定位问题时省去很多麻烦。

pvc

个命令也是递归打印层级,但是不是view,而是viewController。利用它我们可以对viewController的结构一目了然。 其实苹果在IOS8也默默的添加了 UIViewController 的一个私有辅助方法 [UIViewController _printHierarchy]同样的效果。

visualize

这是个很有意思的功能,它可以让你使用Mac的预览打开一个 UIImage, CGImageRef, UIView, 或 CALayer。 这个功能或许可以帮我们用来截图、用来定位一个view的具体内容。 但是在我试用了一下,发现暂时还是只能在模拟器时使用,真机还不行。

fv & fvc

fvfvc这两个命令是用来通过类名搜索当前内存中存在的view和viewController实例的命令,支持正则搜索。

show & hide

这两个命令用来显示和隐藏一个指定的 UIView . 你甚至不需要Continue Progress. 就可以看到效果。

mask/umask border/unborder

这两组命令用来标识一个view或layer的位置时用, mask用来在view上覆盖一个半透明的矩形, border可以给view添加边框。但是在我实际使用的过程中mask总是会报错,估计是有bug, 那么mask/unmask 一般不要用好了,用border命令是一样的效果,反正二者的用途都是找到一个对应的view.

caflush

这个命令会重新渲染,即可以重新绘制界面, 相当于执行了 [CATransaction flush] 方法,要注意如果在动画过程中执行这个命令,就直接渲染出动画结束的效果。

当你想在调试界面颜色、坐标之类的时候,可以直接在控制台修改属性,然后caflush就可以看到效果啦,是不是要比改代码,然后重新build省事多了呢。

bmessage

这个命令就是用来打断点用的了,虽然大家断点可能都喜欢在图形界面里面打,但是考虑一种情况:我们想在[MyViewController viewWillAppear:] 里面打断点,但是 MyViewController并没有实现 viewWillAppear:方法, 以往的作法可能就是在子类中实现下viewWillAppear:,然后打断点,然后rebuild。

那么幸好有了 bmessage命令。我们可以不用这样就可以打这个效果的断点: (lldb) bmessage -[MyViewController viewWillAppear:]上面命令会在其父类的 viewWillAppear: 方法中打断点,并添加上了条件:[self isKindOfClass:[MyViewController class]]

help

可以用帮助文档查看所有的指令或者单个指令的使用方法

常用的Debug快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmd + ctrl + Y // 暂停/继续

cmd + Y // 断点失效/生效

cmd + shift + Y // 控制台显示/隐藏

cmd + shift + C // 光标切换到控制台

cmd + K // 清空控制台

continue \(c\) // 继续执行

step over F6 (n) // 单步执行

step into F7(s) // 跳入

step out F8 (finish)// 跳出
要不要鼓励一下😘