Xcode不会跨越崩溃

时间:2014-03-07 02:35:19

标签: ios objective-c xcode debugging xcode5

因此,在许多不同的项目中已经发生过很多次。当Xcode出现错误时,我将在Xcode中调试我的应用程序。看了之后,我点击了Step Over或Continue ......它什么也没做。更确切地说,它的行为就像它踩到了,但实际上并没有去任何地方。据我所知,这可以无限期重复。这有问题的一个原因是它永远不会给我崩溃日志,因为它永远不会崩溃。我只在应用程序崩溃并且没有被调试时获得崩溃日志(这意味着我必须通过Crittercism或检查设备日志)。

之前有人看过这个,并且/或者知道为什么会这样做?我在其他地方没有看到任何提及,但在几个项目中发生了这件事。

例如,在一个项目中,我们使用SocketRocket,并且每隔一段时间(由于尚未知的原因)它在SRWebSocket.m中以下列方法崩溃:

- (void)main;
{
    @autoreleasepool {
        _runLoop = [NSRunLoop currentRunLoop];
        dispatch_group_leave(_waitGroup);

        NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate distantFuture] interval:0.0 target:nil selector:nil userInfo:nil repeats:NO];
        [_runLoop addTimer:timer forMode:NSDefaultRunLoopMode];

        int i = 0;

        while ([_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) {
            NSLog(@"_runLoop %i %@", i++, [NSDate date]);
        }
        assert(NO);
    }
}

它在while行崩溃了。 (顺便说一句,我添加了NSLog系列)。当我点击“继续”或“跳过”时,线条指示灯会短暂闪烁,然后再次出现在同一条线上。请注意,它不会继续到NSLog行,也没有任何内容写入控制台。我目前仍然试图让它再次崩溃(这种特殊的崩溃是相当不可预测的),但如果我没记错的话,行指示符显示EXC_BAD_ACCESS,可能是一个过早释放的对象。

3 个答案:

答案 0 :(得分:3)

你错过了Step Over的观点。当你跨过一条线时,你说要执行当前行并转到下一个可见行,而不管当前行是否调用另一个过程。

如果代码在任何时候崩溃,您将无法继续执行代码行。

答案 1 :(得分:1)

ObjC超出范围错误将导致抛出一个ObjC异常,如果未被捕获则会在中止。中止实际上只会引发BSD信号(SIGKILL)。调试器很容易传递给进程,因此它可以自然地从它中死亡。

EXC_BAD_ACCESS和EXC_BAD_INSTRUCTION是有趣的例外,因为它们首先进入OS的Mach端。为了正确传播,它们应该作为Mach异常本地处理,如果有一个处理程序,如果没有,它们应该传递给某个系统处理程序,将它们转换为等效的BSD异常(SIGSEGV),然后将其传递给BSD信号处理程序,最终会导致程序退出。

在调试器提供的内核接口中存在长期存在的错误,使得调试器无法从外部正确地实现这种小舞蹈。所以,如果你得到一个EXC_BAD_ACCESS,你就会陷入困境。在大多数情况下,这并不重要,你的程序无论如何都会转过身去。通过观察它,你不会真正了解你的崩溃。

只有安装了SIGSEGV处理程序并希望调试它才有意义。 MacOS X已经十年或更长时间了。幸运的是,实际上只有极少数人需要这样做......

答案 2 :(得分:0)

添加到之前的答案;在调试和EXC_BAD_ACCESS时,它有时可以帮助启用Zombie Objects"在你的计划中。如果您正在访问已解除分配的对象,僵尸对象将告诉您哪个对象不应该尝试进行呼叫以及您尝试呼叫的方法。