很难跟踪iPad应用程序中的崩溃。这个困难的真正原因是当应用程序失败时没有错误或堆栈跟踪。它就像Keiser Soze一样消失,“就像那样,噗。他走了。”
我在模拟器和设备上都复制了崩溃。设备日志为零,控制台中没有任何内容,等等。
我知道在崩溃期间,一些CoreGraphics
操作正在后台线程中发生。通常,三个左右的NSOperations正在踢一些图像混合物。
混合包含CGContext *调用(DrawImage,SetBlendMode,SetAlpha等)。 NSOperation回调主线程中的委托来处理图像并将其设置为UIImage
,因此它不应该是UI主线程冲突,但此时我不打算任何折扣。
我是否缺少一些Xcode技巧来追踪究竟发生了什么?或者至少可以更好地了解问题所在?
编辑我已经在仪器中运行应用程序跟踪内存使用情况,并且看到它稳定在2MB左右。所以,不要认为这是一个记忆问题。但经过考虑,这块岩石稳定2MB似乎异常低落。是否有可能仪器没有获得CoreGraphics分配?
答案 0 :(得分:24)
尝试阅读寄存器。
每当我的应用程序崩溃而没有错误时,在大多数情况下我都会在寄存器中找到异常。
首先转到“例外”标签,然后“添加例外断点”'使用左下角的+。
然后当应用程序崩溃时点击" 0 objc_exception_throw"在线程1下
最后在控制台中输入:
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
启用僵尸对象并发现我尝试使用已释放的实例。它还告诉我之后日志中的对象是什么。
希望它对未来的访客有所帮助。