当我使用C ++进行编程时,当我发现内存损坏发生时,我的首选是启动Valgrind并查看它是否在该行的某处发生了无效写入。既然我写的代码应该在32位iPhone上运行,而我的开发环境是OSX Mavericks上的Xcode,那么Valgrind似乎不再是一个选项;甚至抛开架构不匹配,谷歌搜索揭示了很多关于Valgrind和Mavericks之间不兼容的报道,尤其是32位二进制文件。但是,我无法在Xcode Instruments中找到具有类似功能的任何内容 - 内存泄漏检测器都很好,但没有什么可以找到那些卑鄙的内存损坏
有没有人知道在开发/调试iOS应用程序时检测无效写入的好工具?
答案 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那么彻底,但只需要一秒钟就可以开启并且可能会遇到重大错误。