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最常用的一些命令,其他的在某些特定场景也有用到,我也不是很了解

参考:https://objccn.io/issue-19-2/

Chisel常用命令总结的更多相关文章

  1. Linux 常用命令(持续补充)

    常用命令: command &:将进程放在后台执行 ctrl + z:暂停当前进程 并放入后台 jobs:查看当前后台任务 bg( %id):将任务转为后台执行 fg( %id):将任务调回前 ...

  2. LVM基本介绍与常用命令

    一.LVM介绍LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制LVM - 优点:LVM通常用于装备大量磁盘的系统,但它同样适 ...

  3. Linux学习笔记(一):常用命令

    经过统计Linux中能够识别的命令超过3000种,当然常用的命令就远远没有这么多了,按照我的习惯,我把已经学过的Linux常用命令做了以下几个方面的分割: 1.文件处理命令 2.文件搜索命令 3.帮助 ...

  4. git常用命令(持续更新中)

    git常用命令(持续更新中) 本地仓库操作git int                                 初始化本地仓库git add .                       ...

  5. 【原】npm 常用命令详解

    今年上半年在学习gulp的使用,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令到自己博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块 ...

  6. npm常用命令

    npm常用命令 环境:win7 npm 是什么 NPM(node package manager),通常称为node包管理器.顾名思义,它的主要功能就是管理node包,包括:安装.卸载.更新.查看.搜 ...

  7. Git 常用命令

    一.初始環境配置 git config --global user.name "John Doe"git config --global user.email johndoe@ex ...

  8. linux iptables常用命令之配置生产环境iptables及优化

    在了解iptables的详细原理之前,我们先来看下如何使用iptables,以终为始,有可能会让你对iptables了解更深 所以接下来我们以配置一个生产环境下的iptables为例来讲讲它的常用命令 ...

  9. Linux常用命令(一)

    Linux常用命令 1. pwd查看当前路径(Print Working Directory)    [root@CentOS ~]# pwd/root 2. cd .. 返回上一级 .. 表示上一级 ...

随机推荐

  1. 一款基于jquery固定于顶部的导航

    今天给大家分享一款基于jquery固定于顶部的导航,这款导航当浏览器滚动条位于顶部时,导航高度较高,当浏览器滚动向下滚动时,导航高度自动减低,并位于顶部.效果图如下: 在线预览   源码下载 实现的代 ...

  2. 在chrome中的source找不到自己写的js时处理方法

    今天准备调试下js,突然发现在谷歌的中source中找不到我要调试的js,后来查资料和听同事说谷歌会把js压缩,于是找到以下方法来调试js 1. debugger神器 横扫各个浏览器.脚本运行到deb ...

  3. C语言 · 五次方数

    算法提高 五次方数   时间限制:1.0s   内存限制:256.0MB      问题描述 对一个数十进制表示时的每一位数字乘五次方再求和,会得到一个数的五次方数 例如:1024的五次方数为1+0+ ...

  4. POI生成EXCEL,公式不自动执行的有关问题

    POI生成EXCEL,公式不自动执行的问题 场景:POI读取Excel模板. 当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行, 而事先手工写入Excel模板文件的公式 ...

  5. ​网页图表Highcharts实践教程标之加入题副标题版权信息

    ​网页图表Highcharts实践教程标之加入题副标题版权信息 Highcharts辅助元素 辅助元素图表的非必要元素.如标题.版权信息.标签.加载动态.它们不和图表数据发生关联,仅仅是额外说明一些基 ...

  6. firewalled centos7

    zone绑定网卡 firewall-cmd --zone=internal --add-interface=ens192 --permanent firewall-cmd --permanent -- ...

  7. java-事务-案例

    项目结构: 数据库: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - threadlocal ************** ...

  8. .NET操作Excel笔记

    如果你新建一个项目的话,首先要添加Microsoft.Office.Core 与Microsoft.Office.Interop.Exce这两个应用,然后就能很方便的操作了,示例代码(只实现了简单的读 ...

  9. Keypress - 捕获键盘输入的JavaScript库

    Keypress 是一个强大的 JavaScript 库,用于捕获键盘输入.这是一个有非常特殊的功能的输入捕获库,它是很容易掌握和使用,并且不依赖第三方库.在网站开发中,经常会碰到需要处理键盘输入的场 ...

  10. javascript中字符串拼接详解

    字符串拼接是所有程序设计语言都需要的操作.当拼接结果较长时,如何保证效率就成为一个很重要的问题.本文介绍的是Javascript中的字符串拼接,希望对你有帮助,一起来看.   最近在研究<jav ...