繁体   English   中英

禁用僵尸会导致EXC_BAD_ACCESS

[英]Disabling Zombies causes EXC_BAD_ACCESS

我通过以下堆栈跟踪在应用程序中崩溃:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x39dfa66a objc_release + 9
1  libobjc.A.dylib                0x39dfb0d7 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 358
2  CoreFoundation                 0x2f4a6c69 _CFAutoreleasePoolPop + 16
3  CoreFoundation                 0x2f53c1cb __CFRunLoopRun + 1306
4  CoreFoundation                 0x2f4a6f0f CFRunLoopRunSpecific + 522
5  CoreFoundation                 0x2f4a6cf3 CFRunLoopRunInMode + 106
6  GraphicsServices               0x343ff663 GSEventRunModal + 138
7  UIKit                          0x31df216d UIApplicationMain + 1136
8  Batted                         0x0009db07 main (main.m:16)

如果未在Scheme的诊断选项中启用僵尸,则会发生崩溃。 但是,当我启用它时,崩溃不会发生。

我已经阅读了有关此问题的其他一些问答,它们似乎都建议一旦出现此行为,请启用僵尸并在模拟器上运行Zombie Profile Instruments。

我曾尝试过,但Instruments似乎并未指出任何错误,因此该应用程序可以运行。 是否有其他线索可以解决此问题? 我在模拟器中将XCode 5.1与iOS 7.1一起使用。

更新1

找到了引起问题的令人反感的代码,但我仍然不确定为什么导致问题。 我正在使用CoreData,并且在NSManagedObject的子类中,我有-

- (void)willTurnIntoFault;
{
    [super willTurnIntoFault];

    if ([self observationInfo])
    {
        BNLogInfo(@"%@ has observers:\n%@", [self objectID], [self observationInfo]);
    }
}

在上面的代码中, [self observationInfo]是令人讨厌的行。

当应用程序启动时,我在枚举块中循环了一些NSManagedObjects并在其上设置了一些属性,从而触发了willTurnIntoFault方法。 一旦枚举块完成,就会发生崩溃。

神秘的是,崩溃不会在此方法内发生,但是如果没有此方法的子类化,一切都将正常运行。

问与答表示启用僵尸(或在僵尸工具下运行),因为僵尸通常会导致此类错误。

但这不是唯一的原因。

您的程序破坏了堆。 最有可能是它覆盖了自动释放池中某些对象中的isa指针(类指针),因此当运行循环耗尽自动释放池时, objc_release尝试取消引用伪造的isa指针并崩溃。

启用僵尸可以掩盖这样的错误,因为使用僵尸,运行时实际上不会释放对象。 这意味着您最终会得到堆中很多不被使用的部分(除非您尝试向僵尸发送消息),因此如果破坏了它们,它们永远不会造成麻烦。

这类崩溃可能很难调试,但是有一个称为“ guard malloc”的工具有时会有所帮助。 在菜单栏中,选择“产品>方案>编辑方案”。 单击左侧列表中的运行操作。 然后单击“诊断”选项卡。 打开“启用Guard Malloc”选项。 然后尝试重现崩溃。 Guard malloc将立即检测某些类型的堆损坏,并根据损坏的指令停止程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM