25
25
26
26
import { normalize } from 'path' ;
27
27
import { DebugProtocol } from 'vscode-debugprotocol' ;
28
- import { Logger , logger , InitializedEvent , OutputEvent , Scope , TerminatedEvent } from 'vscode-debugadapter' ;
28
+ import { Logger , logger , InitializedEvent , OutputEvent , Scope , TerminatedEvent , ErrorDestination } from 'vscode-debugadapter' ;
29
29
import { GDBDebugSession , RequestArguments , FrameVariableReference , FrameReference } from 'cdt-gdb-adapter/dist/GDBDebugSession' ;
30
30
import { GDBBackend } from 'cdt-gdb-adapter/dist/GDBBackend' ;
31
31
import { CmsisBackend } from './cmsis-backend' ;
@@ -117,7 +117,6 @@ export class CmsisDebugSession extends GDBDebugSession {
117
117
118
118
protected async setBreakPointsRequest ( response : DebugProtocol . SetBreakpointsResponse , args : DebugProtocol . SetBreakpointsArguments ) : Promise < void > {
119
119
await super . setBreakPointsRequest ( response , args ) ;
120
- return ;
121
120
}
122
121
123
122
protected scopesRequest ( response : DebugProtocol . ScopesResponse , args : DebugProtocol . ScopesArguments ) : void {
@@ -224,13 +223,10 @@ export class CmsisDebugSession extends GDBDebugSession {
224
223
this . gdb . on ( 'notifyAsync' , ( resultClass , resultData ) => this . handleGDBNotify ( resultClass , resultData ) ) ;
225
224
226
225
// gdb server has main info channel on stderr
227
- this . gdbServer . on ( 'stderr' , data => {
228
- this . sendEvent ( new OutputEvent ( data , 'stdout' ) )
229
- } ) ;
230
- this . gdbServer . on ( 'error' , message => {
231
- this . sendEvent ( new TerminatedEvent ( ) ) ;
232
- throw message ;
233
- } ) ;
226
+ this . gdbServer . on ( 'stderr' , data => this . sendEvent ( new OutputEvent ( data , 'stdout' ) ) ) ;
227
+ const gdbServerErrors : any [ ] = [ ]
228
+ const gdbServerErrorAccumulator = ( message : any ) => gdbServerErrors . push ( message ) ;
229
+ this . gdbServer . on ( 'error' , gdbServerErrorAccumulator ) ;
234
230
235
231
try {
236
232
this . symbolTable = new SymbolTable ( args . program , args . objdump ) ;
@@ -264,12 +260,18 @@ export class CmsisDebugSession extends GDBDebugSession {
264
260
this . sendEvent ( new OutputEvent ( `Starting debugger: ${ JSON . stringify ( args ) } ` ) ) ;
265
261
await this . gdbServer . spawn ( args ) ;
266
262
await this . spawn ( args ) ;
263
+ if ( gdbServerErrors . length > 0 ) {
264
+ throw new Error ( gdbServerErrors . join ( '\n' ) ) ;
265
+ }
267
266
268
267
// Send commands
269
268
await mi . sendTargetAsyncOn ( this . gdb ) ;
270
269
await mi . sendTargetSelectRemote ( this . gdb , remote ) ;
271
270
await mi . sendMonitorResetHalt ( this . gdb ) ;
272
271
this . sendEvent ( new OutputEvent ( `Attached to debugger on port ${ port } ` ) ) ;
272
+ if ( gdbServerErrors . length > 0 ) {
273
+ throw new Error ( gdbServerErrors . join ( '\n' ) ) ;
274
+ }
273
275
274
276
// Download image
275
277
const progressListener = ( percent : number ) => this . progressEvent ( percent , 'Loading Image' ) ;
@@ -287,8 +289,17 @@ export class CmsisDebugSession extends GDBDebugSession {
287
289
await mi . sendBreakOnFunction ( this . gdb ) ;
288
290
}
289
291
292
+ if ( gdbServerErrors . length > 0 ) {
293
+ throw new Error ( gdbServerErrors . join ( '\n' ) ) ;
294
+ }
290
295
this . sendEvent ( new OutputEvent ( `Image loaded: ${ args . program } ` ) ) ;
291
296
this . sendEvent ( new InitializedEvent ( ) ) ;
297
+
298
+ this . gdbServer . removeListener ( 'error' , gdbServerErrorAccumulator ) ;
299
+ this . gdbServer . on ( 'error' , message => {
300
+ logger . error ( JSON . stringify ( message ) ) ;
301
+ this . sendEvent ( new TerminatedEvent ( ) ) ;
302
+ } ) ;
292
303
}
293
304
294
305
private async getGlobalVariables ( frameHandle : number ) : Promise < DebugProtocol . Variable [ ] > {
@@ -378,6 +389,15 @@ export class CmsisDebugSession extends GDBDebugSession {
378
389
} ) ) ;
379
390
}
380
391
392
+ protected sendErrorResponse ( response : DebugProtocol . Response ,
393
+ codeOrMessage : number | DebugProtocol . Message , format ?: string ,
394
+ variables ?: any , dest ?: ErrorDestination ) : void {
395
+ if ( ! ! format && ( dest === undefined || dest === ErrorDestination . User ) ) {
396
+ format = format . replace ( '\n' , '<br>' ) ;
397
+ }
398
+ super . sendErrorResponse ( response , codeOrMessage , format , variables , dest ) ;
399
+ }
400
+
381
401
protected async stopSession ( ) {
382
402
// Pause debugging
383
403
if ( this . isRunning ) {
0 commit comments