2

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

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

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

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

你如何调试这样的东西?

4

3 回答 3

3

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

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

于 2009-11-08T12:49:45.910 回答
3

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

http://valgrind.org/

以及如何在模拟器下使用:

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

您可能需要根据安装位置更改代码示例中的 VALGRIND 路径。

于 2009-11-09T02:47:37.203 回答
0

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

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

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

于 2009-11-08T11:57:31.383 回答