Chisel的初步使用

作者: 天空中的球 | 来源:发表于2015-12-15 16:04 被阅读524次

    最近每周末都会看叶孤城的直播,对于我们iOS开发者来说,确实是一个福利,很感谢他们的分享精神,收获到的一些东西特此记录下。

    12月13号 LLDB

    今天听了武蕴牛x的视频,讲解了关于LLDB的调试,以及一些Xcode快捷操作和插件,其中LLDB作为重点需要好好记录下。

    随着Xcode 5的发布,LLDB的调试器已经取代了GDB,成为了Xcode工程中默认的调试器,它与LLVM编辑器一起,带给我们更丰富的流程控制和数据检测的测试功能。

    当然我们平时一般也会用用到基本的lldb命令,p和po;

    • p 命令, 打印对象的话,那么它会打印出对象的地址,如果打印非对象它一般会打印出基本变量类型的值。

    • po 命令,打印出对象的description描述。

    而此时我们可以使用开源的facebook的chisel,会有更多的方便。

    一、安装

    chisel 的 github 上按教程下载安装,有直接的说明

    1-1、brew update

    如果没有安装Homebrew,首先安装一个Homebrew,这玩意也挺有用的。
    如果安装了,最好更新一下。

    brew update
    
    • 假如出现错误提示 ,你可以直接 brew doctor,它会告诉你问题所在,然后解决就好啦。
    1-2、brew install chisel
    brew install chisel  
    
    brew install chisel
    1-3、替换地址
     ==> CaveatsAdd 
     the following line to ~/.lldbinit to load chisel when Xcode launches: command script import 
     /usr/local/opt/chisel/libexec/fblldb.py
    

    就是命令行安装完之后,它会在安装完之后显示出chisel的安装地址path.在根目录下创建.lldbinit,复制command script import /usr/local/opt/chisel/libexec/fblldb.py这一块到.lldbinit文件中就OK了。

    当然最后你需要重启Xcode下。

    二、常用命令

    2.1 pviews

    这个命令可以递归打印所有的view,并能标示层级,相当于 UIView 的私有辅助方法 [view recursiveDescription]

    (lldb) pviews self.stackView
    <UIStackView: 0x134e2cf80; frame = (0 0; 0 0); layer = <CATransformLayer: 0x134e02420>>
       | <UIView: 0x134e32540; frame = (0 0; 0 0); layer = <CALayer: 0x134e2ee10>>
       | <UIView: 0x134d369c0; frame = (0 0; 0 0); layer = <CALayer: 0x134d43510>>
       | <UIView: 0x134d37250; frame = (0 0; 0 0); layer = <CALayer: 0x134d35a40>>
       | <UIView: 0x134d43f50; frame = (0 0; 0 0); layer = <CALayer: 0x134d44ed0>>
    
    2.2 pvc

    这个命令递归打印出viewController的层级。利用它我们可以对viewController的结构一目了然。

    (lldb) pvc
    <ViewController 0x12fe3c390>, state: appeared, view: <UIView 0x12fd32e50>
    + <UINavigationController 0x130838c00>, state: disappeared, view: <UILayoutContainerView 0x12fe50fd0> not in the window, presented with: <_UIFullscreenPresentationController 0x12fe5c700>
    |    | <FirstViewController 0x12fe3ea40>, state: disappeared, view: <UIView 0x12fe5d410> not in the window
    

    苹果在iOS8也默默的添加了 UIViewController 的一个私有辅助方法 [UIViewController _printHierarchy] 同样的效果。

    2.3 visualize

    它可以使用Mac的预览打开一个 UIImage, CGImageRef, UIView, 或 CALayer。 这个功能或许可以帮我们用来截图、用来定位一个view的具体内容。

     visualize 0x7fd3b3c35e60
    // 或者
     visualize self.testImageView
    

    但我尝试的时候成功了几次,也失败了几次,出现这个错误:

    <Error>: CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    

    暂时从这个讨论答案上面也没得出一个具体的情况,那个移除Remove UIViewControllerBasedStatusBarAppearance,没有起到效果,继续寻找答案中,⛽️···

    2.4 mask/unmask border/unborder

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

    (lldb) border 0x7fd3b3c35e60
    (lldb) mask  0x7fd3b3c35e60
    
    border之后的效果
    border和mask之后的效果

    下面就恢复啦

    (lldb) unborder 0x7fd3b3c35e60
    (lldb) unmask 0x7fd3b3c35e60
    
    2.5 bmessage

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

       (lldb) bmessage -[ViewController viewWillAppear:] 
    

    上面命令会在其父类的 viewWillAppear:
    方法中打断点,并添加上了条件:[self isKindOfClass:[ViewController class]],然后有什么问题相对来说好显示出来了。

    2.6 caflush

    刷新UI,当调试时候,我们改变了UI的布局的时候,不用重新启动,使用caflush刷新UI即可,作为快捷键使用比较好。

    2.7 fv & fvc

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

    (lldb) fvc First
    0x7fad4043ab70 FirstViewController
    (lldb) fv view
    0x7fad4060fcc0 UIView
    0x7fad4042fc80 UIView
    
    2.8 taplog

    点击屏幕,程序会暂停,会打印到你所触摸的view。

    (lldb) taplog
    Process 34726 resuming
    <UIView: 0x7fd3e160d460; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x7fd3e160aca0>>
    
    2.9 presponder

    打印出responder的响应链

    (lldb) presponder self
    <FirstViewController: 0x7fa292e24070>
    
    2.10 pclass

    打印出对象的class以及是从哪儿继承过来的

     (lldb) pclass self
     ProjectDetailViewController
         | RootViewController
         |    | UIViewController
         |    |    | UIResponder
         |    |    |    | NSObject
    
    2.11 wivar

    设置对象的Watchpoint,相当于KVO,看看是哪儿改变了对象属性.

    (lldb) watchpoint list
    Number of supported hardware watchpoints: 4
    No watchpoints currently set.
    (lldb) wivar self _testDic
    Remember to delete the watchpoint using: watchpoint delete 1
    (lldb) watchpoint list
    Number of supported hardware watchpoints: 4
    Current watchpoints:
    Watchpoint 1: addr = 0x7fb599f14d00 size = 8 state = enabled type = w
    new value: 140417946751392
    
    2.12 internals

    打印出对象内部的东西,有空可以看看系统的一些对象内部都有哪些东西.

    pinternals self.view
    (UIView) $29 = {
        UIResponder = {
        NSObject = {
        isa = UIView
      }
      _hasAlternateNextResponder = false
      _hasInputAssistantItem = false
    }
    _constraintsExceptingSubviewAutoresizingConstraints = 0x000000015fee2940 @"10 objects"
    _cachedTraitCollection = nil
    ·····
    

    最常用的可能还是前面几个,pvc,pviews,其他的命令可以直接通过help来寻找。

    备注:

    武蕴牛x的博客,貌似这个博客暂时没怎么更新了,但可以关注他的博客.

    相关文章

      网友评论

      • upworld:发现了好多大牛!继续学习

      本文标题: Chisel的初步使用

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