【问题标题】:QuincyKit/PLCrashReporter: provide description *before* the crashQuincyKit/PLCrashReporter:在崩溃之前提供描述
【发布时间】:2012-07-21 00:21:50
【问题描述】:
我正在使用在 PLCrashReporter 之上运行的 QuincyKit 来发现我的 iOS 应用程序中的生产崩溃并获取日志。有时,如果我在崩溃点以上的几个调用堆栈级别中有一些变量,它将极大地帮助我调试。比如,如果记录处理代码嵌套了很多层,那么它在哪个记录 ID 上崩溃了。
问题是 - 有没有办法提供某种上下文字符串作为生成时的描述插入到崩溃日志中?我会在进入记录的调用堆栈时设置它,我会在退出时清除它。如果它是非持久性的(即在内存中)会更好——我担心一直写入非易失性存储会对电池造成负担。
【问题讨论】:
标签:
ios
crash
plcrashreporter
【解决方案2】:
找到了一个有限的解决方法。我使用shared memory block 的名称派生自捆绑ID 来存储上下文字符串。该块在正确关机时被清除。然后我在 Quincy 委托中覆盖 -crashReportDescription,以便它提供共享内存内容(如果有)作为描述。仅当最后一次关闭应用程序崩溃时才为非空。
这种方法显然存在缺陷。例如,如果他们在崩溃和下一次应用启动之间重新启动设备,共享内存信息就会丢失。
编辑:在设计的第一个版本中,我使用了一个名为 UIPasteboard 的私有内存,而不是共享内存。事实证明,这对性能造成了很大的影响。共享内存的速度要快几个数量级。
EDIT2:但后来他们在 iOS 7 中破坏了共享内存,所以 UIPasteboard 又回来了。无赖。
EDIT3:找到了另一种方法,不太优雅,但它适用于 iOS 7。我将上下文字符串存储在一个普通的静态内存块中。我使用[[PLCrashReporter sharedReporter] setCrashCallbacks:] 在PLCrashReporter 中放置了一个自定义崩溃处理程序。在处理程序中,我将所述上下文(如果有)写入文件。在应用程序启动时,我阅读了该文件,并在-crashReportDescription 中提供了内容(如果有)。走开,UIPasteboard。