Chisel的初步使用

最近每周末都会看叶孤城的直播,对于我们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的博客,貌似这个博客暂时没怎么更新了,但可以关注他的博客.

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

推荐阅读更多精彩内容

  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    CoderSC阅读 1,346评论 0 2
  • 不玩LLDB,不知道chisel有多强大。chisel之于LLDB,就像iPhone之于手机,前者几乎给后者重新下...
    小笨狼阅读 9,550评论 15 78
  • iOS调试之chisel Chisel 是一个 LLDB 指令集合,用户辅助 iOS 应用差错。 安装 chise...
    comst阅读 4,605评论 0 13
  • 转载 与调试器共舞 - LLDB 的华尔兹: https://objccn.io/issue-19-2/ 推荐:i...
    F麦子阅读 3,327评论 0 10
  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    paraneaeee阅读 1,184评论 0 7