PLCrashReporter信号回调中可以使用Core Foundation吗?

Can Core Foundation be used in PLCrashReporter signal callback?

我在我的 iOS 项目中使用 PLCrashReporter,我很好奇,是否可以在我的自定义崩溃回调中使用 Core Foundation 代码。满足我需求的东西是 CFPreferences.Here 是我创建的代码的一部分:

void LMCrashCallback(siginfo_t* info, ucontext_t* uap, void* context) {
  CFStringRef networkStatusOnCrash;
  networkStatusOnCrash = (CFStringRef)CFPreferencesCopyAppValue(networkStatusKey, kCFPreferencesCurrentApplication);
  CFStringRef additionalInfo = CFStringCreateWithFormat(
              NULL, NULL, CFSTR( "Additional Crash Properties:[Internet: %@]", networkStatusOnCrash);
  CFPreferencesSetAppValue(additionalInfoKey, additionalInfo,
                           kCFPreferencesCurrentApplication);
  CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
}

我的目标是收集一些系统信息,及时应用程序崩溃,例如互联网连接类型。

我知道由于异步安全功能,创建自己的崩溃回调不是个好主意,但这会有所帮助。

还有其他选项:有没有办法以某种方式扩展 PLCrashReportSystemInfo class?

这很危险。特别是对 CFStringCreateWithFormat 的调用会分配内存。在崩溃处理程序中间分配内存可能会导致电池耗尽死锁(是的;有那个错误......)例如,如果你在 free() 中间(这不是一个不常见的崩溃地方),您可能已经在堆上持有自旋锁。当您调用 malloc 以获取一些内存时,您可能会再次自旋锁定堆并在紧密循环中死锁。堆需要如此频繁地锁定,并且锁定时间如此短,以至于它不使用阻塞锁。它相当于 while (locked) {}.

您似乎只是在阅读一个偏好并将其复制到另一个偏好。没有理由在崩溃处理程序中这样做。只需在启动期间检查 hasPendingCrashReport(我假设您已经在做),然后读取密钥。不清楚 networkStatusKey 是什么,但再次启动时它应该仍然存在。

如果出于任何原因它很早就被修改了(在您调用 hasPendingCrashReport 之前),您可以在启动应用程序之前在 main() 中获取它。或者您可以在 +load 方法中获取它,该方法甚至更早被调用。