在我们获得崩溃数据后,有没有一种方法可以对崩溃报告进行符号化?
目前,这是我在handleCrashReport方法中所做的;
PLCrashReportTextFormat textFormat = PLCrashReportTextFormatiOS;
/* Decode data */
PLCrashReport *crashLog = [[PLCrashReport alloc] initWithData: data error: &error];
if (crashLog == nil) {
NSLog(@"Could not decode crash file :%@", [[error localizedDescription] UTF8String]);
} else {
NSString* report = [PLCrashReportTextFormatter stringValueForCrashReport: crashLog withTextFormat: textFormat];
NSLog(@"Crash log nnn%@ nnn", report);
NSString *outputPath = [documentsDirectory stringByAppendingPathComponent: @"app.crash"];
if (![report writeToFile:outputPath atomically:YES encoding:NSUTF8StringEncoding error:nil]) {
NSLog(@"Failed to write crash report");
} else {
NSLog(@"Saved crash report to: %@", outputPath);
}
}
当我在控制台上打印出来的时候;我明白了。
Application Specific Information:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This should crash the application.'
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x93a0d9c6 0x939f5000 + 100806
1 libsystem_c.dylib 0x9c5aabdd 0x9c55b000 + 326621
2 shell 0x00082a2c 0x1000 + 530988
3 CoreFoundation 0x0263d0fc 0x253f000 + 1040636
4 libobjc.A.dylib 0x00f8ef0f 0xf89000 + 24335
5 libc++abi.dylib 0x02a028de 0x29fd000 + 22750
6 libc++abi.dylib 0x02a02946 0x29fd000 + 22854
7 libc++abi.dylib 0x02a03b3e 0x29fd000 + 27454
8 libobjc.A.dylib 0x00f8ee15 0xf89000 + 24085
9 CoreFoundation 0x02573de0 0x253f000 + 216544
10 CoreFoundation 0x02573c9b 0x253f000 + 216219
11 UIKit 0x0150ac65 0x1501000 + 40037
12 UIKit 0x0150c626 0x1501000 + 46630
13 shell 0x00002fed 0x1000 + 8173
14 shell 0x00001f95 0x1000 + 3989
Thread 1:
0 libsystem_kernel.dylib 0x93a0e90a 0x939f5000 + 104714
1 libdispatch.dylib 0x02ad2be1 0x2ad1000 + 7137
Thread 2:
0 libsystem_kernel.dylib 0x93a0bc22 0x939f5000 + 93218
1 libsystem_notify.dylib 0x97cb9cd2 0x97cb8000 + 7378
2 libsystem_notify.dylib 0x97cbdb4b 0x97cb8000 + 23371
3 libsystem_c.dylib 0x9c5e859b 0x9c55b000 + 578971
4 CoreFoundation 0x025e61c3 0x253f000 + 684483
5 CoreFoundation 0x025e5d83 0x253f000 + 683395
6 Foundation 0x00caab53 0xc34000 + 486227
7 Foundation 0x00caaac5 0xc34000 + 486085
8 shell 0x003ddbf8 0x1000 + 4049912
9 libdispatch.dylib 0x02ad2330 0x2ad1000 + 4912
10 libdispatch.dylib 0x02ad3f0c 0x2ad1000 + 12044
11 libdispatch.dylib 0x02ad3cb4 0x2ad1000 + 11444
12 libdispatch.dylib 0x02ad3402 0x2ad1000 + 9218
13 libsystem_c.dylib 0x9c5b9b24 0x9c55b000 + 387876
14 libsystem_c.dylib 0x9c5bb6fe 0x9c55b000 + 395006
如果可能的话,我想象征一下进程中。有什么想法吗?
提前非常感谢。
您可以象征性地处理崩溃报告,这需要三件事:
- 你应该在下一个应用程序启动时这样做
- 你需要应用程序符号成为二进制文件的一部分,这会使其大小增加30-50%
- 你不会得到行号
最新版本的PLCrashReporter能够做到这一点,但我不推荐它,而是使用dSYM来象征它,因为它更有帮助。
PLCrashReporter提供了一个在设备上进行符号化的配置选项
PLCrashReporterConfig *config = [[PLCrashReporterConfig alloc] initWithSignalHandlerType: PLCrashReporterSignalHandlerTypeBSD symbolicationStrategy: PLCrashReporterSymbolicationStrategyAll];
PLCrashReporter *crashReporter = [[PLCrashReporter alloc] initWithConfiguration:config];
然而,DSYM的符号化效果更好的原因有两个:
- 文档建议不要在发布版本中使用此功能
- 符号化不如使用DSYM和系统框架的调试符号的符号化。你会得到很多"行
要在开发机器上符号化崩溃报告,您可以这样做(确保原始二进制文件和dsym文件在同一目录中,并且您有崩溃报告中提到的iOS版本的调试符号):
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash MyCrash.crash