Chisel常用命令总结

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的层级关系的。


pviews

图中command+R运行程序后,点击暂停按钮,就可进入lldb控制台,输入pivews命令查看当前布局中view的层级关系。

border/unborder

这两个命令分别是给要查看的view添加边框和移除边框,可以在lldb下输入help border查看具体的用法,如果我要给第二个view添加一个颜色为蓝色,宽度为2的边框,之后再用unborder命令移除,操作如下:


border/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的图片 。


visualize

pclass

这个可以查看view的层级关系


pclass

图中先查看了UIView的层级关系,然后查看了一个第三方自定义的控件MMPlaceHolder的层级关系。

hide/show

这两个命令顾名思义,就是显示和隐藏某个指定的view,话不多说,上图(注意模拟器中第二个view的变化):


show/hide

taplog

这个命令在你点击屏幕后,lldb打印出你敲击屏幕时接收事件的view的信息。


taplog

注意,我是先输入的命令,然后点击了屏幕才打印出对应view的信息。

pvc

这个命令是打印当前的控制器层级,如下图,我定义了一个UINavigationController,ViewController作为它的根控制器。


pvc

bmessage

有这么中需求,在当前控制器没有实现某个方法(譬如:-viewWillAppear:)方法,但是我又想在该方法调用时触发中断,这个时候bmessage就派上用场了


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最常用的一些命令,其他的在某些特定场景也有用到,我也不是很了解,所以就不敢轻易写了,以下是两篇很好地参考资料,第二篇是第一篇的中文译文。

<h1>参考</h1>
1、Dancing in the Debugger — A Waltz with LLDB

2、与调试器共舞 - LLDB 的华尔兹

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 不玩LLDB,不知道chisel有多强大。chisel之于LLDB,就像iPhone之于手机,前者几乎给后者重新下...
    小笨狼阅读 9,436评论 15 78
  • iOS调试之chisel Chisel 是一个 LLDB 指令集合,用户辅助 iOS 应用差错。 安装 chise...
    comst阅读 4,577评论 0 13
  • LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode ...
    Eric_zheng阅读 364评论 0 0
  • 与调试器共舞 - LLDB 的华尔兹 nangege 2014/12/19 你是否曾经苦恼于理解你的代码,而去尝试...
    McDan阅读 870评论 0 0
  • LLDB是XCode内置的为我们开发者提供的调试工具,是一个有着 REPL 的特性和 C++ ,Python 插件...
    风尘子阅读 861评论 0 2