为什么需要重启才能在iOS上发送崩溃日志?

时间:2014-11-07 09:45:32

标签: ios crash-reports restart

使用自定义崩溃报告系统(如专门用于Ask the user to send crash log after crash on iPhone的)来发送日志,应用程序需要重新启动。为什么?是否有可能在自定义异常处理期间发送它?或者是否有崩溃报告系统不需要重新启动应用程序?

2 个答案:

答案 0 :(得分:5)

发生崩溃时,应用程序处于高度不稳定状态。因此,崩溃报告库无法执行任何操作,因为即使在崩溃时分配内存也可能导致更多损坏。因此,崩溃报告SDK只能使用so-call async-safe C方法来收集所有崩溃数据。无法处理任何Objective-C代码,也无法使用iOS网络堆栈。

请注意,异常只是Objective-C中应用程序崩溃的一个例子,也有低级别BSD信号触发的崩溃。这两种类型都意味着应用程序处于高度不安全和不稳定的状态,并且应该在崩溃时调用尽可能少的代码。

因此,这需要重写大多数网络框架才能在崩溃时发送数据,甚至可能无法以安全的方式进行。这就是为什么所有适当的崩溃报告SDK都不会做这样的事情。

此外,在iOS上,无法创建另一个可以在后台发送数据的进程,因此唯一安全可行的解决方案是在下次应用程序启动时发送数据。

现在有另一个结论,即应用程序启动早期发生的崩溃可能永远不会发送,因为应用程序在发送之前或发送时崩溃。一些SDK提供了处理该场景的机制,这很可能需要更改您的应用启动代码。

答案 1 :(得分:3)

由于您的应用程序崩溃,因此您无法再运行应用程序控制的进程,因此您无法启动新进程来发送报告。 崩溃处理程序中的任何代码只有有限的时间来保存iOS崩溃整个应用程序之前导致应用程序崩溃的内容并将其从内存中删除。

当您重新启动app时,崩溃报告器会格式化崩溃报告并将其发送。这只能在应用程序处于活动状态时关闭。