博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Chisel-LLDB命令插件,让调试更Easy
阅读量:4293 次
发布时间:2019-05-27

本文共 4362 字,大约阅读时间需要 14 分钟。

LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。(有一个关于调试器如何工作的总体的解释。)

相信每个人或多或少都在用LLDB来调试,比如po一个对象。LLDB的是非常强大的,且有内建的,完整的 Python 支持。今天我们主要介绍一个 facebook 开源的 lldb 插件 Chisel。可以让你的调试更Easy.

1.安装Chisel

源码地址: 

Chisel 使用 homebrew 来安装,如果你没有安装homebrew, 参考 。

12
brew updatebrew install chisel

安装完成按照安装日志上的提示,在~/.lldbinit文件中添加一行,没有则新建。 提示类似如下:

123
==> CaveatsAdd the following line to ~/.lldbinit to load chisel when Xcode launches:  command script import /usr/local/opt/chisel/libexec/fblldb.py

做好上面的步骤,然后重启Xcode就可以尝试下了。

2.内置命令

Chisel 为lldb提供了新增的便捷命令,是非常实用的命令

2.1 pviews

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

使用示例:

123456789
(lldb) pviews view
> |
> |
> |
> | | <_UILabelContentLayer: 0x131a3d50> (layer) |
> | | <_UILabelContentLayer: 0x131bea10> (layer) |

2.2 pvc

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

预览效果:

1234567891011121314
(lldb) pvc
; frame = (0, 0; 414, 736)> |
; frame = (0, 0; 414, 736)> | |
; frame = (0, 0; 414, 736)> |
; frame = (0, 0; 414, 736)> | |
; frame = (0, 0; 414, 736)> | | |
; frame = (0, 64; 414, 628)> |
; frame = (0, 0; 414, 736)> | |
; frame = (0, 0; 414, 736)> | | |
; frame = (0, 0; 414, 672)> | | |
; frame = (414, 0; 414, 672)> | | |
; frame = (828, 0; 414, 672)> |
; frame = (0, 0; 414, 736)> | |

是不是方便很多呢,而且还可以看到 viewController 是否已经 viewDidLoad .

2.3 visualize

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

使用简单:

1
(lldb) visualize imageView

2.4 fv & fvc

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

如:

123456789
(lldb) fv scrollView0x18d3b8c0 UIScrollView0x137d0c50 UIScrollView0x131b1580 UIScrollView0x131b2070 UIScrollView(lldb) fvc Home0x1393fe00 HomeFeedsViewController0x138a8e00 HomeFeedsViewController(lldb)

2.5 show & hide

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

2.6 mask/umask border/unborder

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

2.7 caflush

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

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

例, 其中 $122 即是目标UIView:

1234
(lldb) p view(long) $122 = 140718754142192(lldb) e (void)[$122 setBackgroundColor:[UIColor greenColor]](lldb) caflush

2.8 bmessage

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

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

3. 自定义命令

我们也可以自定义插件,不过前提是要懂一些 python。 比如设计一个打印keyWindow的windowLevel的命令:

创建python脚本文件 /magical/commands/example.py :

1234567891011121314151617181920
#!/usr/bin/python# Example file with custom commands, located at /magical/commands/example.pyimport lldbimport fblldbbase as fbdef lldbcommands():  return [ PrintKeyWindowLevel() ]class PrintKeyWindowLevel(fb.FBCommand):  def name(self):    return 'pkeywinlevel'  def description(self):    return 'An incredibly contrived command that prints the window level of the key window.'  def run(self, arguments, options):    # It's a good habit to explicitly cast the type of all return    # values and arguments. LLDB can't always find them on its own.    lldb.debugger.HandleCommand('p (CGFloat)[(id)[(id)[UIApplication sharedApplication] keyWindow] windowLevel]')

其中定义了PrintKeyWindowLevel的类,需要实现 name description run 方法来分别告诉名称、描述、和执行实体。

创建好脚本后,然后在前面安装时创建的 ~/.lldbinit文件中添加一行:

1
script fblldb.loadCommandsInDirectory('/magical/commands/')

然后重启Xcode之后就可以使用自定义的命令啦。

参考文献:

转载地址:http://mtfws.baihongyu.com/

你可能感兴趣的文章
使用register_chrdev注册字符设备
查看>>
VGA、DVI、HDMI三种视频信号接口
查看>>
三星公司uboot模式下更改分区(EMMC)大小fdisk命令
查看>>
fat、ntfs、ext区别
查看>>
传感器原始图像格式:Bayer RGB 和RGB RAW
查看>>
使用SSH时提示 ”Server responded "Algorithm negotiation failed"
查看>>
Ubuntu 16.04安装MinGW32
查看>>
Ubuntu 16.04(32位)下iTop4412环境搭建+Android4.0.3编译
查看>>
ubuntu命令查询版本和内核版本
查看>>
摄像头驱动OV7725学习笔记连载(一):OV7725 电器特性和时序图
查看>>
ubuntu 安装和查看已安装
查看>>
摄像头驱动OV7725学习笔记连载(二):0V7725 SCCB时序的实现之寄存器配置
查看>>
安装 Android_JDK遇到的问题(32位ubuntu16.4)
查看>>
视频采集处理之YUV数据格式
查看>>
视频采集处理之YUV数据格式
查看>>
使用UltraISO制作U盘启动盘
查看>>
win7下如何卸载ubuntu
查看>>
获取一个文件的属性(struct stat结构体)
查看>>
V4L2基础编程基于Linux系统
查看>>
V4L2常用命令标志符和结构体
查看>>