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
方法中获取它,该方法甚至更早被调用。
我在我的 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
方法中获取它,该方法甚至更早被调用。