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

36

在 iPad 应用程序中,很难追踪崩溃情况。困难主要在于应用程序失败时没有错误或堆栈跟踪。就像凯撒·索泽(Keiser Soze)一样,它突然消失了,"就这样,哧啦一下,他不见了。"

我已经在模拟器和设备上都复制了崩溃情况。设备日志中没有任何记录,控制台也没有任何信息。

我知道在崩溃期间,一些 CoreGraphics 操作正在后台线程中进行。通常,三个左右的 NSOperations 会启动一些图像混合操作。

混合操作包括 CGContext* 调用 (DrawImage、SetBlendMode、SetAlpha 等)。NSOperation 回调到主线程的代理来处理图片并将其设置为 UIImage,因此这不应该是 UI 主线程冲突,但目前我不排除任何情况。

有没有一些 Xcode 技巧可以追踪到具体发生了什么?或者至少获得更好的提示以确定问题所在?

编辑 我已经在 Instruments 中运行了跟踪内存使用情况,发现内存使用量大约稳定在 2MB 左右。因此,我不认为这是内存问题。但经过考虑,这个稳定的 2MB 看起来异常地低。有没有可能 Instruments 没有捕获到 CoreGraphics 的分配情况?


1
我从未进行过任何iOS开发,但当iOS应用程序开始崩溃并且没有留下任何日志时,问题最终是低内存问题:关闭所有应用程序并重新启动设备清除了所有问题。 - Ken
@Even Mulawski:确认断点已启用(在加载委托中设置,已触发)。 - MarkPowell
2
回复:低内存。尝试在applicationDidReceiveMemoryWarning委托方法中插入NSLog或断点,以排除它。 实际上,在这种情况下,XCode可能会向控制台输出一些内容。 - Dave
2
同样的情况,应用程序崩溃,但没有崩溃日志,调试器也没有停止。不知道发生了什么事情。根据Instruments的内存消耗情况看起来很好。 - Michal
如果您释放(例如调用CFRelease)不应该释放的对象,则可能会发生这种情况。 - DARKMATTER
显示剩余3条评论
6个回答

29

尝试查看寄存器。

每当我的应用程序无错误崩溃时,我大多数情况下发现异常在寄存器中。

首先,进入“Exceptions”选项卡并在左下角使用+“Add Exception Breakpoint”。 enter image description here

然后,当应用程序崩溃时,在Thread 1下单击“0 objc_exception_throw”。 enter image description here

最后,在控制台输入:

  • register read (您将获得一个寄存器列表)

  • po $rax (通常异常在'rax'中)

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

希望这有所帮助。


你说过“通常异常在'rax'中”。还有其他建议尝试的地方吗? - Nerrolken
@Nerrolken,你可以尝试使用列表中的其他寄存器,例如“rab”等。 - shrishaster
我之前无法获取任何堆栈跟踪信息,现在使用这种方法我得到了相关信息。添加断点解决了所有问题。非常感谢。 - Cerlin

10

由于缺乏更好的解决方案,如果不明显的话,请在应用程序中加入NSLogs来确定发生问题的位置,然后通过断点和/或附加日志进一步深入研究。


2

虽然回答有些晚,但我发现使用try/catch可以在无法获取堆栈跟踪并且应用程序出现问题时提供信息。

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

1
由于某些原因,我从未看到这个东西起作用。每次我尝试使用它时,应用程序都会以相同的方式崩溃。没有任何异常被捕获。 - Duck
1
你有没有看下面@Paul-Slocum的回答?同时,启用僵尸对象不会抛出Objective C异常。这里有一个好的答案:http://stackoverflow.com/a/8738527/2907798。 - dragonflyesque
当我启用它时,应用程序运行良好,直到内存耗尽并且崩溃,没有任何消息或提供调试的方法。仪器在我的代码上显示没有泄漏,但它需要大量内存。因为僵尸保留了分配的元素,它将使用所有内存并崩溃。 - Duck

2

在我的情况下,是因为Storyboard中的插座连接不良。使用断点检查是否调用要加载的UIViewControllerviewDidLoad方法。如果没有,请检查Storyboard中的插座连接。

不正确的连接会导致应用程序崩溃,而没有任何错误或堆栈跟踪。

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


这对我来说是一个经常发生的问题。成堆的出口中有一个是坏的。如果没有适当的错误消息,就像在大海捞针一样难以找到。:( - Albert Bori

1
在我的情况下,是因为我在方案中启用了“僵尸对象”以帮助找到问题,最终导致内存耗尽并崩溃。

0
在我的情况下,这是因为一个对象被释放了。通常会提示消息发送到已释放的实例或类似的内容,但没有。我检查了iPhone的日志并发现了这个:KERN_INVALID_ADDRESS,然后我搜索了一下并找到了这个:KERN_INVALID_ADDRESS
启用了僵尸对象,并发现我试图使用一个已经被释放的实例。之后在日志中也告诉了我是哪个对象。
希望对以后的访问者有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接