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

Posted

技术标签:

【中文标题】没有错误或堆栈跟踪的 iOS 崩溃【英文标题】:iOS Crash without Error or Stack Trace 【发布时间】:2011-06-16 04:02:13 【问题描述】:

很难追踪 iPad 应用程序中的崩溃。困难实际上源于应用程序失败时不存在错误或堆栈跟踪这一事实。它就像 Keizer Soze 一样消失了,“就这样,噗。他走了。”。

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

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

混合由 CGContext* 调用(DrawImage、SetBlendMode、SetAlpha 等)组成。 NSOperation 回调主线程中的一个委托来处理图像并将其设置为UIImage,因此它不应该是 UI 主线程冲突,但我现在不打折。

我是否缺少一些 Xcode 技巧来准确追踪正在发生的事情?或者至少可以更好地了解问题所在?

编辑 我在 Instruments 中运行了该应用程序,跟踪内存使用情况,发现它在 2MB 左右非常稳定。所以,不要认为这是一个内存问题。但经过考虑,这个稳定的 2MB 似乎异常低。 Instruments 是否有可能没有获得 CoreGraphics 分配?

【问题讨论】:

我从来没有做过任何 ios 开发,但是当 iOS 应用程序开始在我身上崩溃(并且没有留下任何日志)时,它最终成为内存不足的问题:关闭所有应用程序并重新启动设备清除了一切。 @Ken - 添加了与内存不足相关的编辑。谢谢。 确保您不只是在运行应用程序,而是在调试它。要进行验证,请确保断点已打开。 回复:内存不足。尝试在 applicationDidReceiveMemoryWarning 委托方法中粘贴 NSLog 或断点,以排除它。实际上,无论如何,XCode 可能会在这种情况下向控制台输出一些东西。 同样的情况,应用程序崩溃但没有崩溃日志,调试器没有停止。不知道发生了什么。根据 Instruments 的内存消耗看起来不错。 【参考方案1】:

尝试读取寄存器。

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

首先转到“异常”选项卡,然后使用左下角的 + 号“添加异常断点”。

然后当应用程序崩溃时,点击线程 1 下的“0 objc_exception_throw”

最后在控制台输入:

注册读取 (你应该得到一个寄存器列表)

po $rax(通常例外在 'rax' 中)

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

希望这会有所帮助。

【讨论】:

您说“通常异常在'rax'中”。有什么其他地方可以尝试的建议吗? @Nerrolken 您可以尝试列表中的其他寄存器,例如“rab”等 我无法获得任何堆栈跟踪,现在使用这种方法我得到了信息。添加断点完成了一切。非常感谢。【参考方案2】:

由于缺乏更好的解决方案,并且如果不是很明显,请在您的应用程序中添加 NSLogs 以圈出发生这种情况的位置,然后通过断点和/或其他日志从那里深入挖掘。

【讨论】:

【参考方案3】:

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

@try

  // suspected code causing crash/errors

@catch (NSException *exception)

  NSLog(@"Exception: %@", exception);

【讨论】:

出于某种原因,我从未见过这些东西有效。每次我尝试使用它时,应用程序都会以同样的方式崩溃。我从来没有发现任何例外。 您查看下面的@Paul-Slocum 答案了吗?此外,启用僵尸对象不会引发 Objective C 异常。好的答案在这里:***.com/a/8738527/2907798. 是的。当我启用它时,应用程序运行良好,直到内存耗尽并且它在没有消息或没有提供调试方法的情况下崩溃。 Instruments 显示我的代码没有泄漏,但它是内存密集型的。因为僵尸会保留分配的元素,所以它会使用所有内存并崩溃。【参考方案4】:

就我而言,这是因为情节提要中的插座连接不良。 如果要加载的UIViewControllerviewDidLoad 方法被调用,请使用断点检查。如果没有,请检查情节提要中的插座连接。

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

我想知道以前在旧版本 XCode 中出现的 this class is not key value coding-compliant for the key 错误发生了什么。

【讨论】:

这对我来说是一个反复出现的问题。几十个网点,一个是坏的。如果没有正确的错误消息,就像大海捞针一样。 :(【参考方案5】:

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

【讨论】:

【参考方案6】:

在我的情况下,这是由于一个对象被释放。通常它会说 message sent to deallocated instance 或类似的东西,但它没有。我检查了 iPhone 的日志,发现了这个:KERN_INVALID_ADDRESS,我用谷歌搜索了一下,发现了这个:KERN_INVALID_ADDRESS

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

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

【讨论】:

以上是关于没有错误或堆栈跟踪的 iOS 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

符号化没有崩溃日志的 iOS 崩溃堆栈跟踪

XCode:仪器有堆栈跟踪吗?

QuartzCore - iOS8 崩溃

如何阅读这个 iOS 堆栈跟踪?

如何从 obj-c / ios 中的堆栈跟踪中获取源代码行

在 iOS 中工作 NSPersistentCloudKitContainer 时获取错误堆栈跟踪