Skip to content

Commit 497e6ae

Browse files
authored
Update MetricKit exception name and code name determination (#9309)
1 parent 47c046e commit 497e6ae

File tree

4 files changed

+44
-8
lines changed

4 files changed

+44
-8
lines changed

Crashlytics/Crashlytics/Controllers/FIRCLSMetricKitManager.m

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#if CLS_METRICKIT_SUPPORTED
2020

2121
#import "Crashlytics/Crashlytics/Controllers/FIRCLSManagerData.h"
22+
#include "Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h"
23+
#include "Crashlytics/Crashlytics/Handlers/FIRCLSSignal.h"
2224
#import "Crashlytics/Crashlytics/Helpers/FIRCLSCallStackTree.h"
2325
#import "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h"
2426
#import "Crashlytics/Crashlytics/Helpers/FIRCLSLogger.h"
@@ -209,8 +211,38 @@ - (BOOL)processMetricKitPayload:(MXDiagnosticPayload *)diagnosticPayload
209211
NSDictionary *metadataDict = [self convertMetadataToDictionary:crashDiagnostic.metaData];
210212

211213
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+
214246
NSDictionary *crashDictionary = @{
215247
@"metric_kit_fatal" : @{
216248
@"time" : [NSNumber numberWithLong:beginSecondsSince1970],
@@ -389,9 +421,9 @@ - (BOOL)writeDictionaryToFile:(NSDictionary *)dictionary
389421
return YES;
390422
}
391423

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) {
395427
case SIGABRT:
396428
return @"SIGABRT";
397429
case SIGBUS:

Crashlytics/Crashlytics/Handlers/FIRCLSMachException.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ static bool FIRCLSMachExceptionUnregister(FIRCLSMachExceptionOriginalPorts* orig
339339
}
340340

341341
#pragma mark - Recording
342-
static void FIRCLSMachExceptionNameLookup(exception_type_t number,
342+
void FIRCLSMachExceptionNameLookup(exception_type_t number,
343343
mach_exception_data_type_t code,
344344
const char** name,
345345
const char** codeName) {

Crashlytics/Crashlytics/Handlers/FIRCLSMachException.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ void FIRCLSMachExceptionInit(FIRCLSMachExceptionReadContext* context);
7070

7171
void FIRCLSMachExceptionCheckHandlers(void);
7272

73+
void FIRCLSMachExceptionNameLookup(exception_type_t number,
74+
mach_exception_data_type_t code,
75+
const char** name,
76+
const char** codeName);
7377
#else
7478

7579
#define CLS_MACH_EXCEPTION_HANDLER_STACK_SIZE 0

Crashlytics/UnitTests/FIRCLSMetricKitManagerTests.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,8 +405,8 @@ - (void)testCrashDiagnosticHandling {
405405
@"r-x\\/r-x SM=COW ...pp\\/Test"]);
406406
XCTAssertEqual([[crashDictionary objectForKey:@"exception_code"] integerValue], 0);
407407
XCTAssertEqual([[crashDictionary objectForKey:@"exception_type"] integerValue], 6);
408-
XCTAssertTrue([[crashDictionary objectForKey:@"name"] isEqualToString:@"SIGABRT"]);
409-
XCTAssertTrue([[crashDictionary objectForKey:@"code_name"] isEqualToString:@"ABORT"]);
408+
XCTAssertTrue([[crashDictionary objectForKey:@"name"] isEqualToString:@"EXC_BREAKPOINT"]);
409+
XCTAssertTrue([[crashDictionary objectForKey:@"code_name"] isEqualToString:@"EXC_I386_DIVERR"]);
410410

411411
NSDictionary *metadata = [crashDictionary objectForKey:@"metadata"];
412412
NSDictionary *threads =

0 commit comments

Comments
 (0)