Chisel常用命令总结

作者: feisong | 来源:发表于2016-01-12 19:38 被阅读356次

    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 的华尔兹

    相关文章

      网友评论

      • 7a946bf5d2ca:你好 ,我成功安装了chisel可是我输入那些命令都没有反应啊,pviews输入完 敲完回车 还是lldb什么反应也没有
      • 没故事的卓同学:请问这是你原创的吗?写的很好。
        feisong:@没故事的卓同学 谢谢 也可以访问一下我的网址www.feisongfs.com
        没故事的卓同学:@feisong 几张动图做的很细心。
        feisong:@没故事的卓同学 当然 不过写之前参考了很多相关资料 有机会多交流哈

      本文标题:Chisel常用命令总结

      本文链接:https://www.haomeiwen.com/subject/gulckttx.html