这是昨天,同事无意将 Xcode 中的Address Sanitizer 开启导致的问题。经过多方查证,找到了2015的视频。我个人的理解是:内存中毒检测,什么意思呢,就是如果在开发的构成中,你将 Address Sanitizer(开启方式:Edit Scheme ->Run -> Diagnostics -> 勾选 Address Ssaitizer)开启,那么当你的应用程序访问的中毒区域的内存的时候,那么程序就会停止报错,然后通过堆栈信息进行分析,可以找到出现问题的地方。
这是苹果为开发者提供的一种检测App 运行期间堆栈出现问题的一种方式,然而,当我第一次看到程序因为这些而停止的时候,还不知所措,罪过罪过。
这段 WWDC 视频大约 30 分钟左右,我花了一个半小时看完。整个视频内容分为两部分:
第一部分: 主要讲解 View Debugger(也就是我们说的小面包工具的使用) 以及 break point 的使用,编辑断点,po $arg1 异常信息等
第二部分: 主要是 Address Sanitizer 的使用以及原理(原理这块我是蒙圈的,牵扯的单个内存以及C++的信息,后面还要加油看看这块)。最后最后,是对 Xcode 提供的程序内存检测工具的综合分析,这些工具主要有: Guard Malloc,NSZombie,Malloc Scrible,Leaks Instrument,以及其他的参考信息。
视频内容学习
View Debug
这个是我们日常使用的小面包工具,傻瓜式操作,当你的程序视图显示的和你预想的不一样的时候你可以选用它来查看视图层级结构以及约束,当然我个人觉得查看约束是个令人头疼的事情,哈哈。
Break Point
- 全局断点,这里可以检测程序崩溃的时候的信息,帮你定位到出现问题的代码部分。这里主要说了,可以通过配置断点中的 action ,通过 pod $arg1 将异常信息输出
- 程序运行时候的action可以针对,多次运行的程序的某个对象内容进行打印 也是通过 po 对象 方式
Address Sanitizer 基本使用。
这个很简单,就是将这个功能打开,然后重新编译程序,运行,当程序访问到中毒内存的时候就会停止,然后查看堆栈信息,一步步寻找问题,是不是很开心😊,因为你要分析地址,分析内存,视频中分析了byte double占用的字节什么的,调试程序就是这么有意思,你要深入到每个字节,每个位到底存了什么,应该放什么,我想这已经是最原子的操作了
Address Sanitizer 对程序性能的影响分析。
这个看看 PDF 的那个文件上面有记录,反正不大。
Address Sanitizer 原理分析。
这个我看不懂,但是我看懂的部分是,这个工具的原理是在你申请的内存周围填充上了一些中毒内存,如果你的运行期间的内存超出了你之前申请的内存,那么运行的程序就会踏入中毒内存,这样就监听到了问题指出,是不是很 nice 的设计。我很佩服 Apple Developer。
Xcode 内存分析工具综述
这部分内容其实很好,虽然是最后一笔带过,但是句句都是精华,表明了各个工具的使用场景,缺陷以及优势所在。