iOS LLDB:chisel & LLDB 插件

默认的LLDB虽然强大,但是使用过程中并不是很方便。在这个过程中有两个插件chiselLLDB,他们相当于给LLDB重新写了个定义。

一、chisel

chiselfacebook推出的工具。它是对LLDB API的封装。

1.1 chisel安装

brew update
brew install chisel

安装很简单直接使用homebrew安装。

更新

brew upgrade chisel

1.2 chisel配置

.lldbinit中增加配置:

command script import /usr/local/opt/chisel/libexec/fbchisellldb.py

没有.lldbinit目录的话则在家目录下创建一个(老版本的文件时fblldb.py)。

1.3 chisel命令

配置完成重新运行项目就可以在xcodelldb中使用了。可以通过help <command>查看具体用法。

pviews

Syntax: pviews [--up] [--depth=depth] [--window=window] [--short] [--medium] <aView>

循环打印view层级,正常情况下等效于调用recursiveDescription命令

(lldb) po [self.view recursiveDescription]
(lldb) pviews self.view
  • --up/-u: 以view为起始位置,向上打印,直到打印到window
  • --depth/-d: 传入int类型,表示打印的层数,0表示没有限制
  • pviews:不带任何参数则打印所有视图。

pvc

Syntax: pvc <aViewController>

循环打印viewController的层级,不传参数默认当前vc

pclass

Syntax: pclass <object>

循环打印class的继承关系。

(lldb) pclass 0x7fb4b1906330
ViewController
   | UIViewController
   |    | UIResponder
   |    |    | NSObject

presponder

Syntax: presponder <startResponder>

打印响应链。

