From 215d81dc12627f5fc5d63414859f552aa4cd453c Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 7 Feb 2025 14:25:51 -0800 Subject: [PATCH 1/5] Add crash log handling. --- Extension/src/LanguageServer/extension.ts | 29 +++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 58af8a4b0..efde5166b 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -1047,13 +1047,16 @@ export function watchForCrashes(crashDirectory: string): void { let previousCrashData: string; let previousCrashCount: number = 0; -function logCrashTelemetry(data: string, type: string, offsetData?: string): void { +function logCrashTelemetry(data: string, type: string, offsetData?: string, crashLog?: string): void { const crashObject: Record = {}; const crashCountObject: Record = {}; crashObject.CrashingThreadCallStack = data; if (offsetData !== undefined) { crashObject.CrashingThreadCallStackOffsets = offsetData; } + if (crashLog !== undefined) { + crashObject.CrashLog = crashLog; + } previousCrashCount = data === previousCrashData ? previousCrashCount + 1 : 0; previousCrashData = data; crashCountObject.CrashCount = previousCrashCount + 1; @@ -1064,8 +1067,8 @@ function logMacCrashTelemetry(data: string): void { logCrashTelemetry(data, "MacCrash"); } -function logCppCrashTelemetry(data: string, offsetData?: string): void { - logCrashTelemetry(data, "CppCrash", offsetData); +function logCppCrashTelemetry(data: string, offsetData?: string, crashLog?: string): void { + logCrashTelemetry(data, "CppCrash", offsetData, crashLog); } function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data: string): void { @@ -1185,7 +1188,19 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr const endOffsetStr: string = isMac ? " " : " <"; const dotStr: string = "\n…"; let signalType: string; - if (lines[0].startsWith("SIG")) { + let crashLog: string = ""; + let crashStackStartLine: number = 0; + if (lines[0] === "LOG") { + let crashLogLine: number = 0; + for (; crashLogLine < lines.length; ++crashLogLine) { + if (lines[crashLogLine] == "ENDLOG") { + break; + } + crashLog += lines[crashLogLine] + "\n"; + } + crashStackStartLine = ++crashLogLine; + } + if (lines[crashStackStartLine].startsWith("SIG")) { signalType = lines[0]; } else { // The signal type may fail to be written. @@ -1193,7 +1208,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr } let crashCallStack: string = ""; let validFrameFound: boolean = false; - for (let lineNum: number = 0; lineNum < lines.length - 3; ++lineNum) { // skip last lines + for (let lineNum: number = crashStackStartLine; lineNum < lines.length - 3; ++lineNum) { // skip last lines const line: string = lines[lineNum]; const startPos: number = line.indexOf(startStr); if (startPos === -1 || line[startPos + (isMac ? 1 : 4)] === "+") { @@ -1275,7 +1290,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr const settings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", null); if (lines.length >= 6 && util.getNumericLoggingLevel(settings.get("loggingLevel")) >= 1) { const out: vscode.OutputChannel = getCrashCallStacksChannel(); - out.appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}`); + out.appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}${crashLog}`); } } @@ -1285,7 +1300,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr data = data.substring(0, 8191) + "…"; } - logCppCrashTelemetry(data, addressData); + logCppCrashTelemetry(data, addressData, crashLog); await util.deleteFile(path.resolve(crashDirectory, crashFile)).catch(logAndReturn.undefined); if (crashFile === "cpptools.txt") { From 5d48382c4b56012c88822f371d9702a5a2a27ae8 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 7 Feb 2025 14:34:00 -0800 Subject: [PATCH 2/5] Fix linter. --- Extension/src/LanguageServer/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index efde5166b..6016b06c8 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -1193,7 +1193,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr if (lines[0] === "LOG") { let crashLogLine: number = 0; for (; crashLogLine < lines.length; ++crashLogLine) { - if (lines[crashLogLine] == "ENDLOG") { + if (lines[crashLogLine] === "ENDLOG") { break; } crashLog += lines[crashLogLine] + "\n"; From a4d49efb89ee4eee6e2622c7e75c91b772f433bf Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Tue, 11 Feb 2025 19:29:54 -0800 Subject: [PATCH 3/5] Fixes. --- Extension/src/LanguageServer/extension.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 6016b06c8..80c38cc21 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -1191,17 +1191,18 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr let crashLog: string = ""; let crashStackStartLine: number = 0; if (lines[0] === "LOG") { - let crashLogLine: number = 0; + let crashLogLine: number = 1; for (; crashLogLine < lines.length; ++crashLogLine) { if (lines[crashLogLine] === "ENDLOG") { break; } crashLog += lines[crashLogLine] + "\n"; } + crashLog = crashLog.trimEnd(); crashStackStartLine = ++crashLogLine; } if (lines[crashStackStartLine].startsWith("SIG")) { - signalType = lines[0]; + signalType = lines[crashStackStartLine]; } else { // The signal type may fail to be written. signalType = "SIG-??\n"; // Intentionally different from SIG-? from cpptools. @@ -1290,7 +1291,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr const settings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", null); if (lines.length >= 6 && util.getNumericLoggingLevel(settings.get("loggingLevel")) >= 1) { const out: vscode.OutputChannel = getCrashCallStacksChannel(); - out.appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}${crashLog}`); + out.appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}\n\n${crashLog}\n\n`); } } From 64aeb9802ed228afdc0a7fa54fdd4955ec2eb3e1 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Tue, 11 Feb 2025 19:35:10 -0800 Subject: [PATCH 4/5] Fix newlines. --- Extension/src/LanguageServer/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 80c38cc21..767236198 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -1291,7 +1291,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr const settings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", null); if (lines.length >= 6 && util.getNumericLoggingLevel(settings.get("loggingLevel")) >= 1) { const out: vscode.OutputChannel = getCrashCallStacksChannel(); - out.appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}\n\n${crashLog}\n\n`); + out.appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}\n\n${crashLog}`); } } From 84aa29f17e9c6fe292d5c9984b7112d4112b27bb Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Wed, 19 Feb 2025 15:05:38 -0800 Subject: [PATCH 5/5] Add containsUnexpectedTelemetryCharacter. --- Extension/src/LanguageServer/extension.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index c58569ab1..0a12d1da1 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -1169,6 +1169,10 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d logMacCrashTelemetry(data); } +function containsUnexpectedTelemetryCharacter(str: string): boolean { + return str.includes("/") || str.includes("\\") || str.includes("@"); +} + async function handleCrashFileRead(crashDirectory: string, crashFile: string, crashDate: Date, err: NodeJS.ErrnoException | undefined | null, data: string): Promise { if (err) { if (err.code === "ENOENT") { @@ -1193,10 +1197,15 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr if (lines[0] === "LOG") { let crashLogLine: number = 1; for (; crashLogLine < lines.length; ++crashLogLine) { - if (lines[crashLogLine] === "ENDLOG") { + const pendingCrashLogLine = lines[crashLogLine]; + if (pendingCrashLogLine === "ENDLOG") { break; } - crashLog += lines[crashLogLine] + "\n"; + if (!containsUnexpectedTelemetryCharacter(pendingCrashLogLine)) { + crashLog += pendingCrashLogLine + "\n"; + } else { + crashLog += "\n"; + } } crashLog = crashLog.trimEnd(); crashStackStartLine = ++crashLogLine; @@ -1266,7 +1275,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr const offsetPos2: number = offsetPos + offsetStr.length; if (isMac) { const pendingOffset: string = line.substring(offsetPos2); - if (!pendingOffset.includes("/") && !pendingOffset.includes("\\") && !pendingOffset.includes("@")) { + if (!containsUnexpectedTelemetryCharacter(pendingOffset)) { crashCallStack += pendingOffset; } else { crashCallStack += ""; @@ -1285,7 +1294,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr continue; // unexpected } const pendingOffset: string = line.substring(offsetPos2, endPos); - if (!pendingOffset.includes("/") && !pendingOffset.includes("\\") && !pendingOffset.includes("@")) { + if (!containsUnexpectedTelemetryCharacter(pendingOffset)) { crashCallStack += pendingOffset; } else { crashCallStack += ""; @@ -1309,7 +1318,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr data = data.substring(0, 8191) + "…"; } - if (addressData.includes("/") || addressData.includes("\\") || addressData.includes("@")) { + if (containsUnexpectedTelemetryCharacter(addressData)) { addressData = ""; }