Chisel简介
Chisel是Facebook开源的一款lldb调试工具,其实就是对系统lldb命令的封装,开发者可以通过简化的命令更方便的进行调试工作。开源地址:https://github.com/facebook/chisel
Chisel安装
Homebrew的安装
Chisel的安装是通过Homebrew来安装的,所以安装Chisel前需要先在mac上安装Homebrew,安装命令很简单:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
拷贝该命令到terminal运行即可。
Chisel安装
安装完Homebrew后,就可按照github上介绍Chisel的安装步骤来安装了。
brew update
brew install chisel
安装截图如下:
注意红色方框中的内容,大致意思是让我们将下行的命令保存到~/.lldbinit文件中,以便Xcode启动时去加载Chisel。
所以接下来我们就需要往~/.lldbinit中添加那一行:
在~/目录下可能没有.lldbinit文件,此时需要我们新建一个,并打开该文件将那一行添加到文件中:
touch .lldbinit //新建文件
vim .lldbinit //通过vim打开该文件
添加截图如下:
添加完成后保存退出。
最后重启Xcode,随便打开一个项目,进入调试状态后,在console中输入help命令,如果出现以下内容,就说明Chisel安装成功了。
Current user-defined commands:
alamborder -- For more information run 'help alamborder'
alamunborder -- For more information run 'help alamunborder'
binside -- For more information run 'help binside'
bmessage -- For more information run 'help bmessage'
border -- For more information run 'help border'
caflush -- For more information run 'help caflush'
dcomponents -- For more information run 'help dcomponents'
fa11y -- For more information run 'help fa11y'
flicker -- For more information run 'help flicker'
fv -- For more information run 'help fv'
fvc -- For more information run 'help fvc'
hide -- For more information run 'help hide'
mask -- For more information run 'help mask'
pa11y -- For more information run 'help pa11y'
pactions -- For more information run 'help pactions'
paltrace -- For more information run 'help paltrace'
panim -- For more information run 'help panim'
pca -- For more information run 'help pca'
pcells -- For more information run 'help pcells'
pclass -- For more information run 'help pclass'
pcomponents -- For more information run 'help pcomponents'
pcurl -- For more information run 'help pcurl'
pdata -- For more information run 'help pdata'
pdocspath -- For more information run 'help pdocspath'
pinternals -- For more information run 'help pinternals'
pinvocation -- For more information run 'help pinvocation'
pivar -- For more information run 'help pivar'
pjson -- For more information run 'help pjson'
pkp -- For more information run 'help pkp'
presponder -- For more information run 'help presponder'
ptv -- For more information run 'help ptv'
pvc -- For more information run 'help pvc'
pviews -- For more information run 'help pviews'
rcomponents -- For more information run 'help rcomponents'
show -- For more information run 'help show'
slowanim -- For more information run 'help slowanim'
taplog -- For more information run 'help taplog'
unborder -- For more information run 'help unborder'
unmask -- For more information run 'help unmask'
unslowanim -- For more information run 'help unslowanim'
visualize -- For more information run 'help visualize'
vs -- For more information run 'help vs'
wivar -- For more information run 'help wivar'
Chisel常用命令的使用
pviews
该命令是最常用的命令,主要是用来查看布局中view的层级关系的。
图中command+R运行程序后,点击暂停按钮,就可进入lldb控制台,输入pivews命令查看当前布局中view的层级关系。
border/unborder
这两个命令分别是给要查看的view添加边框和移除边框,可以在lldb下输入help border查看具体的用法,如果我要给第二个view添加一个颜色为蓝色,宽度为2的边框,之后再用unborder命令移除,操作如下:
通过help border命令知道border的使用格式如下:
Options:
--color/-c <color>; Type: string; A color name such as 'red', 'green',
'magenta', etc.
--width/-w <width>; Type: CGFloat; Desired width of border.
Syntax: border [--color=color] [--width=width] <viewOrLayer>
其中viewOrLayer表示你要修改的view的地址,我们通过pviews命令知道,第二个view的地址是0x7feae2d605f0,所以我们输入
border -c blue -w 2 0x7feae2d605f0 //添加边框
unborder 0x7feae2d605f0 //移除边框
注意我在输入每个border/unborder命令时,右侧模拟器第二个view的变化。
view的层级关系。
pinternals
这个命令主要是打印view的内部详细信息,太具体了,有需要的可以好好研究研究:
(lldb) pinternals 0x7feae2d605f0
(UIView) $22 = {
UIResponder = {
NSObject = {
isa = UIView
}
_hasAlternateNextResponder = false
_hasInputAssistantItem = false
} _constraintsExceptingSubviewAutoresizingConstraints = 0x00007feae2d5cda0 @"3 objects"
_cachedTraitCollection = nil
_layer = 0x00007feae2d13760
_layerRetained = nil
_gestureInfo = nil
_gestureRecognizers = nil
_subviewCache = 0x00007feae2e621b0 @"1 object"
_templateLayoutView = nil
_charge = 0
_tag = 0
_viewDelegate = nil
_backgroundColorSystemColorName = nil
_countOfMotionEffectsInSubtree = 0
_countOfTraitChangeRespondersInDirectSubtree = 0
_cachedScreenScale = 0
_retainCount = 14
_tintAdjustmentDimmingCount = 0
_shouldArchiveUIAppearanceTags = false
_interactionTintColor = nil
_layoutMarginsGuide = nil
_minXVariable = 0x00007feae2e5f540
_minYVariable = 0x00007feae2e64400
_boundsWidthVariable = 0x00007feae2d0fe70
_boundsHeightVariable = 0x00007feae2d5cf90
_layoutEngine = 0x00007feae2e69220
_layoutDebuggingIdentifier = nil
_internalConstraints = 0x00007feae2d02e00
_continuousCornerRadius = 0 _countOfFocusedAncestorTrackingViewsInSubtree = 0
_semanticContentAttribute = 0
__presentationControllerToNotifyOnLayoutSubviews = nil
_previewingSegueTemplateStorage = nil
_contentSizeNotificationToken = nil
_readableContentGuide = nil
}
visualize
可以使用mac下的预览app打开我们的图片UIImage, CGImageRef格式的图片,甚至view和layer的图片 。
pclass
这个可以查看view的层级关系
图中先查看了UIView的层级关系,然后查看了一个第三方自定义的控件MMPlaceHolder的层级关系。
hide/show
这两个命令顾名思义,就是显示和隐藏某个指定的view,话不多说,上图(注意模拟器中第二个view的变化):
taplog
这个命令在你点击屏幕后,lldb打印出你敲击屏幕时接收事件的view的信息。
注意,我是先输入的命令,然后点击了屏幕才打印出对应view的信息。
pvc
这个命令是打印当前的控制器层级,如下图,我定义了一个UINavigationController,ViewController作为它的根控制器。
bmessage
有这么中需求,在当前控制器没有实现某个方法(譬如:-viewWillAppear:)方法,但是我又想在该方法调用时触发中断,这个时候bmessage就派上用场了
这里首先通过pvc命令查看当前控制器的层级关系,其中ViewController就是当前显示的控制器,然后通过通过controller变量指向当前控制器,再给该控制器通过bmessage设置了断点,之后让程序继续运行,当当前控制器再次被显示的时候,viewDidAppear:方法被触发,此时断点就起作用了,程序就中断了。
(lldb) e id $controller=(id)0x7fe8ab72ab50 //设置controller变量指向当前ViewController
(lldb) bmessage [$controller viewDidAppear:] //给当前ViewController设置断点
Setting a breakpoint at -[UIViewController viewDidAppear:] with condition (void*)(id)$rdi == 0x00007fe8ab72ab50
Breakpoint 1: where = UIKit`-[UIViewController viewDidAppear:], address = 0x000000010e646d12
以上是Chisel最常用的一些命令,其他的在某些特定场景也有用到,我也不是很了解
参考:https://objccn.io/issue-19-2/