我的Mac应用在运行循环中因exc_bad_access崩溃。
因此,我启用了NSZombies,现在我没有看到预期的错误(因为未取消分配对象)。
但是,我在控制台中找不到任何有用的NSZombie Log。
有没有办法确定问题?
最佳答案
很有挑战性。可可中此错误的最常见原因是直接访问您的ivars,而不是使用访问器。访问器使绝大多数内存崩溃消失了。
也就是说,它们不是内存错误的唯一原因。您可能以其他方式访问内存。 NSZombie
做一件事:当您取消分配对象时,NSZombie
表示“实际上不取消分配对象”。相反,它将对象变成僵尸对象,如果您向其发送消息,则会显示错误。但这仅在崩溃是由于向已分配的实例发送消息而导致崩溃时才有用。可能还有很多其他事情。
您应该首先从崩溃堆栈本身开始。查找堆栈,看看它可能是什么样的对象,或者是谁在调用它。
阅读TN2124,尤其是BSD内存分配器上的部分,以及《内存使用性能指南》中的Enabling the Malloc Debugging Features部分。您可以使用比NSZombie
更低级别的工具。 MallocScribble
通常是最有用的。它用0x55覆盖释放的内存,这样您更有可能更快崩溃,并且更容易在调试器中检测释放的内存。 MallocPreScribble
对于查找未初始化的内存很有用,但这仅在您执行原始malloc
调用时才真正有用。 ObjC对象始终是预先初始化的。
当然,您必须戴上侦探帽。您程序的哪些部分最可疑?您是否正在执行多线程工作(如果未正确锁定,可能会导致内存崩溃)。
如果复制容易,那么您会发现它。如果只是偶尔发生,那好吧...有时候我几个月来一直在寻找类似的错误。有时候很难。