我正在使用运行在PLCrashReporter之上的QuincyKit来发现我的iOS应用程序中的生产崩溃,并获取日志。有时,如果我有一些来自崩溃点以上几个调用堆栈级别的变量,这将极大地帮助我进行调试。例如,如果记录处理代码是多级嵌套深度,那么它崩溃在哪个记录ID上。
问题是-有没有一种方法可以提供某种上下文字符串,在生成时作为描述插入到崩溃日志中?我会在进入调用堆栈时将其设置为记录,在退出时将其清除。如果它是非持久性的(即在内存中)就更好了--我担心一直写到非易失性存储器会消耗电池。
发布于 2012-07-21 22:42:25
找到了一个有限的解决方法。我使用一个名称来自包ID的shared memory block来存储上下文字符串。在适当的关机时,将清除该块。然后,我在Quincy委托中重写-crashReportDescription,以便它提供共享内存内容(如果有的话)作为描述。只有当上一次应用程序关闭是崩溃时,它才是非空的。
这种方法显然存在缺陷。比方说,如果他们在崩溃和下一次应用启动之间重启设备,那么共享内存信息就会丢失。
编辑:在设计的第一个版本中,我使用了一个私有的、名为UIPasteboard的内存,而不是共享内存。事实证明,这对性能造成了相当大的影响。共享内存的速度要快几个数量级。
EDIT2:但是后来他们破坏了iOS 7的共享内存,所以UIPasteboard又回来了。真扫兴。
EDIT3:我发现了另一种方法,不太优雅,但它在iOS 7中有效。我将上下文字符串存储在一个普通的静态内存块中。我使用[[PLCrashReporter sharedReporter] setCrashCallbacks:]在PLCrashReporter中放置了一个自定义的崩溃处理程序。在处理程序中,我将所述上下文(如果有的话)写到一个文件中。在应用程序启动时,我读取了上述文件,并在-crashReportDescription中提供了内容(如果有)。滚开,UIPasteboard。
发布于 2012-07-21 13:48:19
不,但是feature was proposed over 2 years ago还有一个补丁。
实际上,我更喜欢允许记录环形缓冲区内容的版本(您可以有效地将消息记录到其中!),这看起来可能更有用。
https://stackoverflow.com/questions/11588474
复制相似问题