没有堆栈时如何调试iOS断言失败崩溃

Posted

技术标签:

【中文标题】没有堆栈时如何调试iOS断言失败崩溃【英文标题】:How to debug iOS assert failure crash when it leaves no stack 【发布时间】:2013-04-11 20:45:24 【问题描述】:

我正在尝试调试似乎是 ios 上的断言失败。有问题的设备似乎没有产生崩溃日志。相反,在控制台中,我看到了:

Apr 11 16:22:56 iPhone5 SpringBoard[69] <Warning>: Killing com.yourapp for termination assertion
Apr 11 16:22:56 iPhone5 com.apple.launchd[1] (UIKitApplication:com.appspot.scruffapp[0xa993][19484]) <Notice>: (UIKitApplication:com.yourapp[0xa993]) Exited: Killed: 9

有没有办法将这些非常有限的信息与实际的源文件+行号联系起来?另外,为什么设备不会创建任何崩溃日志,这显然更容易符号化和诊断?

谢谢, 埃里克

【问题讨论】:

这是一个可以随意重现的崩溃吗?您是否尝试过在objc_exception_throw 上使用断点进行调试? 不幸的是,我似乎无法随意重现此崩溃;我的同事打了它,我把他的手机连接到我的机器上,这就是我能得到的。我没有成功地在调试器中重新处理崩溃。 【参考方案1】:

您是否尝试过使用:

@try 
    //code here

@catch (NSError *error) 
    NSLog(@"%@", error);

【讨论】:

这是个好主意;不幸的是,我不知道将这段代码放在哪里,因为 iOS 无法在控制台或单独的日志文件中提供堆栈。 使用断点单步执行它以找到崩溃的位置。还是没有建设? 不幸的是,我无法按需重现此崩溃,并且无法在调试器中看到它发生。我希望我可以(以某种方式)用控制台的输出来表示。 抱歉,我误会了。我没有使用过这种方法,但考虑到它的投票数量,人们似乎发现这个答案对于象征 iPhone 崩溃报告非常有用:***.com/a/4954949/1710611 - 希望这会有所帮助。 是的,我自己也成功地使用了这种方法。不幸的是,无论出于何种原因,我都没有可以表示的崩溃文件,只有来自设备控制台的这些神秘行(可通过管理器查看)。

以上是关于没有堆栈时如何调试iOS断言失败崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有有用的调用堆栈的情况下调试难以重现的崩溃?

调试断言失败,向量下标超出范围

UICollectionView 上的断言失败

调试断言失败

调试断言失败错误

使用 Opencv 时 C++ 调试断言失败