@@ -106,7 +106,7 @@ function createSessionTerminatedPromise(sessionName: string): Promise<void> {
106106 } ) ;
107107}
108108
109- function createTracker ( debugType : string , sessionName : string , timeoutMs : number , timeoutMessage : string ) : TrackerController {
109+ function createTracker ( debugType : string , sessionName : string , programName : string , timeoutMs : number , timeoutMessage : string ) : TrackerController {
110110 const state : TrackerState = {
111111 setBreakpointsRequestReceived : false ,
112112 stoppedEventReceived : false ,
@@ -150,6 +150,34 @@ function createTracker(debugType: string, sessionName: string, timeoutMs: number
150150 resolve ( 'stopped' ) ;
151151 }
152152
153+ // integratedTerminal scenarios may not send an 'exited' event if the terminal does not support shell integration.
154+ // We have to close the terminal with the exit code to get the result.
155+ if ( message . event === 'terminated' && ! state . exitedEventReceived ) {
156+ state . exitedEventReceived = true ;
157+ const disp = vscode . window . onDidCloseTerminal ( ( terminal ) => {
158+ if ( terminal . name === programName ) {
159+ state . exitedEventReceived = true ;
160+ state . actualExitCode = terminal . exitStatus ?. code ;
161+ if ( ! state . stoppedEventReceived ) {
162+ state . exitedBeforeStop = true ;
163+ }
164+ if ( timeoutHandle ) {
165+ clearTimeout ( timeoutHandle ) ;
166+ timeoutHandle = undefined ;
167+ }
168+ disp . dispose ( ) ;
169+ resolve ( 'exited' ) ;
170+ }
171+ } ) ;
172+
173+ vscode . window . terminals . forEach ( ( terminal ) => {
174+ if ( terminal . name === programName ) {
175+ const exitCommand = isWindows ? 'exit /b %ErrorLevel%' : 'exit $?' ;
176+ terminal . sendText ( exitCommand ) ;
177+ }
178+ } ) ;
179+ }
180+
153181 if ( message . event === 'exited' ) {
154182 state . exitedEventReceived = true ;
155183 state . actualExitCode = message . body ?. exitCode ;
@@ -210,7 +238,7 @@ suite('Run Without Debugging Integration Test', function (): void {
210238 await compileProgram ( workspacePath , sourceFile , executablePath ) ;
211239
212240 const breakpoint = await createBreakpointAtReturnStatement ( sourceUri ) ;
213- const tracker = createTracker ( debugType , sessionName , 30000 , 'Timed out waiting for debugger event.' ) ;
241+ const tracker = createTracker ( debugType , sessionName , executablePath , 30000 , 'Timed out waiting for debugger event.' ) ;
214242 const debugSessionTerminated = createSessionTerminatedPromise ( sessionName ) ;
215243
216244 try {
@@ -259,7 +287,7 @@ suite('Run Without Debugging Integration Test', function (): void {
259287 const breakpoint = await createBreakpointAtReturnStatement ( sourceUri ) ;
260288
261289 let launchedSession : vscode . DebugSession | undefined ;
262- const tracker = createTracker ( debugType , sessionName , 45000 , 'Timed out waiting for debugger event in normal debug mode.' ) ;
290+ const tracker = createTracker ( debugType , sessionName , executablePath , 45000 , 'Timed out waiting for debugger event in normal debug mode.' ) ;
263291
264292 const startedSubscription = vscode . debug . onDidStartDebugSession ( ( session ) => {
265293 if ( session . name === sessionName ) {
0 commit comments