Chisel、LLDB、Cycript指令调试命令简单记录

180 阅读3分钟

chisel

facebook封装的一个lldb指令库

pviews

打印当前界面图层结构

pvc

打印当前界面控制器结构

pactions <地址>

打印某个按钮地址的事件

presponder <地址>

打印响应者链条

pclass <地址>

打印类的继承关系

pmethods <地址>

打印类的方法列表(类方法和对象方法)

methods <地址>

打印类的方法列表(包括父类)

pinternals <地址>

打印成员属性列表,带 _

fvc -n DJViewController

只知道名字,拿到这个vc的信息

fvc -v <地址>

以地址,查vc

fv DJView

查视图

taplog

设置响应(如点击)断点,当点击按钮或触发手势,会断住,方便调试

flicker <地址>

让地址对应的视图隐藏并显示(相当于闪了一下)

vs <地址>

视图变红,进入动态调试环境,如下图

LLDB

search DJView

通过类名查找视图

sbt

恢复并查看当前调用栈未恢复的符号

Cycript

主要通过修改内存用来调试界面,可以附加到手机应用进程上而不使用Xcode,一般app检测不到cycript,但是可以检测到image list

cycript -r 192.168.1.112:6666

附加cycript环境到当前手机app上,要求电脑和手机同一个网段(局域网),112是手机当前IP,6666是monkeydev默认设置监听的端口。(注意:尽量不要把当前应用切换到后台)

cy# UIWindow.keyWindow()

就可以拿到当前window

cy# var keyWindow = UIWindow.keyWindow()
cy# keyWindow.rootViewController

以上代码就可以通过cycript的环境来定义变量,方便调试

注意:

1. 只要当前进程没有挂,keyWindow就还在

2. 只要页面变了,内存地址就不要再用了

cy# #0x00000102764CDA

通过前面加#号,相当于拿到这个地址的对象或变量,类似于 po

cy# *keyWindow

通过前面加*号,可以拿到这个地址对象的成员变量

cy# keyWindow.recursiveDescription().toString()

打印keyWindow的视图层级,加toString是为了排列好看

cy# choose(UIButton)

把所有UIButton打印出来,类似与LLDB的search

ctrol+d表示退出当前cycript环境

cy# pviews()
cy# pvcs()
cy# pactions(#0x00000102764CDA)

打印视图层级等类似chisel用法,是monkeydev配置plist文件里加载的好用的命令

#自定义cycript

工程目录创建后缀 .cy 文件,项目build phases 里面copy files选项加入此文件到工程包,后面不需要打勾,重新运行项目

然后在终端连接进入cycript环境

cycript -r 192.168.1.112:6666
cy# @import diyCycript

使用@import导入刚创建的.cy文件,即可使用diyCycript文件(看下图)里写的方法

可以写入类似平时开发获取当前控制器的代码,方便调试时拿到当前控制器,根据情况使用chisel和LLDB来动态调试

写入的cy文件为了以后维护方便,可以参考Monkeydev的做法,把自己写的cy文件上传到云,拉取使用即可