|
19 | 19 | #if CLS_METRICKIT_SUPPORTED
|
20 | 20 |
|
21 | 21 | #import "Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h"
|
| 22 | +#include "Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h" |
| 23 | +#include "Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h" |
22 | 24 | #import "Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h"
|
23 | 25 | #import "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h"
|
24 | 26 | #import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h"
|
@@ -209,8 +211,38 @@ - (BOOL)processMetricKitPayload:(MXDiagnosticPayload *)diagnosticPayload
|
209 | 211 | NSDictionary *metadataDict = [self convertMetadataToDictionary:crashDiagnostic.metaData];
|
210 | 212 |
|
211 | 213 | NSString *nilString = @"";
|
212 |
| - NSString *name = [self getExceptionName:crashDiagnostic.exceptionType]; |
213 |
| - NSString *codeName = [crashDiagnostic.exceptionType intValue] == SIGABRT ? @"ABORT" : @""; |
| 214 | + |
| 215 | + // On the backend, we process name, code name, and address into the subtitle of an issue. |
| 216 | + // Mach exception name and code should be preferred over signal name and code if available. |
| 217 | + const char *signalName = NULL; |
| 218 | + const char *signalCodeName = NULL; |
| 219 | + FIRCLSSignalNameLookup([crashDiagnostic.signal intValue], 0, &signalName, &signalCodeName); |
| 220 | + // signalName is the default name, so should never be NULL |
| 221 | + if (signalName == NULL) { |
| 222 | + signalName = "UNKNOWN"; |
| 223 | + } |
| 224 | + if (signalCodeName == NULL) { |
| 225 | + signalCodeName = ""; |
| 226 | + } |
| 227 | + |
| 228 | + const char *machExceptionName = NULL; |
| 229 | + const char *machExceptionCodeName = NULL; |
| 230 | +#if CLS_MACH_EXCEPTION_SUPPORTED |
| 231 | + FIRCLSMachExceptionNameLookup( |
| 232 | + [crashDiagnostic.exceptionType intValue], |
| 233 | + (mach_exception_data_type_t)[crashDiagnostic.exceptionCode intValue], &machExceptionName, |
| 234 | + &machExceptionCodeName); |
| 235 | +#endif |
| 236 | + if (machExceptionCodeName == NULL) { |
| 237 | + machExceptionCodeName = ""; |
| 238 | + } |
| 239 | + |
| 240 | + NSString *name = machExceptionName != NULL ? [NSString stringWithUTF8String:machExceptionName] |
| 241 | + : [NSString stringWithUTF8String:signalName]; |
| 242 | + NSString *codeName = machExceptionName != NULL |
| 243 | + ? [NSString stringWithUTF8String:machExceptionCodeName] |
| 244 | + : [NSString stringWithUTF8String:signalCodeName]; |
| 245 | + |
214 | 246 | NSDictionary *crashDictionary = @{
|
215 | 247 | @"metric_kit_fatal" : @{
|
216 | 248 | @"time" : [NSNumber numberWithLong:beginSecondsSince1970],
|
@@ -389,9 +421,9 @@ - (BOOL)writeDictionaryToFile:(NSDictionary *)dictionary
|
389 | 421 | return YES;
|
390 | 422 | }
|
391 | 423 |
|
392 |
| -- (NSString *)getExceptionName:(NSNumber *)exceptionType { |
393 |
| - int exception = [exceptionType intValue]; |
394 |
| - switch (exception) { |
| 424 | +- (NSString *)getSignalName:(NSNumber *)signalCode { |
| 425 | + int signal = [signalCode intValue]; |
| 426 | + switch (signal) { |
395 | 427 | case SIGABRT:
|
396 | 428 | return @"SIGABRT";
|
397 | 429 | case SIGBUS:
|
|
0 commit comments