VKDevTool App黑盒调试工具

YvetteAbner 8年前
   <p><a href="/misc/goto?guid=4959713676201099800" rel="nofollow,noindex">App内调试工具 Github VKDevTool</a></p>    <p>允许在</p>    <ul>     <li>在脱离Xcode Debug的情况下</li>     <li>黑盒真机情况下</li>    </ul>    <p>进行App的调试工作,包括:</p>    <ul>     <li>调试内存对象</li>     <li>打印内存数据</li>     <li>修改UI</li>     <li>查看NSLog</li>     <li>查看所有网络请求记录</li>     <li>查看App界面层级</li>    </ul>    <p>方便在黑盒测试+内部体验的环境下,发现Bug后,直接在Bug现场调试内存,分析问题</p>    <h2>使用介绍</h2>    <h2>工程配置</h2>    <ul>     <li>将 VKDevTool 文件夹拖入工程文件</li>     <li>将 VKDevToolLogHeader.h 写入pch,以便开启NSLog的动态拦截记录,不导入ConsoleLog模块无法捕获NSLog</li>     <li>可以修改 VKDevToolDefine.h 中的 #ifdef DEBUG 来进行自定义的编译控制,如果不修改,默认Debug模式下VKDevTool工具才有效</li>    </ul>    <h2>编写代码</h2>    <pre>  <code class="language-objectivec">[VKDevTool enableDebugMode];  </code></pre>    <p>一行代码即可开启DevTool的功能,该功能内部有编译控制,Release版本会自动失效,无需使用者在这行代码外围在套一层 #ifdef DEBUG</p>    <h2>如何使用</h2>    <p>进行完工程配置与写入代码之后可以通过如下方式,在App内打开工程模式菜单</p>    <ul>     <li>模拟器下,使用键盘command+x快捷键唤起菜单</li>     <li>真机运行下,使用摇一摇唤起菜单</li>    </ul>    <p><img src="https://simg.open-open.com/show/876831f0d145e9a7c77d8e2cd471489f.jpg"></p>    <p>主菜单模块包含4个模块</p>    <ul>     <li>DebugScript</li>     <li>ConsoleLog</li>     <li>NetworkLog</li>     <li>ViewHierarchy3D</li>    </ul>    <p>VKDevTool采取模块化设计,每个模块Module都可以独立分拆分离,同时支持用户定义扩展自己的模块,图中的额外2个模块为自定义模块</p>    <h2>黑盒调试功能DebugScript</h2>    <ul>     <li>在主菜单中选择 DebugScript</li>     <li>按提示点选任意一个界面元素</li>     <li>进入代码控制台</li>     <li>上面是代码输入框</li>     <li>下面是输出框</li>    </ul>    <p style="text-align:center"><img src="https://simg.open-open.com/show/dbd3876b30fce1cc8f13c50d0a501c82.jpg"></p>    <p>以上是一个预览界面,上方输入的代码都是基于JSPatch的,所有JSPatch的语法规则这里都一模一样可以使用,戳这里看JSPatch如何使用 <a href="/misc/goto?guid=4959713676292044363" rel="nofollow,noindex">JSPatch语法</a></p>    <ul>     <li>真机摇一摇 or 模拟器Command+X 可以唤起DebugScript模块子菜单</li>     <li>模拟器下如果输入过代码Command+X可能不好使,通过模拟器菜单 Shake Gesture 功能模拟摇一摇,依旧可以唤起</li>    </ul>    <p>子菜单包含以下几个功能</p>    <ul>     <li> <p>GetTarget :自动往输入框中输入getTarget的脚本代码,执行以后print Target信息,便于后续直接调试target的任意内存数据和执行方法</p> </li>     <li> <p>Get TargetVC :自动往输入框中输入getTargetVC的脚本代码,执行以后print Target所在的当前vc的信息,便于后续直接调试targetVC的任意内存数据和执行方法</p> </li>     <li> <p>ChangeTarget :自动往输入框中输入切换所选target的代码,执行后,重新返回选择target界面</p> </li>     <li> <p>ClearInput :清空输入区域</p> </li>     <li> <p>ClearOutput :清空输出区域</p> </li>     <li> <p>Exit :退出DebugScript</p> </li>    </ul>    <p>除此之外,DebugScript为JS代码添加了一个功能print()函数,可以print任意OC对象,如果对象是View,还会有额外的frame等信息输出</p>    <p>我们通过一个GIF动画,大体看一下调试JS代码如何使用,此处的Gif是旧的Gif,新版本的颜色样式都已经调整,加了子菜单快捷方式,但是用法完全不变</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/861c701002a9a4eb9704a1548b5de218.gif"></p>    <h2>日志拦截功能ConsoleLog</h2>    <p>在PCH中加入了 VKDevToolLogHeader.h 后,本模块会拦截所有NSLog打印日志,以及NSError生成记录,在这个界面进行列表展示</p>    <ul>     <li>NSLog记录采用宏覆盖的方式,拦截接管了所有NSLog请求,以白色展现在界面内。</li>     <li>NSError记录采用Runtime Swizzle的方式,拦截了NSError的init,以红色展现在界面内</li>    </ul>    <p style="text-align:center"><img src="https://simg.open-open.com/show/a47a6b9d4248e297739356553312491c.jpg"></p>    <p>真机摇一摇 or 模拟器Command+X 可以唤起ConsoleLog模块子菜单</p>    <ul>     <li>NSError Hook:开启和关闭NSError拦截</li>     <li>Copy to Pasteboard:把所有日志信息拷贝到剪切板</li>     <li>Search Keyword:在众多日志中搜索关键字,关键字以蓝色展示</li>     <li>Exit:退出</li>    </ul>    <h2>网络拦截功能NetworkLog</h2>    <p>VKDevTool会采用NSURLProtocol的方案,拦截hook所有的http请求,一一记录起来,以列表的形式,展现在NetworkLog模块内</p>    <p>每个cell,都可以点击查看每一条网络请求的真实返回数据,并且支持复制到剪切板</p>    <p>真机摇一摇 or 模拟器Command+X 可以唤起NetworkLog模块子菜单</p>    <ul>     <li>Network Hook:可以选择开启和关闭http拦截</li>     <li>Change Filter:可以通过过滤器,过滤含有固定字符串的网络请求,方便查找搜索</li>     <li>Exit:退出</li>    </ul>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3d10c75f6fc1c96970a2c636606bdd46.jpg"></p>    <p>如果NetworkHook无效,查看是否是因为AFN sessionManager需要注册NSURLProtocol导致的</p>    <pre>  <code class="language-objectivec">NSURLSessionConfiguration *configuration= [NSURLSessionConfiguration defaultSessionConfiguration];  NSArray *protocolArray = @[[VKURLProtocol class]];  configuration.protocolClasses = protocolArray  </code></pre>    <h2>页面层级ViewHierarchy3D</h2>    <p>VKDevTool采用YY大神开源的 <a href="/misc/goto?guid=4959713676392844633" rel="nofollow,noindex">YYViewHierarchy3D</a> ,实现了这个页面层级模块</p>    <ul>     <li>真机摇一摇 or 模拟器Command+X 可以唤起ViewHierarchy3D模块子菜单</li>     <li>模拟器下Command+X可能不好使,通过模拟器菜单 Shake Gesture 功能模拟摇一摇,依旧可以唤起</li>    </ul>    <p style="text-align:center"><img src="https://simg.open-open.com/show/917fa99ef29bc74218b72d71ec1a3105.jpg"></p>    <h2>其他扩展代码</h2>    <pre>  <code class="language-objectivec">[VKDevTool changeNetworktModuleFilter:@“xxxxx”];  </code></pre>    <p>这个接口控制网络请求HookLog的过滤器,只拦截含有xxxx字符串的http网络请求,同时在DevTool内还可以通过菜单,修改网络拦截过滤器</p>    <p>如果全都拦截,可以省略</p>    <pre>  <code class="language-objectivec">[VKDevTool registKeyName:@"custom module name"withExtensionFunction:^{  //todo your code  }];  </code></pre>    <p>VKDevTool采取模块化设计,每个模块Module都可以独立分拆分离,同时支持用户定义扩展自己的模块</p>    <p>这个接口用于给VKDevTool扩展主菜单模块,可以省略不写,只使用自带的4个模块。</p>    <p> </p>    <p>来自:http://awhisper.github.io/2016/09/01/VKDevTool/</p>    <p> </p>