【问题标题】:Crashing on simulator, not on device在模拟器上崩溃,而不是在设备上
【发布时间】:2012-07-09 02:41:55
【问题描述】:

我的应用程序在设备上运行时崩溃(顺便说一句),崩溃不是 100% 可重现的。但它似乎只发生在设备上,而不是在模拟器中。

当我使用 NSZombies 在模拟器中运行时,我从未发现任何问题。有人可以解释一下我下面的观点吗?

  • 设备内存有限,可能因此而崩溃。
  • 什么会被认为是会导致崩溃的大内存分配?
  • 内存泄漏/大分配会导致内存损坏吗?
  • 我所有的崩溃都是 EXC_BAD_ACCESS 但就像我说的,从来没有发生在模拟器上,所以我不能运行僵尸。 (或者还有其他方法吗?)

注意,我还在模拟器上模拟了内存不足警告,看看是否会导致问题。

这让我发疯了。任何帮助将不胜感激。

【问题讨论】:

  • 有什么理由不能使用 ARC?只是为了排除内存问题。两者之间的主要区别也是区分大小写。模拟器不区分大小写,但设备是。但是“通常”,如果这是一个案例问题,您将得到 sigabrt 错误与 exc_bad_access。唯一要尝试的另一件事是在手机插入电源时在手机上运行它。这样任何错误都会输出到控制台。
  • 不能去 ARC,因为我还必须支持 iOS 3.0(是的,我知道这很糟糕)。我已经尝试通过调试将其插入,但我看不到僵尸对象,也看不到引用计数或查看除了崩溃的行之外有意义的堆栈跟踪。我知道它在哪里崩溃,但我需要知道哪些其他类释放了这个对象。
  • 使用断点。我确定你的一个对象是 nil (可能很快就会发布),这就是导致错误的原因。看这里放置一种通用断点(本帖第二条评论:stackoverflow.com/a/8072273/530933
  • 我已经考虑过欧文,但我几乎不可能像这样调试。原因是我填充了 200 多个对象并每 10 秒将它们插入到 NSDictionary 中。如果我在这个调用中设置一个断点,我会在这里坐好几天,毫不夸张。我猜字典中的一些条目会在某个时候自动发布。 PS:刚刚注意到您链接的评论实际上指向我添加异常断点,而不仅仅是任何断点。我会试试看!

标签: ios memory-management memory-leaks ios-simulator


【解决方案1】:
I know where it crashes but I need to know which other classes released this object.

为您的对象覆盖 -[release] -[autorelease] 和 -[retain](或者如果您不知道哪个对象,您可以为 NSObject 执行此操作),然后记录它们,设置断点。

如果您确定在每个点释放哪个对象,将时间戳/对象 ID/保留计数添加到日志语句中,那么您可能能够将所有数据放入电子表格,然后获取相同类型的数据Instruments 会给你的。

耻辱你必须为 3.0 构建。几乎没有人再使用 3.x,而 ARC(虽然不是解决所有问题的灵丹妙药)比非 ARC 好得多。

还有一个提示:从您的模拟器中删除该应用程序并重新安装它。我遇到了一个问题,我的项目中缺少一些捆绑资源,但模拟器在构建之间挂在它们上。如果您尝试加载项目中不再存在的 .xib,我可能会看到它崩溃...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多