如何解释Xcode中Guard Malloc的“failed to VM allocate”错误?

9

有没有一个关于使用Guard Malloc进行解释和问题解决的好教程?

我收到了类似“无法分配262144字节的VM”这样的消息,但我不知道这是什么意思。最初我以为这是系统内存不足的问题,但也许并不是。如果这是一个问题,我迫切需要学习如何解释和捕捉错误。

我在Guard Malloc中还有另一个问题,它是否保护项目中C代码分配的内存(考虑到名称,应该是吧?)还是仅适用于Objective-C?我之所以问这个问题,是因为我刚刚发现NSZombieEnabled仅适用于Obj-C。

非常感谢您的帮助。我已经一直在处理可能存在的内存错误几天了,但我还没有能够为iOS编译Valgrind。


当我使用该设置运行我的程序时,会出现“无法找到dyld /usr/lib/libgmalloc.dyld”(或类似的内容)。我认为在Xcode 4下它被识别为损坏了... - trojanfoe
这是根据此处的报道:http://osdir.com/ml/xcode-users/2012-04/msg00091.html - trojanfoe
我有一个指向libgmalloc.B.dylib的/usr/lib/libgmalloc.dylib文件。 - huggie
1
只需在“Instruments”中运行它并进行充分测试。 - trojanfoe
1
Guard malloc 对我很有效,但在 iOS 设备上不行,只能在 iOS 模拟器上使用(文档也证实了这一点)。 - Unfalkster
显示剩余6条评论
3个回答

5

1) 我一直在使用guard malloc来记录分配失败,以解决地址空间耗尽的问题——每个分配都会占用至少一页无法重复使用的地址空间。未分配的内存使用在guard malloc中将导致崩溃,而不是引起分配失败。

2) 如其名称所示,guard malloc替换了malloc(3)的实现,因此使用malloc的C代码将被检查。

请注意,guard malloc并非万能的。您仍然需要通过测试来暴露应用程序的错误;guard malloc只是使崩溃更早、更可靠地发生。

您还可能希望阅读“man libgmalloc”。


2

我在使用启用了Guard Malloc的iOS模拟器时遇到了这个问题。选择64位设备作为模拟器可以避免出现错误。


这对我有用 - 我正在使用32位模拟器进行调试,在分配约2GB后崩溃。转换到64位模拟器解决了这个问题。 - John Stephen

0
"

Failed to VM allocate

" 表示可用的 RAM 不足,正如您所猜测的那样。

只有在关闭我 Mac 上的所有其他程序时,我才能可靠地使用 Guard Malloc,即使这样,对于使用大量内存的贪婪程序,它有时也会失败。

您需要:

  1. 购买更多的 RAM
  2. 关闭 Mac 上运行的所有其他程序
  3. 通过分析/优化减少程序使用的内存。

我在调试32位进程时遇到了“无法分配524304字节的VM”错误,但是活动监视器显示有1.9GB的空闲系统内存,所以我认为问题并不像缺少RAM那么简单。也许是地址空间耗尽了。 - JWWalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接