我的Mac应用程序在运行循环中使用exc_bad_access崩溃。 所以我启用了NSZombies,现在我没有看到预期的错误(因为没有取消分配对象)。
但是,我在控制台中找不到任何有用的NSZombie Log。 有没有办法确定问题?
答案 0 :(得分:3)
这很有挑战性。 Cocoa中出现此错误的最常见原因是直接访问您的ivars而不是使用访问器。访问器使绝大多数内存崩溃消失。
那就是说,它们不是导致内存错误的唯一原因。您可能正以其他方式访问内存。 NSZombie
做了一件具体的事情:当你释放一个对象时,NSZombie
说“实际上没有释放对象”。相反,它会将对象变成一个僵尸对象,如果您发送消息,则会输出错误。但这只有在崩溃是由于向解除分配的实例发送消息时才有用。它可能还有很多其他的东西。
您应该首先使用崩溃堆栈本身。查看堆栈,查看它可能是什么类型的对象,或者可能正在调用它的对象。
阅读TN2124,特别是有关BSD内存分配器的部分,以及内存使用性能指南的Enabling the Malloc Debugging Features部分。您可以使用比NSZombie
更低级别的工具。 MallocScribble
通常是最有用的。它用0x55覆盖释放的内存,这样你就更有可能更快崩溃,并且更容易在调试器中检测释放的内存。 MallocPreScribble
对于查找未初始化的内存很有用,但这实际上只有在您进行原始malloc
调用时才有用。 ObjC对象始终是预先初始化的。
当然,你必须戴上你的侦探帽。你的程序的哪些部分最可疑?您正在进行多线程工作(如果您没有正确锁定,可能会导致内存崩溃)。
如果它很容易复制,那么你就会搞清楚。如果只是偶尔发生,那么......有时候我已经多次捕杀这样的bug了。有时它很难。
答案 1 :(得分:0)
您需要使用内存分析器。只需使用Profile选项构建并选择Leaks。