一旦PLCrashReporter检测到错误(异常、信号等),我们希望执行额外的处理(即记录当前状态)。但在应用程序终止之前。有没有人知道使用PLCrashReporter是否可以做到这一点?
发布于 2011-09-06 16:24:23
不,这不可能。您必须进行自己的日志记录,并将其存储在文件系统中。在下一次启动时,您可以将它与崩溃报告一起发送到您的服务器。例如,使用QuincyKit,它使用PLCrashReporter,然后使用您自己的服务器或HockeyApp.net。
注意:我是QuincyKit的开发人员和HockeyApp的联合开发人员。
发布于 2011-09-10 02:23:34
对安德烈亚斯的答案进行扩展--
我已经在-PLCrashReporter setCrashCallbacks:的主干中实现了开发支持,它允许在程序退出之前在崩溃后执行函数。
这最初没有包括在内,因为实现可以在崩溃的进程上下文中执行的异步安全代码很困难--要做到这一点已经足够困难了,我认为没有人会想要这样做。
引用我在PLCrashReporter主干中为该功能编写的文档(我还没有发布渲染副本,因为该功能尚未发布):
异步-安全编程指南
在将崩溃报告写入磁盘之后,合理的CrashReporter支持在崩溃报告器的信号处理程序的上下文中执行应用程序指定的函数。这是一个定期请求的功能,并提供了在崩溃事件中实现应用程序终结的能力。但是,编写用于在信号处理程序中执行的代码非常困难,因此不建议这样做。
程序流和信号处理程序
当信号处理程序被调用时,程序的正常流程被中断,您的程序处于未知状态。锁可能被持有,堆可能已损坏(或正在更新过程中),信号处理程序可能会调用信号发生时正在执行的函数。这可能会导致死锁、数据损坏和程序终止。
异步安全函数
函数的子集被OS定义为异步安全的,并且可以从信号处理程序中安全地调用。如果您确实实现了自定义的崩溃后处理程序,则它必须是异步安全的。可从CERT编程指南- SIG30-C获得POSIX定义的异步安全函数和附加信息的表。
最值得注意的是,Objective-C运行时本身并不是异步安全的,并且Objective-C不能在信号处理程序中使用。
https://stackoverflow.com/questions/7312905
复制相似问题