我的苹果应用程序在run循环中使用exc_bad_access崩溃了。所以我启用了NSZombies,现在我看不到像预期那样的错误(因为对象没有被释放)。
但是,我在控制台中找不到任何有用的NSZombie日志。有没有办法找出问题所在?
发布于 2012-02-07 06:25:16
这很有挑战性。Cocoa中这个错误的最常见原因是直接访问您的ivars,而不是使用访问器。访问器使得绝大多数内存崩溃都消失了。
也就是说,它们并不是内存错误的唯一原因。您可以通过其他方式访问内存。NSZombie做了一件特别的事情:当您释放一个对象时,NSZombie会说“不要实际释放这个对象”。相反,它会将对象转换为僵尸对象,如果您向其发送消息,则会打印错误。但这只有在崩溃是由于向释放的实例发送消息时才有帮助。它可能是很多其他的东西。
您应该首先从崩溃堆栈本身开始。查看堆栈,看看它可能是什么类型的对象,或者是谁在调用它。
请阅读TN2124,特别是关于BSD内存分配器的部分,以及内存使用性能指南的Enabling the Malloc Debugging Features部分。您可以使用比NSZombie更低级的工具。MallocScribble通常是最有用的。它用0x55覆盖释放的内存,这样你就更有可能更快崩溃,并且更容易在调试器中检测释放的内存。MallocPreScribble对于查找未初始化的内存很有用,但只有在执行原始的malloc调用时,这才真正有帮助。ObjC对象总是预初始化的。
当然你还得戴上你的侦探帽子。您的程序中最可疑的部分是什么?你是否在做多线程工作(如果你没有正确地锁定,这可能会导致内存崩溃)。
如果它很容易重现,那么你会弄清楚的。如果只是偶尔发生,那么.我有时会像这样追捕虫子好几个月。有时候真的很难。
发布于 2012-02-07 06:25:58
为此,您需要使用内存分析器。只需使用配置文件选项构建并选择Leaks即可。
https://stackoverflow.com/questions/9167810
复制相似问题