(crashDirectory: string, crashFile: string, crashDate: Date, err: NodeJS.ErrnoException | undefined | null, data: string)
| 1293 | } |
| 1294 | |
| 1295 | async function handleCrashFileRead(crashDirectory: string, crashFile: string, crashDate: Date, err: NodeJS.ErrnoException | undefined | null, data: string): Promise<void> { |
| 1296 | if (err) { |
| 1297 | if (err.code === "ENOENT") { |
| 1298 | return; // ignore known issue |
| 1299 | } |
| 1300 | return logCppCrashTelemetry("readFile: " + err.code); |
| 1301 | } |
| 1302 | |
| 1303 | const lines: string[] = data.split("\n"); |
| 1304 | let addressData: string; |
| 1305 | const isCppToolsSrv2: boolean = crashFile.startsWith("cpptools-srv2"); |
| 1306 | const isCppToolsSrv: boolean = crashFile.startsWith("cpptools-srv"); |
| 1307 | const telemetryHeader: string = (isCppToolsSrv2 ? "cpptools-srv2.txt" : isCppToolsSrv ? "cpptools-srv.txt" : crashFile) + "\n"; |
| 1308 | const filtPath: string | null = which.sync("c++filt", { nothrow: true }); |
| 1309 | const isMac: boolean = process.platform === "darwin"; |
| 1310 | const startStr: string = isMac ? " _" : "<"; |
| 1311 | const offsetStr: string = isMac ? " + " : "+"; |
| 1312 | const endOffsetStr: string = isMac ? " " : " <"; |
| 1313 | const dotStr: string = "…\n"; |
| 1314 | let signalType: string; |
| 1315 | let crashLog: string = ""; |
| 1316 | let crashStackStartLine: number = 0; |
| 1317 | if (lines[0] === "LOG") { |
| 1318 | let crashLogLine: number = 1; |
| 1319 | for (; crashLogLine < lines.length; ++crashLogLine) { |
| 1320 | let pendingCrashLogLine = lines[crashLogLine]; |
| 1321 | if (pendingCrashLogLine === "ENDLOG") { |
| 1322 | break; |
| 1323 | } |
| 1324 | pendingCrashLogLine += "\n"; |
| 1325 | if (containsFilteredTelemetryData(pendingCrashLogLine)) { |
| 1326 | crashLog += "?\n"; |
| 1327 | } else { |
| 1328 | crashLog += pendingCrashLogLine; |
| 1329 | } |
| 1330 | } |
| 1331 | crashLog = crashLog.trimEnd(); |
| 1332 | crashStackStartLine = ++crashLogLine; |
| 1333 | } |
| 1334 | if (lines[crashStackStartLine].startsWith("SIG")) { |
| 1335 | signalType = `${lines[crashStackStartLine]}\n`; |
| 1336 | addressData = `${lines[crashStackStartLine + 1]}:${lines[crashStackStartLine + 2]}\n`; // signalCode:signalAddr |
| 1337 | crashStackStartLine += 3; |
| 1338 | } else { |
| 1339 | // The signal type may fail to be written. |
| 1340 | // Intentionally different from SIGUNKNOWN from cpptools, |
| 1341 | // and not SIG-? to avoid matching the regex in containsFilteredTelemetryData. |
| 1342 | signalType = "SIGMISSING\n"; |
| 1343 | addressData = ".\n"; |
| 1344 | } |
| 1345 | data = telemetryHeader + signalType; |
| 1346 | let crashCallStack: string = ""; |
| 1347 | let validFrameFound: boolean = false; |
| 1348 | for (let lineNum: number = crashStackStartLine; lineNum < lines.length - 3; ++lineNum) { // skip last lines |
| 1349 | const line: string = lines[lineNum]; |
| 1350 | const startPos: number = line.indexOf(startStr); |
| 1351 | let pendingCallStack: string = ""; |
| 1352 | if (startPos === -1 || line[startPos + (isMac ? 1 : 4)] === "+") { |
no test coverage detected