@@ -1048,13 +1048,16 @@ export function watchForCrashes(crashDirectory: string): void {
10481048let previousCrashData : string ;
10491049let 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
10721075function 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+
11701177async 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