iOS没有错误或堆栈跟踪崩溃

时间:2011-01-26 21:34:31

标签: ios xcode debugging crash xcode-instruments

很难跟踪iPad应用程序中的崩溃。这个困难的真正原因是当应用程序失败时没有错误或堆栈跟踪。它就像Keiser Soze一样消失,“就像那样,噗。他走了。”

我在模拟器和设备上都复制了崩溃。设备日志为零,控制台中没有任何内容,等等。

我知道在崩溃期间,一些CoreGraphics操作正在后台线程中发生。通常,三个左右的NSOperations正在踢一些图像混合物。

混合包含CGContext *调用(DrawImage,SetBlendMode,SetAlpha等)。 NSOperation回调主线程中的委托来处理图像并将其设置为UIImage,因此它不应该是UI主线程冲突,但此时我不打算任何折扣。

我是否缺少一些Xcode技巧来追踪究竟发生了什么?或者至少可以更好地了解问题所在?

编辑我已经在仪器中运行应用程序跟踪内存使用情况,并且看到它稳定在2MB左右。所以,不要认为这是一个记忆问题。但经过考虑,这块岩石稳定2MB似乎异常低落。是否有可能仪器没有获得CoreGraphics分配?

6 个答案:

答案 0 :(得分:24)

尝试阅读寄存器。

每当我的应用程序崩溃而没有错误时,在大多数情况下我都会在寄存器中找到异常。

首先转到“例外”标签,然后“添加例外断点”'使用左下角的+。 enter image description here

然后当应用程序崩溃时点击" 0 objc_exception_throw"在线程1下 enter image description here

最后在控制台中输入:

  • 注册阅读 (你应该得到一份寄存器清单)
  • po $ rax(通常情况下,例外情况是' rax')

    (您应该在控制台上看到异常输出)

希望这有帮助。

答案 1 :(得分:9)

由于缺乏更好的解决方案,如果不是很明显,请将您的应用程序与NSLogs一起调整,以便在发生这种情况时进行循环,然后通过断点和/或其他日志从那里深入钻取。

答案 2 :(得分:2)

超级迟到的答案,但我发现使用try / catch有助于在我无法获得堆栈跟踪时提供信息,而我的应用程序会提取Keiser Soze。

@try
{
  // suspected code causing crash/errors
}
@catch (NSException *exception)
{
  NSLog(@"Exception: %@", exception);
}

答案 3 :(得分:1)

在我的情况下,这是因为我有" Zombie Objects"在该方案中启用以帮助找到问题,最终导致内存耗尽并崩溃。

答案 4 :(得分:1)

在我的情况下,这是因为故事板中的插座连接不良。 如果要加载的viewDidLoad UIViewController方法被调用,请使用断点检查。如果没有,请检查故事板中的插座连接。

错误的连接会在没有任何错误或堆栈跟踪的情况下崩溃应用程序。

我想知道曾经在旧版XCode中显示的this class is not key value coding-compliant for the key错误发生了什么。

答案 5 :(得分:0)

在我的情况下,这是由于一个物体被释放。通常它会将消息发送到解除分配的实例或类似的东西,但它没有。我检查了iPhone的日志,发现了这个:KERN_INVALID_ADDRESS,我用Google搜索并发现了这个:KERN_INVALID_ADDRESS

启用僵尸对象并发现我尝试使用已释放的实例。它还告诉我之后日志中的对象是什么。

希望它对未来的访客有所帮助。