36

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

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

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

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

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

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

4

6 回答 6

28

尝试阅读寄存器。

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

首先使用左下角的 + 转到异常选项卡并“添加异常断点”。 在此处输入图像描述

然后当应用程序崩溃时,点击线程 1 下的“0 objc_exception_throw” 在此处输入图像描述

最后在控制台输入:

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

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

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

希望这可以帮助。

于 2014-05-08T12:03:24.540 回答
10

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

于 2011-01-27T11:37:07.560 回答
2

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

@try
{
  // suspected code causing crash/errors
}
@catch (NSException *exception)
{
  NSLog(@"Exception: %@", exception);
}
于 2014-05-28T02:25:49.660 回答
2

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

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

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

于 2016-01-27T19:18:11.260 回答
1

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

于 2015-09-05T00:19:11.793 回答
0

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

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

希望对以后的访客有所帮助。

于 2014-08-17T21:56:49.807 回答