6

几天来,我一直在调试臭名昭著的 EXC_BAD_ACCESS 错误。NSZombieEnabled = YES 没有提供任何东西。每次我收到错误时,调用堆栈都是不同的,每 5 或 6 次运行一次。

我在 Lou Franco 的网站上看到了启用保护 malloc 的提示(现在在 Xcode 4 的方案编辑器中):Understanding EXC_BAD_ACCESS。一旦我这样做了,我的程序就停在导致这个难以捉摸的错误的确切行上。

根据其描述,guard malloc 为每个 malloc 创建单独的页面,并在释放内存时删除整个页面,从而在访问释放的内存时使程序崩溃。对于一般开发,我为什么不一直保持警卫malloc?它似乎很容易捕捉到某些类型的内存错误。如果我没有专门测试内存管理或性能,使用它是否有一些缺点?

4

3 回答 3

7

它不仅浪费地址空间,而且会显着减慢您的程序(可能到无法使用的地步,即使在模拟器上也是如此)。我想当你在模拟器上运行 iOS 程序时,它有点没有实际意义(内存不是问题,性能也不是很糟糕),但也许以最佳实践的名义你不应该不断运行它。

于 2011-03-18T23:54:19.873 回答
3

为每个字节分配整个 4K 页面会很快malloc()浪费地址空间。

于 2011-03-18T23:07:35.330 回答
2

GuardMalloc 确实会使应用程序运行得更慢,尤其是在正常执行过程中有大量分配的情况下。我大部分时间都关闭它。

我打开 GuardMalloc 以调试破坏堆栈的崩溃。通常,这些 objc_msgSend 位于堆栈左侧的顶部。

使用 GuardMalloc,可以防止悬空指针的随机影响。指针中的地址不能重复使用,并且其内存位置无效。崩溃几乎会立即发生,早在堆栈损坏之前。这对于 C++ 遗留代码以及新的 Objective-C 非常有用。

我确实将其他内存调试辅助工具留给了全职工作。

于 2011-11-30T22:50:01.247 回答