@@ -905,19 +905,32 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d
905905 binaryVersion = binaryVersionMatches && binaryVersionMatches . length > 1 ? binaryVersionMatches [ 1 ] : "" ;
906906 }
907907
908+ // Extract any message indicating missing dynamically loaded symbols.
909+ let dynamicLoadError : string = "" ;
910+ const dynamicLoadErrorStart : string = "Dyld Error Message:" ;
911+ const startDynamicLoadError : number = data . indexOf ( dynamicLoadErrorStart ) ;
912+ if ( startDynamicLoadError >= 0 ) {
913+ // Scan until the next blank line.
914+ const dynamicLoadErrorEnd : string = "\n\n" ;
915+ const endDynamicLoadError : number = data . indexOf ( dynamicLoadErrorEnd , startDynamicLoadError ) ;
916+ if ( endDynamicLoadError >= 0 ) {
917+ dynamicLoadError = data . substring ( startDynamicLoadError , endDynamicLoadError ) + "\n\n" ;
918+ }
919+ }
920+
908921 // Extract the crashing thread's call stack.
909922 const crashStart : string = " Crashed:" ;
910923 let startCrash : number = data . indexOf ( crashStart ) ;
911924 if ( startCrash < 0 ) {
912- return logMacCrashTelemetry ( "No crash start" ) ;
925+ return logMacCrashTelemetry ( dynamicLoadError + "No crash start" ) ;
913926 }
914927 startCrash += crashStart . length + 1 ; // Skip past crashStart.
915928 let endCrash : number = data . indexOf ( "Thread " , startCrash ) ;
916929 if ( endCrash < 0 ) {
917930 endCrash = data . length - 1 ; // Not expected, but just in case.
918931 }
919932 if ( endCrash <= startCrash ) {
920- return logMacCrashTelemetry ( "No crash end" ) ;
933+ return logMacCrashTelemetry ( dynamicLoadError + "No crash end" ) ;
921934 }
922935 data = data . substring ( startCrash , endCrash ) ;
923936
@@ -926,7 +939,10 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d
926939 data = data . replace ( / 0 x 1 ........ \+ 0 / g, "" ) ;
927940
928941 // Get rid of the process names on each line and just add it to the start.
929- const processNames : string [ ] = [ "cpptools-srv" , "cpptools-wordexp" , "cpptools" ] ;
942+ const processNames : string [ ] = [ "cpptools-srv" , "cpptools-wordexp" , "cpptools" ,
943+ // Since only crash logs that start with "cpptools" are reported, the cases below would only occur
944+ // if the crash were to happen before the new process had fully started and renamed itself.
945+ "clang-tidy" , "clang-format" , "clang" , "gcc" ] ;
930946 let processNameFound : boolean = false ;
931947 for ( const processName of processNames ) {
932948 if ( data . includes ( processName ) ) {
@@ -938,7 +954,8 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d
938954 }
939955 if ( ! processNameFound ) {
940956 // Not expected, but just in case a new binary gets added.
941- data = `cpptools???\t${ binaryVersion } \n${ data } ` ;
957+ // Warning: Don't use ??? because that is checked below.
958+ data = `cpptools??\t${ binaryVersion } \n${ data } ` ;
942959 }
943960
944961 // Remove runtime lines because they can be different on different machines.
@@ -953,6 +970,9 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d
953970 } ) ;
954971 data = data . trimRight ( ) ;
955972
973+ // Prepend the dynamic load error.
974+ data = dynamicLoadError + data ;
975+
956976 if ( data . length > 8192 ) { // The API has an 8k limit.
957977 data = data . substring ( 0 , 8189 ) + "..." ;
958978 }
0 commit comments