是否存在用于iOS Xcode开发的无效写入(内存损坏)检测工具?

时间:2014-07-15 23:25:54

标签: ios xcode memory-corruption

当我使用C ++进行编程时,当我发现内存损坏发生时,我的首选是启动Valgrind并查看它是否在该行的某处发生了无效写入。既然我写的代码应该在32位iPhone上运行,而我的开发环境是OSX Mavericks上的Xcode,那么Valgrind似乎不再是一个选项;甚至抛开架构不匹配,谷歌搜索揭示了很多关于Valgrind和Mavericks之间不兼容的报道,尤其是32位二进制文​​件。但是,我无法在Xcode Instruments中找到具有类似功能的任何内容 - 内存泄漏检测器都很好,但没有什么可以找到那些卑鄙的内存损坏

有没有人知道在开发/调试iOS应用程序时检测无效写入的好工具?

1 个答案:

答案 0 :(得分:6)

使用随Xcode提供的Guard Malloc。

单击顶部按钮右侧的应用程序名称,以显示项目中的方案列表。选择编辑方案......'在底部。在出现的对话框中选择“诊断”'标签。在那里,勾选以启用Guard Malloc。

Apple的文档正是关于它及其他一些选项的作用是here,但是当你运行时记录到控制台的文本解释了这一切:

Allocations will be placed on 16 byte boundaries. 
 - Some buffer overruns may not be noticed. 
 - Applications using vector instructions (e.g., SSE) should work.

每个新分配都将在新页面上开始。将使用适当的MMU标志设置页面,以便越界访问引发EXC_BAD_ACCESS。因此,在访问发生时,它会捕获90%的内存访问错误,但代价是由于缓存效率低,程序运行速度要慢得多。

玩世不恭的例子,这段代码:

char *array = (char *)malloc(17);
array[31] = 9;

...无论是否使用Guard Malloc都不会引发异常。这段代码:

char *array = (char *)malloc(17);
array[32] = 9;

......通常不会引发异常。启用Guard Malloc后,它将在执行第二行时引发异常。

所以它不如Valgrind那么彻底,但只需要一秒钟就可以开启并且可能会遇到重大错误。