PLCrashReporter信号回调能否使用核心基础? 我在我的iOS项目中使用,我很好奇,是否可以在我的自定义崩溃回调中使用核心基础代码。处理我需要的是CFPreferences。以下是我创建的部分代码: 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); }

PLCrashReporter信号回调能否使用核心基础? 我在我的iOS项目中使用,我很好奇,是否可以在我的自定义崩溃回调中使用核心基础代码。处理我需要的是CFPreferences。以下是我创建的部分代码: 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); },ios,plcrashreporter,Ios,Plcrashreporter,我的目标是在应用程序崩溃时及时收集一些系统信息,例如互联网连接类型 我知道,由于异步安全函数的原因,创建自己的崩溃回调不是一个好主意,但这会有所帮助 还有另一个选项:是否有方法以某种方式扩展PLCrashReportSystemInfo类?这是非常危险的。特别是对CFStringCreateWithFormat的调用分配内存。在崩溃处理程序中间分配内存会导致电池耗尽死锁(YEP;如果有bug……),例如,如果你在 For()的代码中间(这不是一个不常见的崩溃的地方),你可能已经在堆上保存了一个自

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

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


还有另一个选项:是否有方法以某种方式扩展PLCrashReportSystemInfo类?

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

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


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

回答得很好。非常感谢。