@@ -1048,13 +1048,16 @@ export function watchForCrashes(crashDirectory: string): void {
1048
1048
let previousCrashData : string ;
1049
1049
let previousCrashCount : number = 0 ;
1050
1050
1051
- function logCrashTelemetry ( data : string , type : string , offsetData ?: string ) : void {
1051
+ function logCrashTelemetry ( data : string , type : string , offsetData ?: string , crashLog ?: string ) : void {
1052
1052
const crashObject : Record < string , string > = { } ;
1053
1053
const crashCountObject : Record < string , number > = { } ;
1054
1054
crashObject . CrashingThreadCallStack = data ;
1055
1055
if ( offsetData !== undefined ) {
1056
1056
crashObject . CrashingThreadCallStackOffsets = offsetData ;
1057
1057
}
1058
+ if ( crashLog !== undefined ) {
1059
+ crashObject . CrashLog = crashLog ;
1060
+ }
1058
1061
previousCrashCount = data === previousCrashData ? previousCrashCount + 1 : 0 ;
1059
1062
previousCrashData = data ;
1060
1063
crashCountObject . CrashCount = previousCrashCount + 1 ;
@@ -1065,8 +1068,8 @@ function logMacCrashTelemetry(data: string): void {
1065
1068
logCrashTelemetry ( data , "MacCrash" ) ;
1066
1069
}
1067
1070
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 ) ;
1070
1073
}
1071
1074
1072
1075
function handleMacCrashFileRead ( err : NodeJS . ErrnoException | undefined | null , data : string ) : void {
@@ -1167,6 +1170,10 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d
1167
1170
logMacCrashTelemetry ( data ) ;
1168
1171
}
1169
1172
1173
+ function containsUnexpectedTelemetryCharacter ( str : string ) : boolean {
1174
+ return str . includes ( "/" ) || str . includes ( "\\" ) || str . includes ( "@" ) ;
1175
+ }
1176
+
1170
1177
async function handleCrashFileRead ( crashDirectory : string , crashFile : string , crashDate : Date , err : NodeJS . ErrnoException | undefined | null , data : string ) : Promise < void > {
1171
1178
if ( err ) {
1172
1179
if ( err . code === "ENOENT" ) {
@@ -1186,15 +1193,33 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
1186
1193
const endOffsetStr : string = isMac ? " " : " <" ;
1187
1194
const dotStr : string = "\n…" ;
1188
1195
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 ] ;
1191
1216
} else {
1192
1217
// The signal type may fail to be written.
1193
1218
signalType = "SIG-??\n" ; // Intentionally different from SIG-? from cpptools.
1194
1219
}
1195
1220
let crashCallStack : string = "" ;
1196
1221
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
1198
1223
const line : string = lines [ lineNum ] ;
1199
1224
const startPos : number = line . indexOf ( startStr ) ;
1200
1225
if ( startPos === - 1 || line [ startPos + ( isMac ? 1 : 4 ) ] === "+" ) {
@@ -1251,7 +1276,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
1251
1276
const offsetPos2 : number = offsetPos + offsetStr . length ;
1252
1277
if ( isMac ) {
1253
1278
const pendingOffset : string = line . substring ( offsetPos2 ) ;
1254
- if ( ! pendingOffset . includes ( "/" ) && ! pendingOffset . includes ( "\\" ) && ! pendingOffset . includes ( "@" ) ) {
1279
+ if ( ! containsUnexpectedTelemetryCharacter ( pendingOffset ) ) {
1255
1280
crashCallStack += pendingOffset ;
1256
1281
} else {
1257
1282
crashCallStack += "<offsetUnexpectedCharacter>" ;
@@ -1270,7 +1295,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
1270
1295
continue ; // unexpected
1271
1296
}
1272
1297
const pendingOffset : string = line . substring ( offsetPos2 , endPos ) ;
1273
- if ( ! pendingOffset . includes ( "/" ) && ! pendingOffset . includes ( "\\" ) && ! pendingOffset . includes ( "@" ) ) {
1298
+ if ( ! containsUnexpectedTelemetryCharacter ( pendingOffset ) ) {
1274
1299
crashCallStack += pendingOffset ;
1275
1300
} else {
1276
1301
crashCallStack += "<offsetUnexpectedCharacter>" ;
@@ -1282,7 +1307,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
1282
1307
prevCppCrashCallStackData = crashCallStack ;
1283
1308
1284
1309
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 } ` ) ;
1286
1311
}
1287
1312
}
1288
1313
@@ -1292,11 +1317,11 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
1292
1317
data = data . substring ( 0 , 8191 ) + "…" ;
1293
1318
}
1294
1319
1295
- if ( addressData . includes ( "/" ) || addressData . includes ( "\\" ) || addressData . includes ( "@" ) ) {
1320
+ if ( containsUnexpectedTelemetryCharacter ( addressData ) ) {
1296
1321
addressData = "<addressDataUnexpectedCharacter>" ;
1297
1322
}
1298
1323
1299
- logCppCrashTelemetry ( data , addressData ) ;
1324
+ logCppCrashTelemetry ( data , addressData , crashLog ) ;
1300
1325
1301
1326
await util . deleteFile ( path . resolve ( crashDirectory , crashFile ) ) . catch ( logAndReturn . undefined ) ;
1302
1327
if ( crashFile === "cpptools.txt" ) {
0 commit comments