Xcode自带的超好用的诊断工具

欢迎关注咱们的公众号,咱们每周都会有原创文章分享。咱们主要定位在移动开发领域,分享移动开发技术,包括 iOS、Android、小程序、移动前端、React Native、weex 等。前端

知识小集 GitHubgit

“我靠,这个问题怎么查,尝试了几十遍了,都不能复现?”,“我去,这个问题让我匪夷所思啊”……常常听到这类的声音,因此今天打算给你们简单介绍几款 Xcode 自带的超好用的诊断工具,来提升你们的工做效率。(本文不会介绍详细的使用方法,请自行谷歌或者百度。)github

善待编译警告

Xcode 已经为咱们准备了十分丰富的编译警告,尽管这些警告不会致使编译不过,可是背后必定没有平白无故的恨。请正确对待全部警告,避免在运行时产生一些让你感到难以捉摸的现象,Treat Warnings as Errors也不失为一个不错的选择。若是你对某些警告有绝对的自信,能够经过修改 Build Settings 里的 Warnings 选项,或者在提示警告的代码处添加 diagnostic ignore 来消除它们。随着 Xcode 的不断更新,你还应该经过工程文件的 Editor-Validate Settings 来将工程配置选项改成最优。小程序

不要忽视Analyze

很早之前 Xcode 就已经为咱们提供了静态检测工具,用它能够检测一系列难以发现的问题,例如内存泄露、逻辑错误、未使用的变量和未包含的库等。对于不少项目而言,完整的跑一次 Analyze 会花费较长的时间,也许是由于这一点,这项工具被愈来愈多的开发者忽视掉。你能够经过修改 Build Settings 里的 Analyze During 'Build' 在平时开发调试的过程当中即时地进行Analyze。weex

运行时诊断

除了编译警告和 Analyze,苹果还为咱们提供了更多的动态调试工具。它们分散在 Xcode 的各个角落,与咱们平常开发息息相关,润物细无声。网络

Debug Gauges

App 开始调试以后,Xcode 左侧的 navigator 视图会自动切换到 debug navigator。在这里,默认状况下会展现几项关键指标来为你概述当前 App 的运行状态。经过它们你能够大体了解每一个线程的运行、内存申请、电量使用、磁盘读写、网络操做等情况。若是你关心更详细的诊断信息,你能够很方便地进入 Instruments 进行相应的诊断。多线程

###Process Debug工具

Xcode 为咱们提供了四种进程调试:单元测试

  • View Process by Thread:线程的调用栈,这个是默认的,也是咱们最经常使用的。加个断点,查看当前的全部线程调用状况。测试

  • View Process by Queue:和 View Process by Thread 差很少,当前队列名称会替代 Thread 命名,同时颜色也要丰富一些。

  • View UI Hierarchy:能够切换到上帝视角来查看视图层级和各视图属性。

  • View Memory Graph Hierarchy:能够方便的检测循环引用等内存泄露问题,很是实用。

开启Diagnostics

除了 Xcode 在早期为咱们提供的 Guard MallocZombie Objects 等,在最近两个版本中前后引入的 SanitizersMain Thread Checker 进一步完善了开发过程当中的检测工具。

  • Address Sanitizer

对于 MRC 环境下的 OC 来说,在一个对象被释放以后再去对它进行操做会触发 crash;进入 ARC 时代以后,咱们愈来愈少地去关心这个问题。但当你使用 Core Foundation,或者混编 C\C++ 的时候,这个问题会表现得不可预料。当一片内存区域被释放以后,在该区域被从新分配以前去访问它不会出现问题,这就带来了很大的随机性。除此以外,若是你在使用指针访问内存的时候不当心越了界,带来的后果也是不可预料的。对于这些问题,Xcode 提供了 Address Sanitizer 来更有力地进行检测。

  • Thread Sanitizer

以往,Data Race 的问题是十分难定位和排查的,由于它带来的问题每每是不可预期的。Xcode 经过记录每次内存访问的时间等信息,在每次访问内存的时候进行检测。在平常开发调试过程当中你能够选择性地开启这项工具,可是在单元测试中,应当考虑开启它,若你的用例覆盖度较高,它可能能够为你发现绝大部分多线程数据竞争的问题。

  • Undefined Behavior Santizer

未定义行文检测,好比说除以 0,加载内存对其指针、非关联一个空指针等。有可能引起 crash 也可能不 crash,具体状况和编译器有关系,可是咱们应该避免这种事情的发生。

  • Main Thread Checker

检测在子线程使用 AppKitUIKit 和其余 API,这个检测工具是默认开启的,开启后不须要从新编译。原理是经过App启动后,自动替换只能在主线程使用的API,当调用此类API时剖出异常。

值得一提的是,因为 Address SanitizerGuard MallocZombie Objects 的实现原理直接或间接地影响了运行时对象的内存管理,若开启了这些诊断工具,Debug Gauges 中的 Memory 一项会失效。

总结

尽早的解决警告和诊断 App 会大大提高上线后 App 的稳定性,同时也能够提升咱们的工做效率,那还等什么呢,快点行动起来吧。

相关文章
相关标签/搜索