首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSZombies已启用,调试信息

NSZombies已启用,调试信息
EN

Stack Overflow用户
提问于 2012-02-07 05:51:24
回答 2查看 364关注 0票数 0

我的苹果应用程序在run循环中使用exc_bad_access崩溃了。所以我启用了NSZombies,现在我看不到像预期那样的错误(因为对象没有被释放)。

但是,我在控制台中找不到任何有用的NSZombie日志。有没有办法找出问题所在?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-07 06:25:16

这很有挑战性。Cocoa中这个错误的最常见原因是直接访问您的ivars,而不是使用访问器。访问器使得绝大多数内存崩溃都消失了。

也就是说,它们并不是内存错误的唯一原因。您可以通过其他方式访问内存。NSZombie做了一件特别的事情:当您释放一个对象时,NSZombie会说“不要实际释放这个对象”。相反,它会将对象转换为僵尸对象,如果您向其发送消息,则会打印错误。但这只有在崩溃是由于向释放的实例发送消息时才有帮助。它可能是很多其他的东西。

您应该首先从崩溃堆栈本身开始。查看堆栈,看看它可能是什么类型的对象,或者是谁在调用它。

请阅读TN2124,特别是关于BSD内存分配器的部分,以及内存使用性能指南的Enabling the Malloc Debugging Features部分。您可以使用比NSZombie更低级的工具。MallocScribble通常是最有用的。它用0x55覆盖释放的内存,这样你就更有可能更快崩溃,并且更容易在调试器中检测释放的内存。MallocPreScribble对于查找未初始化的内存很有用,但只有在执行原始的malloc调用时,这才真正有帮助。ObjC对象总是预初始化的。

当然你还得戴上你的侦探帽子。您的程序中最可疑的部分是什么?你是否在做多线程工作(如果你没有正确地锁定,这可能会导致内存崩溃)。

如果它很容易重现,那么你会弄清楚的。如果只是偶尔发生,那么.我有时会像这样追捕虫子好几个月。有时候真的很难。

票数 3
EN

Stack Overflow用户

发布于 2012-02-07 06:25:58

为此,您需要使用内存分析器。只需使用配置文件选项构建并选择Leaks即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9167810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档