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/