Skip to content

Commit ea5f528

Browse files
Christian Weichelspoenemann
Christian Weichel
authored andcommitted
Actual debugging works
1 parent 3d6d2ce commit ea5f528

File tree

6 files changed

+52
-41
lines changed

6 files changed

+52
-41
lines changed

arduino-debugger-extension/src/node/arduino-debug-adapter-contribution.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,15 @@ export class ArduinoDebugAdapterContribution implements DebugAdapterContribution
2727
"description": "Path to the program to be launched",
2828
"default": "${workspaceFolder}/${command:askProgramPath}"
2929
},
30-
"arguments": {
30+
"sketch": {
3131
"type": "string",
32-
"description": "Arguments for the program"
32+
"description": "Path to the sketch folder",
33+
"default": "${workspaceFolder}"
34+
},
35+
"fbqn": {
36+
"type": "string",
37+
"description": "Fully qualified board name of the debugging target",
38+
"default": "unknown"
3339
},
3440
"runToMain": {
3541
"description": "If enabled the debugger will run until the start of the main function.",
@@ -75,7 +81,7 @@ export class ArduinoDebugAdapterContribution implements DebugAdapterContribution
7581
"type": "boolean",
7682
"description": "Start the debug adapter in debug mode (with --inspect-brk)",
7783
"default": "false"
78-
}
84+
},
7985
}
8086
}
8187
]
@@ -85,7 +91,7 @@ export class ArduinoDebugAdapterContribution implements DebugAdapterContribution
8591
return []
8692
}
8793

