Guard Malloc立即发现EXC_BAD_ACCESS错误。为什么不一直使用?

时间:2011-03-18 23:05:09

标签: iphone malloc exc-bad-access guard

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

我在Lou Franco的网站{​​{3}}上看到了启用guard malloc(现在是Xcode 4的方案编辑器)的提示。一旦我这样做,我的程序就停止了导致这个难以捉摸的错误的确切行。

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

每个malloc()分配几个字节的整个4K页面会浪费地址空间非常

答案 2 :(得分:2)

GuardMalloc确实使应用程序运行得慢得多,尤其是在正常执行过程中有大量分配时。我大部分时间都把它关掉了。

我打开GuardMalloc来调试崩溃堆栈的崩溃。通常,这些在堆栈剩余的顶部都有objc_msgSend。

使用GuardMalloc,可以防止悬空指针的随机效应。指针中的地址无法重复使用,其内存位置无效。崩溃将在堆栈损坏之前几乎立即发生。这非常适合C ++遗留代码以及新的Objective-C。

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