Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用PLCrashReporter,您可以在崩溃之前接收事件吗?_Iphone_Objective C_Crash - Fatal编程技术网

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

Iphone 使用PLCrashReporter,您可以在崩溃之前接收事件吗?,iphone,objective-c,crash,Iphone,Objective C,Crash,一旦PLCrashReporter检测到错误(异常、信号等),但在应用程序终止之前,我们希望进行额外处理(即记录当前状态)。有人知道使用PLCrashReporter是否可以做到这一点吗 不,这是不可能的。您必须自己进行日志记录并将其存储在文件系统中。在下一次启动时,您可以将其与崩溃报告一起发送到服务器。例如,使用QuincyKit,它使用PLCrashReporter,然后使用您自己的服务器或HockeyApp.net 注:我是QuincyKit的开发者,也是HockeyApp的联合开发者。进

一旦PLCrashReporter检测到错误(异常、信号等),但在应用程序终止之前,我们希望进行额外处理(即记录当前状态)。有人知道使用PLCrashReporter是否可以做到这一点吗

不,这是不可能的。您必须自己进行日志记录并将其存储在文件系统中。在下一次启动时,您可以将其与崩溃报告一起发送到服务器。例如,使用QuincyKit,它使用PLCrashReporter,然后使用您自己的服务器或HockeyApp.net


注:我是QuincyKit的开发者,也是HockeyApp的联合开发者。

进一步阐述Andreas的答案--

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

由于很难实现异步安全代码(可以在崩溃进程的上下文中执行),所以最初没有包括这一点——这很难做到,我认为没有人愿意这么做

引用我在PLCrashReporter trunk中为该功能编写的文档(由于该功能尚未发布,我还没有发布呈现副本):

异步安全编程指南 似是而非的CrashReporter支持在将崩溃报告写入磁盘后,在崩溃报告程序的信号处理程序的上下文中执行应用程序指定的函数。这是一项定期请求的功能,提供了在崩溃时实现应用程序终结的能力。但是,编写用于在信号处理程序内部执行的代码非常困难,因此不建议这样做

程序流和信号处理程序 当调用信号处理程序时,程序的正常流被中断,并且您的程序是未知的 国家。锁可能被持有,堆可能已损坏(或正在更新),并且您的信号 处理程序可以调用信号发出时正在执行的函数。这可能会导致死锁, 数据损坏和程序终止

异步安全函数 操作系统将函数子集定义为异步安全的,并且可以从信号处理程序中安全地调用。如果 您确实实现了自定义的崩溃后处理程序,它必须是异步安全的。POSIX定义的异步安全函数表 更多信息请参见CERT编程指南-

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

感谢您的回复!据我所知,QuincyKit和HockeyApp都很棒。没有实现这一点有什么原因吗?我们只想记录一些状态。如果我理解正确,只要我们使用异步安全函数实现,我们就可以了?感谢您提供这些信息。这是正确的,但是访问该状态也必须是异步安全的——这就排除了ObjC的使用,并且需要注意如何使该状态可供崩溃处理程序使用。如果不是完全异步安全的,您可能会崩溃(再次)或死锁。如果出现死锁,您的进程将一直挂起,直到OS看门狗(在iOS上)将其杀死,或者用户强制退出应用程序。我认为Mike Ash在他周五的问答帖子中说得最好:“你能安全地做的事情很少。我甚至不打算讨论如何完成任何事情,因为这样做是不切实际的,相反,我会简单地告诉你避免使用信号处理程序,除非你真的知道自己在做什么并且你喜欢痛苦。”——谢谢你的评论。再次感谢。