LLDB 还只用到po么, 立刻跟我来篡改Xcode吧!(下篇)

这样IDEDebugBar在调用_createShowHideDebugAreaButton方法时候就会断住,断在函数的开端。
你也可以简写为b -[IDEDebugBar _createShowHideDebugAreaButton]。
c命令为process continue的简写, 运行到一下个断点。
注:breakpoint 有很多用法,例如 br li 将会显示工程中加入的所有断点,br del 删除断点, br set 设置断点
(br set -f dashi.m -l 20, 就是在dashi.m 这个文件中的20行设置了一个断点),br command add 可以添加一些额外指令,比如打log,修改值,跳过这个断点...
方法已经进来了,现在迫不及待想知道,这个button的实例到底是什么,以便于我可以将其篡改。
由于是返回值,所以我要跳出这个方法 
(lldb)thread step-out
注:thread step-out 属于流程控制,上面的c也属于流程控制,还有n单步调试,s进入方法,fi(thread step-out的简写)跳出方法
依照上图,看到我们已经从createShowHideDebugAreaButton方法中跳出来了。
取其返回值
(lldb) po $rax
<DVTGradientImageButton: 0x60800034b630>
oh!这个就是button实例,来吧,修改它。
先起个名字,好认!
(lldb) e DVTGradientImageButton* $btn = (id)0x60800034b630
(lldb) po $btn

如果你想知道DVTGradientImageButton里有哪些方法怎么办呢,对,仍然使用image lookup。

(lldb) image lookup -rn DVTGradientImageButton
22 matches found in /Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Versions/A/DVTKit:
        Address: DVTKit[0x0000000000018a7f] (DVTKit.__TEXT.__text + 93551)
        Summary: DVTKit`-[DVTGradientImageButtonCell initWithGradientStyle:borderSides:]        Address: DVTKit[0x0000000000018add] (DVTKit.__TEXT.__text + 93645)
        Summary: DVTKit`-[DVTGradientImageButtonCell initTextCell:]        Address: DVTKit[0x0000000000018b2d] (DVTKit.__TEXT.__text + 93725)
        Summary: DVTKit`-[DVTGradientImageButtonCell dvt_commonInitWithGradientStyle:borderSides:]        Address: DVTKit[0x0000000000018bb4] (DVTKit.__TEXT.__text + 93860)
        Summary: DVTKit`-[DVTGradientImageButtonCell _setGradientStyle:]        Address: DVTKit[0x0000000000018c66] (DVTKit.__TEXT.__text + 94038)
        Summary: DVTKit`-[DVTGradientImageButtonCell setBorderSides:]        Address: DVTKit[0x0000000000018c76] (DVTKit.__TEXT.__text + 94054)
        Summary: DVTKit`-[DVTGradientImageButtonCell setTitle:]        Address: DVTKit[0x0000000000019ea5] (DVTKit.__TEXT.__text + 98709)
        Summary: DVTKit`-[DVTGradientImageButtonCell setGradientStyle:]        Address: DVTKit[0x000000000001b4c6] (DVTKit.__TEXT.__text + 104374)
        Summary: DVTKit`-[DVTGradientImageButton setBorderSides:]        Address: DVTKit[0x000000000001b512] (DVTKit.__TEXT.__text + 104450)
        Summary: DVTKit`-[DVTGradientImageButton setGradientStyle:]        Address: DVTKit[0x000000000001b904] (DVTKit.__TEXT.__text + 105460)
        Summary: DVTKit`+[DVTGradientImageButton cellClass]        Address: DVTKit[0x000000000002896b] (DVTKit.__TEXT.__text + 158811)
        Summary: DVTKit`-[DVTGradientImageButtonCell setUsedAsRadioButton:]        Address: DVTKit[0x0000000000030939] (DVTKit.__TEXT.__text + 191529)
        Summary: DVTKit`-[DVTGradientImageButtonCell drawWithFrame:inView:]        Address: DVTKit[0x00000000000314e4] (DVTKit.__TEXT.__text + 194516)
        Summary: DVTKit`-[DVTGradientImageButtonCell borderSides]        Address: DVTKit[0x00000000000314f4] (DVTKit.__TEXT.__text + 194532)        Summary: DVTKit`-[DVTGradientImageButtonCell gradientStyle]        Address: DVTKit[0x0000000000050b9c] (DVTKit.__TEXT.__text + 323212)
        Summary: DVTKit`-[DVTGradientImageButtonCell initWithCoder:]        Address: DVTKit[0x00000000000b00fb] (DVTKit.__TEXT.__text + 713707)
        Summary: DVTKit`-[DVTGradientImageButtonCell initImageCell:]        Address: DVTKit[0x00000000001cd9c4] (DVTKit.__TEXT.__text + 1883316)
        Summary: DVTKit`-[DVTGradientImageButtonCell(Accessibility) accessibilityAttributeValue:]        Address: DVTKit[0x00000000002897f3] (DVTKit.__TEXT.__text + 2652899)
        Summary: DVTKit`-[DVTGradientImageButton gradientStyle]        Address: DVTKit[0x0000000000289837] (DVTKit.__TEXT.__text + 2652967)
        Summary: DVTKit`-[DVTGradientImageButton borderSides]        Address: DVTKit[0x000000000028987b] (DVTKit.__TEXT.__text + 2653035)
        Summary: DVTKit`-[DVTGradientImageButtonCell _shouldUseColorPunchOutStyle]        Address: DVTKit[0x000000000028991f] (DVTKit.__TEXT.__text + 2653199)
        Summary: DVTKit`-[DVTGradientImageButtonCell _isTabStyleCell]        Address: DVTKit[0x0000000000289988] (DVTKit.__TEXT.__text + 2653304)
        Summary: DVTKit`-[DVTGradientImageButtonCell usedAsRadioButton]
(lldb)
    
我发现两个专属于 DVTGradientImageButton 的方法
 -[DVTGradientImageButton setBorderSides:]
 -[DVTGradientImageButton setGradientStyle:]
我把这两个值修改一下看看是不是会产生和原来不一样的效果
(lldb) po [$btn setBorderSides:10]
(lldb) po [$btn setGradientStyle:10]
(lldb) c
Process 24887 resuming
瞧变模样了,有了边框和阴影,篡改成功
哈哈,这次篡改没有什么实际用处,但至少让xcode难受了一下。借此对lldb的探索希望能抛砖引玉,让大家做出更有意思的东西,记得使用(lldb)help哦,试试里面的其他功能!

推荐一个lldb的得力助手 https://github.com/facebook/chisel,感兴趣的同学可以去体现下,非常酷。
题外话(插件制作)

这里面没有具体讲插件的制作,以上所述的其实是插件制作的准备工作,当一切明了之后,可以Swizzler系统的方法,自定义行为,这就是插件的制作了。 
我最近也自己制作了一个插件,也是因为自己需要
由于我的mac 笔记本尺寸太小(11寸air),xcode 的menu太长,会把我的应用图标挡住,尤其会挡住我的popo和微信,来了信息都看不到(我习惯调静音)。 
原来是这样:
因此制作一款插件,来有选择的隐藏menu
这样勾掉的menu,就不会显示了,如果你需要显示再把勾打回来,这下,我的popo和微信都已经露出来了,可以看到popo和微信上的消息数了。
如果你们也需要,可以从这里下载,https://github.com/glorybird/MenuCleaner 下载后build and run



网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者范飞授权发布。