@@ -36,6 +36,7 @@ import * as mi from './mi';
36
36
37
37
export interface CmsisRequestArguments extends RequestArguments {
38
38
runToMain ?: boolean ;
39
+ gdbCore ?: number ;
39
40
gdbServer ?: string ;
40
41
gdbServerArguments ?: string [ ] ;
41
42
objdump ?: string ;
@@ -47,7 +48,7 @@ const STATIC_HANDLES_FINISH = 0x01FFFF;
47
48
48
49
export class CmsisDebugSession extends GDBDebugSession {
49
50
50
- protected gdbServer = new PyocdServer ( ) ;
51
+ protected gdbServer : PyocdServer | undefined ;
51
52
protected portScanner = new PortScanner ( ) ;
52
53
protected symbolTable ! : SymbolTable ;
53
54
protected globalHandle ! : number ;
@@ -200,27 +201,20 @@ export class CmsisDebugSession extends GDBDebugSession {
200
201
this . gdb . on ( 'execAsync' , ( resultClass , resultData ) => this . handleGDBAsync ( resultClass , resultData ) ) ;
201
202
this . gdb . on ( 'notifyAsync' , ( resultClass , resultData ) => this . handleGDBNotify ( resultClass , resultData ) ) ;
202
203
203
- // gdb server has main info channel on stderr
204
- this . gdbServer . on ( 'stderr' , data => this . sendEvent ( new OutputEvent ( data , 'stdout' ) ) ) ;
205
- this . gdbServer . on ( 'error' , message => {
206
- this . sendEvent ( new TerminatedEvent ( ) ) ;
207
- throw message ;
208
- } ) ;
209
-
204
+ // Load debug symbols
210
205
try {
211
206
this . symbolTable = new SymbolTable ( args . program , args . objdump ) ;
212
207
await this . symbolTable . loadSymbols ( ) ;
213
208
} catch ( error ) {
214
209
this . sendEvent ( new OutputEvent ( `Unable to load debug symbols: ${ error . message } ` ) ) ;
215
210
}
216
211
217
- const port = await this . portScanner . findFreePort ( ) ;
218
- if ( ! port ) {
212
+ // Determine free port for gdb server
213
+ const serverPort = await this . portScanner . findFreePort ( ) ;
214
+ if ( ! serverPort ) {
219
215
throw new Error ( 'Unable to find a free port to use for debugging' ) ;
220
216
}
221
- this . sendEvent ( new OutputEvent ( `Selected port ${ port } for debugging` ) ) ;
222
-
223
- const remote = `localhost:${ port } ` ;
217
+ this . sendEvent ( new OutputEvent ( `Selected port ${ serverPort } for debugging` ) ) ;
224
218
225
219
// Set gdb arguments
226
220
if ( ! args . gdbArguments ) {
@@ -232,18 +226,30 @@ export class CmsisDebugSession extends GDBDebugSession {
232
226
if ( ! args . gdbServerArguments ) {
233
227
args . gdbServerArguments = [ ] ;
234
228
}
235
- args . gdbServerArguments . push ( '--port' , port . toString ( ) ) ;
229
+ args . gdbServerArguments . push ( '--port' , serverPort . toString ( ) ) ;
230
+
231
+ // gdb server has main info channel on stderr
232
+ this . gdbServer = new PyocdServer ( args ) ;
233
+ this . gdbServer . on ( 'stderr' , data => this . sendEvent ( new OutputEvent ( data , 'stdout' ) ) ) ;
234
+ this . gdbServer . on ( 'error' , message => {
235
+ this . sendEvent ( new TerminatedEvent ( ) ) ;
236
+ throw message ;
237
+ } ) ;
236
238
237
- // Start gdb client and server
239
+ // Start gdb server and client
238
240
this . progressEvent ( 0 , 'Starting Debugger' ) ;
239
- await this . gdbServer . spawn ( args ) ;
241
+ await this . gdbServer . spawn ( ) ;
240
242
await this . spawn ( args ) ;
241
243
244
+ // Find correct debug client port
245
+ const clientPort = this . gdbServer . resolveGdbPort ( serverPort ) ;
246
+ const remote = `localhost:${ clientPort } ` ;
247
+
242
248
// Send commands
243
249
await mi . sendTargetAsyncOn ( this . gdb ) ;
244
250
await mi . sendTargetSelectRemote ( this . gdb , remote ) ;
245
251
await mi . sendMonitorResetHalt ( this . gdb ) ;
246
- this . sendEvent ( new OutputEvent ( `Attached to debugger on port ${ port } ` ) ) ;
252
+ this . sendEvent ( new OutputEvent ( `Attached to debugger on port ${ clientPort } ` ) ) ;
247
253
248
254
// Download image
249
255
const progressListener = ( percent : number ) => this . progressEvent ( percent , 'Loading Image' ) ;
@@ -365,7 +371,10 @@ export class CmsisDebugSession extends GDBDebugSession {
365
371
} catch ( e ) {
366
372
// Need to catch here in case the connection has already been closed
367
373
}
368
- this . gdbServer . kill ( ) ;
374
+
375
+ if ( this . gdbServer ) {
376
+ this . gdbServer . kill ( ) ;
377
+ }
369
378
}
370
379
371
380
public async shutdown ( ) {
0 commit comments