使用PLCrashReporter,您可以在崩溃前收到事件吗?

tjg*_*184 2 iphone crash objective-c

一旦PLCrashReporter检测到错误(异常,信号等)但在应用程序终止之前,我们希望执行其他处理(即记录当前状态).有没有人知道使用PLCrashReporter是否可行?

lan*_*onf 7

扩展安德烈亚斯的答案 -

我已经在trunk中实现了开发支持 - [PLCrashReporter setCrashCallbacks:],它允许在程序退出之前执行崩溃后的函数.

由于难以实现可在崩溃进程的上下文中执行的异步安全代码,因此最初未包含此内容 - 这样做很困难,我认为没有人会想要这样做.

引用我为PLCrashReporter主干中的功能编写的文档(我还没有发布渲染副本,因为该功能尚未发布):

异步安全编程指南

在将崩溃报告写入磁盘后,合理的CrashReporter支持在崩溃报告器的信号处理程序的上下文中执行应用程序指定的功能.这是一个定期请求的功能,并提供在发生崩溃时实现应用程序完成的功能.但是,编写用于在信号处理程序内执行的代码非常困难,因此不建议这样做.

程序流程和信号处理程序

当调用信号处理程序时,程序的正常流程被中断,并且您的程序处于未知状态.可能会保持锁定,堆可能已损坏(或正在更新),并且您的信号处理程序可能会调用在信号发生时正在执行的函数.这可能会导致死锁,数据损坏和程序终止.

异步安全功能

函数的子集被OS定义为异步安全,并且可以从信号处理程序中安全地调用.如果您实现了自定义的崩溃后处理程序,则它必须是异步安全的.可以从CERT编程指南 - SIG30-C获得POSIX定义的异步安全功能和附加信息的表格.

最值得注意的是,Objective-C运行时本身不是异步安全的,并且Objective-C可能不在信号处理程序中使用.