iPhone OS内存问题 - 如何调试?

时间:2009-11-08 11:47:38

标签: iphone objective-c memory corruption

我的iPhone应用程序中有一个非常奇怪的问题,我认为这与内存损坏有关:

有一次,我需要对数组进行排序,我使用-[sortArrayUsingFunction]进行排序。

结果不正确,除非我在方法调用之前为void *test = malloc(2 * sizeof( int ))分配一些内存,或者在排序函数中调用NSLog()(从不调用)。

换句话说:只有在稍微增加调用排序函数之前使用的内存时,排序才有效。我认为这是因为在某些时候,内存会被破坏。

你如何调试这样的东西?

3 个答案:

答案 0 :(得分:3)

听起来你的一些代码正在使用已发布的对象。 Apple的优秀Mac OS X Debugging Magic技术说明中提供了很多帮助调试此类错误的帮助,尤其是foundation部分。

对于您的情况,我将禁用自动释放池(设置环境变量NSEnableAutoreleasePool=NO)或使用僵尸功能(NSZombieEnabled=YES)来查找向已发布对象发送消息的位置。

答案 1 :(得分:3)

尝试在Valgrind下的模拟器中运行程序:

http://valgrind.org/

如何在模拟器下使用它:

http://landonf.bikemonkey.org/code/iphone/iPhone_Simulator_Valgrind.20081224.html

您可能必须在代码示例中更改VALGRIND路径,具体取决于安装位置。

答案 2 :(得分:0)

这样的事情可能是调试的挑战。有一些工具用于检测越界访问等在其他平台上,所以我认为iPhone会有一些东西,但我不知道。

也许您应该存储两个数组副本,并将它们与差异进行比较。打印出差异。引入其中一个数组的“垃圾”的性质可能会暗示它来自何处。

此外,只需浏览在此之前运行的代码,然后重新阅读它(或者更好的是,让其他人阅读它)。你可能发现了一个错误。