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

使用定制的崩溃报告系统(例如专门用于在iPhone上崩溃之后让用户发送崩溃日志的系统 )发送日志,应用程序需要重新启动。 为什么? 在自定义exception处理期间是否有可能发送它? 还是有一个崩溃报告系统,不需要重新启动应用程序?

发生崩溃时,应用程序处于非常不稳定的状态。 所以崩溃报告库不能做任何事情,因为即使在崩溃时分配内存也可能造成更多的损害。 因此,崩溃报告SDK只能使用所谓的asynchronous安全 C方法来收集所有崩溃数据。 任何Objective-C代码都不能被处理,也不能使用iOSnetworking栈。

另请注意,exception只是Objective-C中应用程序崩溃的一个例子,还有一些由低级BSD信号触发的崩溃。 这两种types意味着应用程序处于非常不安全和不稳定的状态,应尽可能less地在应用程序崩溃时调用代码。

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

另外,在iOS上,不可能创build另一个可以在后台发送数据的进程,所以唯一安全可行的解决scheme是在下次应用程序启动时发送数据。

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

由于你的应用程序崩溃,没有进程再运行你的应用程序控制,因此你不能开始一个新的进程发送报告。 崩溃处理程序中的任何代码都只有有限的时间来保存在iOS杀死整个应用程序之前将应用程序崩溃的内容,并将其从内存中删除。

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