diff --git a/desktop/flipper-server-core/src/devices/ios/__tests__/iOSCrashUtils.node.tsx b/desktop/flipper-server-core/src/devices/ios/__tests__/iOSCrashUtils.node.tsx index e837c1bfa..7e92efef5 100644 --- a/desktop/flipper-server-core/src/devices/ios/__tests__/iOSCrashUtils.node.tsx +++ b/desktop/flipper-server-core/src/devices/ios/__tests__/iOSCrashUtils.node.tsx @@ -36,7 +36,7 @@ const modernCrashReportPartial = `{"app_name":"Sample","timestamp":"2022-08-02 1 "procExitAbsTime" : 568276773623039, "cpuType" : "X86-64", "procName" : "Sample", - "procPath" : "\/Users\/USER\/Library\/Developer\/CoreSimulator\/Devices\/543083BF-313B-422B-A817-377078C830AF\/data\/Containers\/Bundle\/Application\/22053C61-10A5-49AE-9B09-00B0B9EAC36B\/Sample.app\/Sample" + "procPath" : "\/Users\/USER\/Library\/Developer\/CoreSimulator\/Devices\/543083BF-313B-422B-A817-377078C830AF\/data\/Containers\/Bundle\/Application\/22053C61-10A5-49AE-9B09-00B0B9EAC36B\/Sample.app\/Sample", }`; test('test the parsing of the date and crash info for the log which matches the predefined regex', () => { diff --git a/desktop/flipper-server-core/src/devices/ios/iOSCrashUtils.tsx b/desktop/flipper-server-core/src/devices/ios/iOSCrashUtils.tsx index c9311ffa1..49f37880f 100644 --- a/desktop/flipper-server-core/src/devices/ios/iOSCrashUtils.tsx +++ b/desktop/flipper-server-core/src/devices/ios/iOSCrashUtils.tsx @@ -43,17 +43,24 @@ export function parseIosCrashLegacy(content: string) { } export function parseIosCrashModern(content: string) { - const lines = content.split('\n'); - // Skip the first line of the .ips file as it is useless - const reportBodyString = lines.slice(1).join('\n'); - const reportBody = JSON.parse(reportBodyString); - const exception = `${reportBody.exception.type} (${reportBody.exception.signal})`; + const captureTimeRegex = /"captureTime".*:.*"(.*)",\n/; + const captureTimeArr = captureTimeRegex.exec(content); + + const exceptionRegex = /"exception".*:.*{(.*)},\n/; + const exceptionArr = exceptionRegex.exec(content); + let exceptionJSON: {type: string; signal: string} | undefined; + try { + exceptionJSON = JSON.parse(`{${exceptionArr?.[1]}}`); + } catch {} + const exception = exceptionJSON + ? `${exceptionJSON.type} (${exceptionJSON.signal})` + : 'Unknown'; const crash: CrashLog = { callstack: content, name: exception, reason: exception, - date: new Date(reportBody.captureTime).getTime(), + date: new Date(captureTimeArr?.[1] as string).getTime(), }; return crash; } @@ -83,11 +90,13 @@ export function parsePathLegacy(content: string): string | null { export function parsePathModern(content: string): string | null { try { - const lines = content.split('\n'); - // Skip the first line of the .ips file as it is useless - const reportBodyString = lines.slice(1).join('\n'); - const reportBody = JSON.parse(reportBodyString); - return reportBody.procPath; + const regex = /"procPath".*:.*"(.*)",\n/; + const arr = regex.exec(content); + if (!arr || arr.length <= 1) { + return null; + } + const path = arr[1]; + return path.trim(); } catch (e) { console.warn('parsePathModern -> failed to parse crash file', e, content); return null;