前言
博客文章:iOS真机桌面级调试工具 - TDFScreenDebugger
这个组件其实一年前就开始着手做了,但由于公司的项目很忙,加上自己有时候也偷懒,中间断断续续地写了一段时间,幸好还是有一点点毅力和精力,终于在这段时间完成了一个相对稳定的版本。下面先介绍一下整个组件的架构设计。
可以看到,TDFScreenDebugger 主要包含 API日志
、Apple系统日志
、野指针排查
、自动化崩溃捕获
、内存泄漏检测
、循环引用
、APM性能监控
、User Tracing
等附属模块。其中 User Tracing
是未来一段时间将要扩展的一个模块,用于 协助观察用户行为轨迹
,目前还没有接入。
TDFScreenDebugger 希望能帮助一部分程序猿更好地与测试人员相处,增强发现程序问题和追溯问题根源的能力。
设计初衷
- 公司项目与第三方清算平台对接时由于时间戳问题导致密钥匹配失败,真机上调试了很长时间,因为无法查看真机日志,调试效率很低。
- 至少两次因为服务器端接口调整导致业务页面显示异常而为此背上了锅。
- 有一次测试后,我的手机无论如何调试都没问题,而测试的手机随意操作就会崩溃。
- 测试人员给你一个Crash然后就没有然后了。
上述这些经历都激发了我设计与实现这个组件的动力。
TDFScreenDebugger主体的设计
TDFScreenDebugger 负责各大附属模块的合作、动效与性能优化。具体包括
- 维护一个 DispatchQueuePool,因为很多附属组件都有自己的常驻监控需求,因此可以有效利用多核优势。
- 部分数据展示(以APM为主)的更新采用异步绘制渲染机制。
- flowlayout动画设计以及一些视图细节优化。
接下来简单地介绍一下各大附属功能模块的功能。
API日志模块
- 中文的Unicode字符UTF-8化
- 美化格式
- 图片上传时的BodyStream处理
- 支持日志内容的实时关键词搜索
- API新日志"消息提醒"
- 可删除现有日志内容
- 提供离散型和绑定型日志视图,通过特定手势(默认为摇晃)直接在业务视图与API日志模块之间切换,使用比抓包工具更便捷
Apple系统日志模块
- 与API日志分离,更加简洁
- 支持日志内容的实时关键词搜索
- 可删除现有日志内容
- 通过特定手势(默认为摇晃)直接在业务视图与Apple系统日志模块之间切换,在Xcode模拟器上甚至比切换到Xcode控制台查看日志更方便
自动化崩溃捕获模块
- 默认自动捕获,无需配置
- 支持mach、signal、NSException等崩溃类型
- 崩溃现场直接弹出友好视图提示开发者,并携带相应的堆栈信息,通过正则表达式帮助您更快定位崩溃原因代码
- 支持安全与非安全捕获模式(崩溃现场直接弹出提示视图)
- 支持查看崩溃历史及其原因
野指针排查模块
- 默认为关闭状态,开启后即可快速定位潜在的野指针错误
- 定位到的野指针错误会提供调用野指针对象的相关信息,帮助开发者更快定位,并配合"自动化崩溃捕获模块"弹出友好视图
APM性能监控模块
- 检测应用内存占用、应用CPU占用、视图FPS帧数变化、视图卡顿等多项监控数据
- 视图FPS帧数低于警告阈值或视图卡顿时自动以高亮提示
- 监控数据实时更新采用异步绘制渲染方式,对主线程影响非常小
- 可以回溯发生卡顿时对应的堆栈信息
内存泄漏模块
此模块沿用了PLeakingSniffer的设计思路,可算是一种PLeakingSniffer的改进方案,除了具有PLeakingSniffer的一些优点外,还在以下方面进行了优化。
- 以UIViewController的子类为树根结点的子结点检测将会包含数组等基本集合数据结构,因为这些结构的元素一样是被强引用的,应该被包含在检测对象的范围内。(NSPointerArray、NSMapTable、NSHashTable除外)
- 会自动排除一个结点下的单例对象的强引用,这种属于错误检测判断。
- 将除了集合数据结构以外的其他苹果框架中的类(不包括NSTimer类)排除在检测范围之外,以提高检测性能。
- 提供Alert、Console、Exception三种可疑提示方式。
循环引用模块
Facebook大厂出品的FBRetainCycleDetector已足够优秀,所以这个模块只负责封装与接入,然后进行一些自动化的配置和触发控制。
关于未来
上文提到,在未来一段时间,博主将在User Tracing方面进行深入研究和试验。除此之外,争取引入更多实用黑科技,共同打造更加完美的应用。
如果有好的建议或者对上述模块有更优实现思路的话,欢迎在文下评论或私下与我分享交流([email protected])~