本文由 简悦SimpRead 转码,原文地址 useyourloaf.com
如果你正在努力调试一个内存损坏的问题,你可能想看看地址......。
如果你正在努力调试一个内存损坏的问题,你可能想看看Xcode 7引入的Address Sanitizer。
启用Address Sanitizer
为了使用Address Sanitizer,你需要编辑方案(从 "Product "菜单中选择 "Scheme">"Edit Scheme...")。然后在 "运行 "命令中选择 "诊断 "标签并勾选 "启用地址消毒器 "选项。
它对模拟器和重新编译后的设备都有效。你还应该使用无[-O0]或最多快速[-O1]的编译器优化级别。
输出示例
一个微不足道的例子来说明当我们错误地访问超过内存缓冲区的末端时,它是如何工作的。
- (void)viewDidLoad {
[super viewDidLoad];
char *buffer = malloc(80);
buffer[80] = 'Y';
free(buffer);
}
当地址净化器检测到无效的访问时,调试器就会中断,并向控制台写出大量报告(我在这里截断了输出)。
==6726==ERROR: AddressSanitizer:堆缓冲区溢出在地址
0x607000024ea0 at pc 0x00010a8aff0c bp 0x7fff5534d9e0 sp 0x7fff5534d9d8
在0x607000024ea0线程T0的大小为1的WRITE。
...
SUMMARY: AddressSanitizer: heap-buffer-overflow ?:0 -[ViewController viewDidLoad]
错误地址周围的阴影字节。
0x1c0e00004980: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
详细的报告可能有点令人费解,难以理解。幸运的是,Xcode将地址消毒器集成到调试导航器中,这样你就可以快速看到调用堆栈和违规的代码行。
你还可以在Debug Navigator的下部查看损坏的内存的历史。
何时使用
重要的是要明白,地址消毒器是一个运行时工具,所以你需要锻炼你的代码,让它发现问题。这使得它在运行单元和UI测试时成为一个很好的候选者。虽然苹果公司声称它的开销很低(2x-5x CPU和2x-3x内存),但它并不是没有性能的,所以如果你有大型的测试套件,你可能想在启用它之前进行实验。
像以前一样,通过编辑方案启用地址消毒器进行测试,这次为 "测试 "命令启用它。
关于地址消毒器如何工作的一些额外背景阅读。