美文网首页ios进阶iOS Developer - TipsiOS Developer
LLdb篇2教你使用faceBook的chisel来提高调试效

LLdb篇2教你使用faceBook的chisel来提高调试效

作者: kissGod | 来源:发表于2015-03-09 09:20 被阅读14263次

    这次真是久违的第二篇了,过年的时候一直在帮家里带孩子,顺便用webStorm这个神器重新温习了下前端的知识。然后最近刚来北京又是重感冒,又是找房子,整个来说coding还是写博客效率极低又苦不堪言。

    首先如果使用lldb,最好你要学着使用chisel来提高效率,否则你会浪费很多的时间,除非你自己会写python脚本,自己封装一些lldb的命令。

    安装chisel

    chisel的安装是十分简单,它是在终端通过brew安装的,具体可以点击链接参考github的安装说明,唯一需要注意的一点就是命令行安装完之后,它会在安装完之后显示出chisel的安装地址path.在执行下面的命令时候要记得替换/path/to/fblldb.py这一块。

    # ~/.lldbinit
    ...  
    command script import /path/to/fblldb.py
    script fblldb.loadCommandsInDirectory('/magical/    
    commands/')
    

    如果安装成功的话,那么你就会看到如下图的这些命令。

    lldb helplldb help

    这里大概会有30个命令吧,我记得我第一次装的时候没那么多命令的,facebook又更新了很多。其实这些封装的命令,就是使用python封装了一下函数然后调用。凡是这些封装的命令,你都可以通过多个lldb命令打出来,所以如果你会使用python的话,那么你可以根据自己的使用习惯封装一些常用的lldb命令。我使用了也有一段时间的chisel了,但是感觉并不是所有的命令都很常用,而且有写使用的场景也不是很清楚,所以在这里给大家普及一下,如果有谬误,请大家及时指正。(ps:和大家说个快捷键,cmd+k快速清楚console的信息。)

    一般我们使用chisel的命令的时候,我们可以通过 help + chisel命令,譬如 help + pvc,得到如何具体使用这个命令,但是有时候你看了help信息也不一定就会用呢。

    imageimage

    pviews

    这个命令是我最常使用的命令。它能够帮助我们看到view的层级,即使我们并没有触发到一个断点。操作如下:

    pviewspviews
    • 如图我没有设置任何断点,只是点击控制台的暂停图标,就可以呼出lldb控制台了。然后再这里输出pviews这个命令。
    • 然后这个命令主要可以看到当前的view层级,如果我们写了一个控件没有显示。我们就可以通过这个命令来排查。
    • 排查首先看有没有我们添加的这个view,如button,如果内存地址里没有这个button,说明没有添加到view中(没调用addSubview方法)
    • 然后可以看到这个button的地址,我们可以看到这个button的frame属性,根据属性判断是否是位置或者大小不合适。
    • 再次,我们要看是否hidden被设置成了yes,如果设置了yes的话,在打印信息中会打印出来。因为默认view的isHidden是no,所以没被打印。
    • 最后如果是button可以检查下是否设置了图片,如果是view,就可以查看下颜色是否与后面的控件一致,这就引入到了下一个命令border。

    border&unborder

    borderborder

    这个命令可以直接给border 添加边框颜色和边框的宽度,使用如下:

    border 0x79ec3140 -c green -w 2

    border这个命令常常在我们需要查看边框的边缘的问题,常常用到,而且我们想要设置的直接在lldb中设置,完全不需要重新写代码再次运行。我就是通过直接暂停程序,并且通过pviews命令找到的控件的地址,并且调用命令显示的。当我们不需要的时候可以通过unborder这个命令去掉边框。整个过程一气呵成。

    pinternals

    pinternalspinternals

    这个命令就是打印出来的一个控件(id)类型的内部结构,详细到令人发指!甚至是你自定义的控件中的类型,譬如这个styleView就是我自定义的,内部有个iconView的属性,其中的值它也会打印出来。好处,你们自己琢磨吧。(ps:这个demo,我会在下一篇博客中放出来,下篇博客是说transform的。

    presponder

    打印出一个集成于UIResponder控件的消息传递链。


    presponderpresponder

    这个也方便我们了解消息是如何传递的,打印的时候是倒叙打印的。

    visualize

    可以使用mac下的预览app打开我们的图片UIImage, CGImageRef格式的图片,甚至view和layer的图片 。

    visualize 0x79ec3140//或者变量名,此地址是id类型的

    pclass

    pclass可以打印出一个对象的继承关系。 pclasspclass

    taplog

    这个命令是模拟敲击一下屏幕,并且打印出你敲击屏幕时候事件接收的对象。


    imageimage

    hide&show

    hide命令可以直接隐藏一个对象,移除当前遮挡的对象便于你观察后面的对象。show命令会让它再次显示出来。

    bmessage

    这个命令就是lldb添加一个断点,譬如-viewWillAppear:这个方法,在当前控制器中你没有实现它,但是你又想在调用它的时机触发中断。

    Arguments:
    <expression>; Type: string; Expression to set a breakpoint on, e.g. "-[MyView setFrame:]", "+[MyView awesomeClassMethod]" or "-[0xabcd1234 setFrame:]"

    这个我就不解释了,需要补充一点的是oc的方法是带的。

    其他命令

    其它命令我用着并不是太多,并不代表他们不常用。只是我用的不太好而已,而且我认为用到是需要特殊的场景的,这个里说几个我感觉有很大作用但是我用的又不好的。

    1. wivar,这个命令是加watchPoint,用的好,就相当于使用lldb写了kvo了。(ps:恕我没研究明白)
    2. pvc这个命令的作用是打印出当前的控制器层级,(ps:有时好使,有时又很坏,似魔鬼的步伐.😢,没研究明白)
    3. vsfv,fvc,这几个命令都需要正则表达式的知识背景,因为我正则表达式从来都是百度,也没自己真正学过。所以对我不常用,但是对那些会正则的可能会很大作用。(ps:希望你们研究出来有什么好的技巧分享下)

    参考

    1. 南峰子的技术博客,工具篇:LLDB调试器
    2. Dancing in the Debugger — A Waltz with LLDB
    3. LLDB调试命令初探
    4. Xcode LLDB Debug教程

    我写的这些关于lldb的东西只是九牛一毛,它可以做的事情特别多,上面的参考都是我看过的比较好的lldb的知识,大家了解可以通过我上面的一些网站,更加深入的第三篇,我一时半会不会写的,因为那个才是真正的进阶,而我还没达到那种高度,如果你也有好的关于lldb的技巧,理解之类的,欢迎分享。

    相关文章

      网友评论

      • 93a65d8fa5ad:請問樓主可以補圖嗎!?
        圖貌似都掛點了~
      • fucuiping:卸载Chisel的命令是什么
        DevKyle:brew uninstall chisel
      • AnLuoRidge:图床挂了……
      • 7a946bf5d2ca:我现在chisel已经安装上了,在xcode控制台打印help也有,但是pviews等命令 没反应 输入完 敲完回车 一点反应都没有
        7a946bf5d2ca:@lg_pursuing 我给卸载了已经 不打算用了 研究了好久也不好使
        plantseeds:@大博哥 我也是pviews等命令没反应,刚问到 别人说是pviews命令在xcode7.3有bug,不能输出结果,然后我打算先不管了, 你可以打断点然后用 po [self.view recursiveDescription] 命令代替下
      • 中流者结使也:如果 ~/.lldbinit 不存在 使用以下命令添加一个即可

        touch ~/.lldbinit
        然后在终端输入:echo command script import /usr/local/Cellar/chisel/1.0.0/libexec/fblldb.py(这是自己的路径) >> ~/.lldbinit
        一号线:@中流者结使也 3Q :smile:
      • JARVIS_STUDIO:hi, kiss god, 从chisel翻到了你,好玩,方便加个微信吗?!
      • 海边卡夫卡:我没有.lldbinit文件,求教如何新建一个这样的文件?谢谢大神!
        ZZZLA:@海边卡夫卡 touch
      • f47cf49f3539:chisel安装的路径忘记了,怎么重新安装一下
      • 9dfbae8dcfcf:@kissGod
        我进入lldbinit文件后删除了之前的路径,添加了自己的就好了。在此谢谢kissGod.

        command script import /usr/local/opt/chisel/libexec/fblldb.py
      • kissGod:@wilson_yuan 哦,这个不是在终端执行的,是直接在你的个人文件夹中找到.lldb.init这个文件,如果没有就自己新建一个,然后使用vim里面的文件替换成下面的哪些,那个path/to是要替换一下你的chisel安装的路径。疏忽了,我认为官方很详细了,所以就没细写这一块!
      • 9dfbae8dcfcf:楼主,在安装这块能详细点吗?照着官方那边安装无法使用。猜应该是这块出问题了,帮我看看哈,谢谢:

        MobiletekiiMac:~ mobile$ command script import /path/to/fblldb.py
        Script started, output file is import
        script: /path/to/fblldb.py: No such file or directory

        Script done, output file is import

      本文标题: LLdb篇2教你使用faceBook的chisel来提高调试效

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