【问题标题】:EXC BAD ACCESS in mainEXC BAD ACCESS in main
【发布时间】:2012-07-09 11:23:08
【问题描述】:

我有一个有害的EXC_BAD_ACCESS 错误。我启用了僵尸跟踪,但程序没有生成特定的堆栈跟踪,而是始终在 main 处停止 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

有人知道为什么我没有有意义的堆栈跟踪吗?该应用程序使用核心数据,并且大部分核心数据活动都包含在 performBlockAndWait 方法中 - 这可能与它有关吗?

我还有一条来自 NSZombieEnabled 的日志消息,上面写着*** -[_PFArray release]: message sent to deallocated instance 0x395d0fe0。有什么方法可以查出日志消息中的地址最初分配的内容吗?

谢谢

【问题讨论】:

  • 每当你引用一个被释放的对象时,就会发生这种情况。由于 Objective-C 的工作方式,调试器不会停在违规的位置。您必须启用 Zombies 并在 Objective-C 异常中设置断点才能获取更多信息。

标签: objective-c ios


【解决方案1】:

是的,有。使用模拟器上的仪器运行您的应用程序。选择 Zombies 工具并执行使您的应用程序崩溃的确切步骤。 Zombies 乐器仅在模拟器上可用,因为 Mac 上的 RAM 比 iOS 设备上的多。

【讨论】:

  • George - 感谢您的提示 - 它运行良好,至少现在我知道该错误发生在核心数据的深处。有问题的对象在newFetchedRowsForFetchPlan_MT 中被分配,然后被[NSSQLCore objectsForFetchRequest][NSManagedObjectContext executeFetchRequest:error] 自动释放两次。是时候让我进一步挖掘了 - 再次感谢
  • 很高兴为您提供帮助。它还可能有助于将崩溃代码封装在 try-catch 块中并打印出异常。它还可以防止它崩溃,这总是一件好事。
【解决方案2】:

您可以查看this 教程,了解崩溃并弄清楚该怎么做。密切关注这部分:

当程序被捕捉到做某事时会发生异常 不应该这样做。你现在看到的是后果 这个异常:app做错了,异常一直 抛出,Xcode 会显示结果。理想情况下,您希望看到 正是抛出该异常的位置。幸运的是,你可以告诉 Xcode 使用异常暂停程序在那一刻 断点。断点是暂停程序的调试工具 在特定的时刻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多