Xcode自带的超好用的诊断工具
Posted 知识小集
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode自带的超好用的诊断工具相关的知识,希望对你有一定的参考价值。
“我靠,这个问题怎么查,尝试了几十遍了,都不能复现?”,“我去,这个问题让我匪夷所思啊”……经常听到这类的声音,所以今天打算给大家简单介绍几款 Xcode
自带的超好用的诊断工具,来提高大家的工作效率。(本文不会介绍详细的使用方法,请自行谷歌或者百度。)
善待编译警告
Xcode
已经为我们准备了十分丰富的编译警告,尽管这些警告不会导致编译不过,但是背后一定没有无缘无故的恨。请正确对待所有警告,避免在运行时产生一些让你感到难以捉摸的现象,Treat Warnings as Errors
也不失为一个不错的选择。如果你对某些警告有绝对的自信,可以通过修改 Build Settings
里的 Warnings
选项,或者在提示警告的代码处添加 diagnostic ignore
来消除它们。随着 Xcode
的不断更新,你还应该通过工程文件的 Editor-Validate Settings
来将工程配置选项改为最优。
不要忽视Analyze
很早以前 Xcode
就已经为我们提供了静态检测工具,用它可以检测一系列难以发现的问题,例如内存泄露、逻辑错误、未使用的变量和未包含的库等。对于很多项目而言,完整的跑一次 Analyze
会花费较长的时间,也许是因为这一点,这项工具被越来越多的开发者忽视掉。你可以通过修改 Build Settings
里的 Analyze During 'Build'
在平时开发调试的过程中即时地进行Analyze。
运行时诊断
除了编译警告和 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 Malloc
、Zombie Objects
等,在最近两个版本中先后引入的 Sanitizers
和 Main 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
检测在子线程使用 AppKit
,UIKit
和其他 API
,这个检测工具是默认开启的,开启后不需要重新编译。原理是通过App启动后,自动替换只能在主线程使用的API,当调用此类API时剖出异常。
值得一提的是,由于 Address Sanitizer
、 Guard Malloc
或 Zombie Objects
的实现原理直接或间接地影响了运行时对象的内存管理,若开启了这些诊断工具,Debug Gauges
中的 Memory
一项会失效。
总结
尽早的解决警告和诊断 App
会大大提升上线后 App
的稳定性,同时也可以提高我们的工作效率,那还等什么呢,快点行动起来吧。
以上是关于Xcode自带的超好用的诊断工具的主要内容,如果未能解决你的问题,请参考以下文章