Skip to content

Commit 5ebe93c

Browse files
authored
Add crash log handling. (#13253)
* Add crash log handling.
1 parent db16246 commit 5ebe93c

File tree

1 file changed

+36
-11
lines changed

1 file changed

+36
-11
lines changed

Extension/src/LanguageServer/extension.ts

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,13 +1048,16 @@ export function watchForCrashes(crashDirectory: string): void {
10481048
let previousCrashData: string;
10491049
let previousCrashCount: number = 0;
10501050

1051-
function logCrashTelemetry(data: string, type: string, offsetData?: string): void {
1051+
function logCrashTelemetry(data: string, type: string, offsetData?: string, crashLog?: string): void {
10521052
const crashObject: Record<string, string> = {};
10531053
const crashCountObject: Record<string, number> = {};
10541054
crashObject.CrashingThreadCallStack = data;
10551055
if (offsetData !== undefined) {
10561056
crashObject.CrashingThreadCallStackOffsets = offsetData;
10571057
}
1058+
if (crashLog !== undefined) {
1059+
crashObject.CrashLog = crashLog;
1060+
}
10581061
previousCrashCount = data === previousCrashData ? previousCrashCount + 1 : 0;
10591062
previousCrashData = data;
10601063
crashCountObject.CrashCount = previousCrashCount + 1;
@@ -1065,8 +1068,8 @@ function logMacCrashTelemetry(data: string): void {
10651068
logCrashTelemetry(data, "MacCrash");
10661069
}
10671070

1068-
function logCppCrashTelemetry(data: string, offsetData?: string): void {
1069-
logCrashTelemetry(data, "CppCrash", offsetData);
1071+
function logCppCrashTelemetry(data: string, offsetData?: string, crashLog?: string): void {
1072+
logCrashTelemetry(data, "CppCrash", offsetData, crashLog);
10701073
}
10711074

10721075
function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data: string): void {
@@ -1167,6 +1170,10 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d
11671170
logMacCrashTelemetry(data);
11681171
}
11691172

1173+
function containsUnexpectedTelemetryCharacter(str: string): boolean {
1174+
return str.includes("/") || str.includes("\\") || str.includes("@");
1175+
}
1176+
11701177
async function handleCrashFileRead(crashDirectory: string, crashFile: string, crashDate: Date, err: NodeJS.ErrnoException | undefined | null, data: string): Promise<void> {
11711178
if (err) {
11721179
if (err.code === "ENOENT") {
@@ -1186,15 +1193,33 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
11861193
const endOffsetStr: string = isMac ? " " : " <";
11871194
const dotStr: string = "\n…";
11881195
let signalType: string;
1189-
if (lines[0].startsWith("SIG")) {
1190-
signalType = lines[0];
1196+
let crashLog: string = "";
1197+
let crashStackStartLine: number = 0;
1198+
if (lines[0] === "LOG") {
1199+
let crashLogLine: number = 1;
1200+
for (; crashLogLine < lines.length; ++crashLogLine) {
1201+
const pendingCrashLogLine = lines[crashLogLine];
1202+
if (pendingCrashLogLine === "ENDLOG") {
1203+
break;
1204+
}
1205+
if (!containsUnexpectedTelemetryCharacter(pendingCrashLogLine)) {
1206+
crashLog += pendingCrashLogLine + "\n";
1207+
} else {
1208+
crashLog += "<unexpectedCharacter>\n";
1209+
}
1210+
}
1211+
crashLog = crashLog.trimEnd();
1212+
crashStackStartLine = ++crashLogLine;
1213+
}
1214+
if (lines[crashStackStartLine].startsWith("SIG")) {
1215+
signalType = lines[crashStackStartLine];
11911216
} else {
11921217
// The signal type may fail to be written.
11931218
signalType = "SIG-??\n"; // Intentionally different from SIG-? from cpptools.
11941219
}
11951220
let crashCallStack: string = "";
11961221
let validFrameFound: boolean = false;
1197-
for (let lineNum: number = 0; lineNum < lines.length - 3; ++lineNum) { // skip last lines
1222+
for (let lineNum: number = crashStackStartLine; lineNum < lines.length - 3; ++lineNum) { // skip last lines
11981223
const line: string = lines[lineNum];
11991224
const startPos: number = line.indexOf(startStr);
12001225
if (startPos === -1 || line[startPos + (isMac ? 1 : 4)] === "+") {
@@ -1251,7 +1276,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
12511276
const offsetPos2: number = offsetPos + offsetStr.length;
12521277
if (isMac) {
12531278
const pendingOffset: string = line.substring(offsetPos2);
1254-
if (!pendingOffset.includes("/") && !pendingOffset.includes("\\") && !pendingOffset.includes("@")) {
1279+
if (!containsUnexpectedTelemetryCharacter(pendingOffset)) {
12551280
crashCallStack += pendingOffset;
12561281
} else {
12571282
crashCallStack += "<offsetUnexpectedCharacter>";
@@ -1270,7 +1295,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
12701295
continue; // unexpected
12711296
}
12721297
const pendingOffset: string = line.substring(offsetPos2, endPos);
1273-
if (!pendingOffset.includes("/") && !pendingOffset.includes("\\") && !pendingOffset.includes("@")) {
1298+
if (!containsUnexpectedTelemetryCharacter(pendingOffset)) {
12741299
crashCallStack += pendingOffset;
12751300
} else {
12761301
crashCallStack += "<offsetUnexpectedCharacter>";
@@ -1282,7 +1307,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
12821307
prevCppCrashCallStackData = crashCallStack;
12831308

12841309
if (lines.length >= 6 && util.getLoggingLevel() >= 1) {
1285-
getCrashCallStacksChannel().appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}`);
1310+
getCrashCallStacksChannel().appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}\n\n${crashLog}`);
12861311
}
12871312
}
12881313

@@ -1292,11 +1317,11 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
12921317
data = data.substring(0, 8191) + "…";
12931318
}
12941319

1295-
if (addressData.includes("/") || addressData.includes("\\") || addressData.includes("@")) {
1320+
if (containsUnexpectedTelemetryCharacter(addressData)) {
12961321
addressData = "<addressDataUnexpectedCharacter>";
12971322
}
12981323

1299-
logCppCrashTelemetry(data, addressData);
1324+
logCppCrashTelemetry(data, addressData, crashLog);
13001325

13011326
await util.deleteFile(path.resolve(crashDirectory, crashFile)).catch(logAndReturn.undefined);
13021327
if (crashFile === "cpptools.txt") {

0 commit comments

Comments
 (0)