(lldb) presponder 0x7fb4aec08160
<UIButton: 0x7fb4aec08160; frame = (172 338; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x60000027e800>>
   | <UIView: 0x7fb4b1907ac0; frame = (0 0; 390 844); autoresize = W+H; layer = <CALayer: 0x600000238ee0>>
   |    | <ViewController: 0x7fb4b1906330>
   |    |    | <UIDropShadowView: 0x7fb4aef08040; frame = (0 0; 390 844); autoresize = W+H; layer = <CALayer: 0x60000022bbe0>>
   |    |    |    | <UITransitionView: 0x7fb4b1806300; frame = (0 0; 390 844); autoresize = W+H; layer = <CALayer: 0x60000024dc60>>
   |    |    |    |    | <UIWindow: 0x7fb4b19075d0; frame = (0 0; 390 844); gestureRecognizers = <NSArray: 0x600000c25920>; layer = <UIWindowLayer: 0x600000238140>>
   |    |    |    |    |    | <UIWindowScene: 0x7fb4aef04080; scene = <FBSScene: 0x600002c7da00; identifier: sceneID:com.haier.uhome.sybird-default>; persistentIdentifier = 84A1C936-704A-401B-95A0-F2578FB0B9F0; activationState = UISceneActivationStateForegroundActive; settingsCanvas = <UIWindowScene: 0x7fb4aef04080>; windows = (
    "<UIWindow: 0x7fb4b19075d0; frame = (0 0; 390 844); gestureRecognizers = <NSArray: 0x600000c25920>; layer = <UIWindowLayer: 0x600000238140>>"
)>
   |    |    |    |    |    |    | <UIApplication: 0x7fb4aee04970>
   |    |    |    |    |    |    |    | <AppDelegate: 0x60000006c270>

pmethods

Syntax: pmethods [--address] [--instance] [--class] [--name] <instance or class>

打印当前对象都有哪些方法。

(lldb) pmethods 0x7fb4b1906330
Class Methods:
No methods were found

Instance Methods:
- (void)test2:(bool)arg0 
- (void)click1:(id)arg0 
- (void)click2:(id)arg0 
- (void)click3:(id)arg0 
- (void).cxx_destruct
- (id)items
- (void)touchesBegan:(id)arg0 withEvent:(id)arg1 
- (void)viewDidLoad
- (void)setItems:(id)arg0 

pinternals

Syntax: pinternals [--apple] <object>

打印成员属性

(lldb) pinternals 0x7fb4b1906330
(ViewController) $78 = {
  UIViewController = {
    UIResponder = {
      NSObject = {
        isa = ViewController
      }
    }
  }
  _items = 0x0000600000c21380 @"3 elements"
}

fvc

Syntax: fvc [--name=classNameRegex] [--view=view]

查找viewController

  • --name/-n: string类型参数,根据viewControllerClass名字查找viewController
  • --view/-v: UIView类型参数,根据viewController拥有的view查找viewController
(lldb) fvc -v 0x7fb4aed06610
Found the owning view controller.
<ViewController: 0x7fb4b1906330>

fv

Syntax: fv <classNameRegex>

根据view的名字查找view

(lldb) fv UIButton
0x7fb4b190a570 UIButton
0x7fb4aed06610 UIButtonLabel
0x7fb4aec07e80 UIButton
0x7fb4b1905400 UIButtonLabel
0x7fb4aec08160 UIButton
0x7fb4aee07e40 UIButtonLabel

flicker

view闪烁一下,以便于查找view的位置

Syntax: flicker <viewOrLayer>
  • <viewOrLayer>:需要闪烁的view或者layer

taplog

将点击的view打印出来。

Syntax: taplog

vs

view层级中搜索view,并显示出来

Syntax: vs <view>

相比fvvs主要用于显示view在屏幕上的位置

(lldb) vs  0x7fa50070dfb0

Use the following and (q) to quit.
(w) move to superview
(s) move to first subview
(a) move to previous sibling
(d) move to next sibling
(p) print the hierarchy

<UIButton: 0x7fa50070dfb0; frame = (172 338; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x6000036a2160>>
  • w: 移动到superview
  • s: 移动到第一个subview
  • a: 移动到前面的同级view
  • d: 移动到后面的同级view
  • p: 打印出层级
  • q: 退出

可以配合以上命令在层级中查找view

更多命令参考官方文档。

二、Derekselander/LLDB

LLDB

2.1 LLDB安装

下载整个工程,将整个工程拷贝到/opt目录中。

image.png

2.2 LLDB配置

.lldbinit中增加配置:

command script import /opt/LLDB/lldb_commands/dslldb.py

注意路径为自己拷贝的路径地址。

2.3 LLDB命令

search

查找类及其子类。

Syntax: search
  • -e:忽略子类。
  • -c:查找对应tag的类和子类。
search UIView -c "(int)[obj tag]==5"
(lldb) search UIView
<UIView: 0x7ff307e05800; frame = (172 338; 46 30); alpha = 0.4; tag = 140681785939936; layer = <CALayer: 0x600000065200>>

<UIView: 0x7ff307c07c70; frame = (291 338; 46 30); alpha = 0.4; tag = 140681785939200; layer = <CALayer: 0x60000000ad80>>

<UIView: 0x7ff307c06390; frame = (291 338; 46 30); alpha = 0.4; tag = 140681785939200; layer = <CALayer: 0x60000000ada0>>

<UIButtonLabel: 0x7ff30a0059a0; frame = (0 6; 46 18); text = 'Button'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x60000230d450>>

methods

查找对象对应的方法

methods 0x7ff30a009e70
(lldb) methods 0x7ff30a504da0
<ViewController: 0x7ff30a504da0>:
in ViewController:
    Properties:
        @property (retain, nonatomic) NSMutableArray* items;  (@synthesize items = _items;)
    Instance Methods:
        - (void) test2:(BOOL)arg1; (0x1035ebbf0)
        - (void) click1:(id)arg1; (0x1035ebb30)
        - (void) click2:(id)arg1; (0x1035ebb70)
        - (void) click3:(id)arg1; (0x1035ebbb0)
        - (void) .cxx_destruct; (0x1035ebc80)
        - (id) items; (0x1035ebc20)
        - (void) touchesBegan:(id)arg1 withEvent:(id)arg2; (0x1035ebaa0)
        - (void) viewDidLoad; (0x1035eb830)
        - (void) setItems:(id)arg1; (0x1035ebc40)
(UIViewController ...)

对应的pmethods信息:

(lldb) pmethods 0x7ff30a504da0
Class Methods:
No methods were found

Instance Methods:
- (void)test2:(bool)arg0 
- (void)click1:(id)arg0 
- (void)click2:(id)arg0 
- (void)click3:(id)arg0 
- (void).cxx_destruct
- (id)items
- (void)touchesBegan:(id)arg0 withEvent:(id)arg1 
- (void)viewDidLoad
- (void)setItems:(id)arg0 

它与chiselpmethods相比信息更全,带了地址。

sbt

sbt相比bt恢复了oc的符号。

(lldb)  sbt
frame #0 : 0x1035ebc0d LLDBTest`-[ViewController test2:] + 29
frame #1 : 0x1035ebaff LLDBTest`-[ViewController touchesBegan:withEvent:] + 95
frame #2 : 0x7fff246ca70f UIKitCore`forwardTouchMethod + 321
frame #3 : 0x7fff246ca5bd UIKitCore`-[UIResponder touchesBegan:withEvent:] + 49
frame #4 : 0x7fff246d95b5 UIKitCore`-[UIWindow _sendTouchesForEvent:] + 622
frame #5 : 0x7fff246db6c7 UIKitCore`-[UIWindow sendEvent:] + 4774
frame #6 : 0x7fff246b5466 UIKitCore`-[UIApplication sendEvent:] + 633
frame #7 : 0x7fff24745f04 UIKitCore`__processEventQueue + 13895
frame #8 : 0x7fff2473c877 UIKitCore`__eventFetcherSourceCallback + 104
frame #9 : 0x7fff2039038a CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
frame #10: 0x7fff20390282 CoreFoundation`__CFRunLoopDoSource0 + 180
frame #11: 0x7fff2038f764 CoreFoundation`__CFRunLoopDoSources0 + 248
frame #12: 0x7fff20389f2f CoreFoundation`__CFRunLoopRun + 878
frame #13: 0x7fff203896d6 CoreFoundation`CFRunLoopRunSpecific + 567
frame #14: 0x7fff2c257db3 GraphicsServices`GSEventRunModal + 139
frame #15: 0x7fff24696cf7 UIKitCore`-[UIApplication _run] + 912
frame #16: 0x7fff2469bba8 UIKitCore`UIApplicationMain + 101
frame #17: 0x1035ec022 LLDBTest`main + 114
frame #18: 0x7fff2025a3e9 libdyld.dylib`start + 1

更多命令和用法直接参考官网的示例。

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

推荐阅读更多精彩内容