88-
provideDebugAdapterExecutable?(config: DebugConfiguration): MaybePromise<DebugAdapterExecutable> {
94+
provideDebugAdapterExecutable(config: DebugConfiguration): MaybePromise<DebugAdapterExecutable> {
8995
let args: string[] = [];
9096
if (!!config.debugDebugAdapter) {
9197
args.push('--inspect-brk')

arduino-debugger-extension/src/node/debug-adapter/abstract-server.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import { CmsisRequestArguments } from './cmsis-debug-session';
3333
const TIMEOUT = 1000 * 10; // 10 seconds
3434

3535
export abstract class AbstractServer extends EventEmitter {
36-
3736
protected process?: ChildProcess;
3837
protected outBuffer: string = '';
3938
protected errBuffer: string = '';
@@ -50,7 +49,7 @@ export abstract class AbstractServer extends EventEmitter {
5049
this.timer = setTimeout(() => this.onSpawnError(new Error('Timeout waiting for gdb server to start')), TIMEOUT);
5150

5251
const command = args.gdbServer || 'gdb-server';
53-
const serverArguments = await this.resolveServerArguments(args.gdbServerArguments);
52+
const serverArguments = await this.resolveServerArguments(args);
5453
this.process = spawn(command, serverArguments, {
5554
cwd: dirname(command),
5655
});
@@ -80,8 +79,8 @@ export abstract class AbstractServer extends EventEmitter {
8079
}
8180
}
8281

83-
protected async resolveServerArguments(serverArguments?: string[]): Promise<string[]> {
84-
return serverArguments || [];
82+
protected async resolveServerArguments(req: CmsisRequestArguments): Promise<string[]> {
83+
return req.gdbServerArguments || [];
8584
}
8685

8786
protected onExit(code: number, signal: string) {

arduino-debugger-extension/src/node/debug-adapter/cmsis-debug-session.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,18 @@ import { Logger, logger, InitializedEvent, OutputEvent, Scope, TerminatedEvent }
2929
import { GDBDebugSession, RequestArguments, FrameVariableReference, FrameReference, ObjectVariableReference } from 'cdt-gdb-adapter/dist/GDBDebugSession';
3030
import { GDBBackend } from 'cdt-gdb-adapter/dist/GDBBackend';
3131
import { CmsisBackend } from './cmsis-backend';
32-
import { PyocdServer } from './pyocd-server';
32+
// import { PyocdServer } from './pyocd-server';
3333
import { PortScanner } from './port-scanner';
3434
import { SymbolTable } from './symbols';
3535
import * as varMgr from 'cdt-gdb-adapter/dist/varManager';
3636
import * as mi from './mi';
37+
import { OpenocdServer } from './openocd-server';
3738

3839
export interface CmsisRequestArguments extends RequestArguments {
3940
runToMain?: boolean;
4041
gdbServer?: string;
4142
gdbServerArguments?: string[];
43+
gdbServerPort?: number;
4244
objdump?: string;
4345
}
4446

@@ -48,7 +50,7 @@ const STATIC_HANDLES_FINISH = 0x01FFFF;
4850

4951
export class CmsisDebugSession extends GDBDebugSession {
5052

51-
protected gdbServer = new PyocdServer();
53+
protected gdbServer = new OpenocdServer();
5254
protected portScanner = new PortScanner();
5355
protected symbolTable!: SymbolTable;
5456
protected globalHandle!: number;
@@ -110,6 +112,11 @@ export class CmsisDebugSession extends GDBDebugSession {
110112
}
111113
}
112114

115+
protected async setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments): Promise<void> {
116+
await super.setBreakPointsRequest(response, args);
117+
return;
118+
}
119+
113120
protected scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments): void {
114121
try {
115122
const frame: FrameVariableReference = {
@@ -245,10 +252,11 @@ export class CmsisDebugSession extends GDBDebugSession {
245252
if (!args.gdbServerArguments) {
246253
args.gdbServerArguments = [];
247254
}
248-
args.gdbServerArguments.push('--port', port.toString());
255+
args.gdbServerPort = port;
249256

250257
// Start gdb client and server
251258
this.progressEvent(0, 'Starting Debugger');
259+
this.sendEvent(new OutputEvent(`Starting debugger: ${JSON.stringify(args)}`));
252260
await this.gdbServer.spawn(args);
253261
await this.spawn(args);
254262

arduino-debugger-extension/src/node/debug-adapter/mi.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ export function sendTargetSelectRemote(gdb: GDBBackend, remote: string) {
4242
}
4343

4444
export function sendTargetDownload(gdb: GDBBackend) {
45-
const command = '-target-download';
46-
return gdb.sendCommand(command);
45+
// const command = '-target-download';
46+
// return gdb.sendCommand(command);
4747
}
4848

4949
export function sendBreakOnFunction(gdb: GDBBackend, fn: string = 'main') {

arduino-debugger-extension/src/node/debug-adapter/openocd-server.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
11
import { AbstractServer } from './abstract-server';
22
import { PortScanner } from './port-scanner';
3+
import { CmsisRequestArguments } from './cmsis-debug-session';
4+
import * as fs from 'fs-extra';
5+
import * as path from 'path';
36

47
const LAUNCH_REGEX = /GDB server started/;
58
const ERROR_REGEX = /:ERROR:gdbserver:/;
69
const PERCENT_MULTIPLIER = 100 / 40; // pyOCD outputs 40 markers for progress
710

811
export class OpenocdServer extends AbstractServer {
9-
1012
protected portScanner = new PortScanner();
1113
protected progress = 0;
1214

13-
protected async resolveServerArguments(serverArguments?: string[]): Promise<string[]> {
14-
if (!serverArguments) {
15-
serverArguments = [];
16-
}
17-
15+
protected async resolveServerArguments(req: CmsisRequestArguments): Promise<string[]> {
16+
let sessionConfigFile = `gdb_port ${req.gdbServerPort!}${"\n"}`;
1817
const telnetPort = await this.portScanner.findFreePort(4444);
19-
20-
if (!telnetPort) {
21-
return serverArguments;
18+
if (!!telnetPort) {
19+
sessionConfigFile += `telnet_port ${telnetPort}${"\n"}`
2220
}
23-
24-
return [
25-
...serverArguments,
26-
'--telnet-port',
27-
telnetPort.toString()
28-
];
21+
sessionConfigFile += `echo "GDB server started"${"\n"}`
22+
23+
const tmpdir = await fs.mkdtemp("arduino-debugger");
24+
const sessionCfgPath = path.join(tmpdir, "gdb.cfg");
25+
await fs.writeFile(sessionCfgPath, sessionConfigFile);
26+
27+
let serverArguments = req.gdbServerArguments || [];
28+
serverArguments.push("--file", sessionCfgPath);
29+
30+
return serverArguments;
2931
}
3032

3133
protected onStdout(chunk: string | Buffer) {

arduino-debugger-extension/src/node/debug-adapter/pyocd-server.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import { AbstractServer } from './abstract-server';
2727
import { PortScanner } from './port-scanner';
28+
import { CmsisRequestArguments } from './cmsis-debug-session';
2829

2930
const LAUNCH_REGEX = /GDB server started/;
3031
const ERROR_REGEX = /:ERROR:gdbserver:/;
@@ -35,22 +36,17 @@ export class PyocdServer extends AbstractServer {
3536
protected portScanner = new PortScanner();
3637
protected progress = 0;
3738

38-
protected async resolveServerArguments(serverArguments?: string[]): Promise<string[]> {
39-
if (!serverArguments) {
40-
serverArguments = [];
41-
}
39+
protected async resolveServerArguments(req: CmsisRequestArguments): Promise<string[]> {
40+
let serverArguments = req.gdbServerArguments || [];
41+
42+
serverArguments.push('--port', req.gdbServerPort!.toString())
4243

4344
const telnetPort = await this.portScanner.findFreePort(4444);
44-
45-
if (!telnetPort) {
46-
return serverArguments;
45+
if (!!telnetPort) {
46+
serverArguments.push('--telnet-port', telnetPort.toString())
4747
}
48-
49-
return [
50-
...serverArguments,
51-
'--telnet-port',
52-
telnetPort.toString()
53-
];
48+
49+
return serverArguments;
5450
}
5551

5652
protected onStdout(chunk: string | Buffer) {

0 commit comments

Comments
 (0)