ios - 当 iOS 应用程序崩溃时,有没有办法采取行动,从而执行代码?这可能吗?
问题描述
当 iOS 应用程序崩溃时,有没有办法采取行动,从而执行代码?具体来说,我想保存核心数据存储。这可能吗?我会说这是可能的,例如,Firebase 必须在线发送信息以使 crashlytics 工作。如何做到这一点?谢谢
解决方案
是的,但这非常困难,而且“保存核心数据存储”会太多(而且非常危险,无法启动)。
大多数崩溃是由信号引起的(通常是 SIGSEGV,但也有 SIGABRT、SIGILL 或其他),在这种情况下,您可以安装信号处理程序来运行代码。但是,该代码必须非常非常仔细地编写,因为您将处于特殊的执行状态。您可以使用少量的 C 函数(请参阅手册页以sigaction
获取列表)。最值得注意的是,您无法分配内存。在信号捕获函数中分配内存可能会使程序死锁在一个紧密的自旋锁中(当我在更天真的日子里尝试编写自己的崩溃处理程序时,我自己就这样做了;这真的很糟糕)。
像 Crashlytics 这样的崩溃处理程序这样做的方式是,它们在信号处理程序期间尽可能少地执行,主要是将堆栈跟踪写入存储(使用预分配的缓冲区)。当您重新启动时,他们会看到之前运行的未处理堆栈跟踪,然后他们会执行所有复杂的操作,例如将其上传到服务器,或显示 UI 或其他。
但即使您可以在信号处理程序的中间写入 Core Data,您也永远不会想要这样做。在信号处理期间,系统处于未定义状态。各种不变量目前可能不成立(例如对象图是否一致)。您以这种方式崩溃的事实表明发生了非法事件。在这种状态下,您应该做的最后一件事是获取高度不可信的数据并覆盖磁盘上的好数据。
推荐阅读
- java - Java中Heridity的正确用法和私有属性问题?
- javascript - c3图表:数据来自url时出错
- arrays - 从 Json Angular 5 推入数组
- python - 如何计算条目之间的时间差?
- swift - 如何在 swift 中为服务器登录创建正确的完成处理程序?
- php - 如何停止在 PHP 中的 Excel 文件中插入空白行?
- android - 使用 TravisCI 构建 expo Android 应用程序
- html - 点击时离子输入复制和转换?
- java - 在 Java 中寻找最短路径 - Dijkstra 算法
- microsoft-ajax-minifier - 从哪里获得 ajaxmin.exe?