From d704af2501168126f6979b2ac784d59d84b3fc98 Mon Sep 17 00:00:00 2001 From: WebFreak001 Date: Sun, 10 Jul 2016 16:34:12 +0200 Subject: [PATCH] Implemented stepping back & changing variables --- package.json | 11 +++++------ src/backend/backend.ts | 1 + src/backend/mi2/mi2.ts | 20 ++++++++++++-------- src/gdb.ts | 2 ++ src/mibase.ts | 19 +++++++++++++++++++ 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 1033ced..a45703e 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "publisher": "webfreak", "icon": "images/icon-plain.svg", "engines": { - "vscode": "^0.10.8" + "vscode": "^1.3.0" }, "categories": [ "Debuggers" @@ -463,12 +463,11 @@ "test": "node ./node_modules/vscode/bin/test" }, "dependencies": { - "vscode-debugadapter": "^1.7.0-pre.1", - "vscode-debugprotocol": "^1.7.0-pre.1", - "ssh2": "^0.4.13" + "vscode-debugadapter": "^1.10.0", + "vscode-debugprotocol": "^1.10.0", + "ssh2": "^0.5.0" }, "devDependencies": { - "typescript": "^1.7.5", - "vscode": "0.11.x" + "typescript": "^1.8.10" } } diff --git a/src/backend/backend.ts b/src/backend/backend.ts index 7df1175..532b6cb 100644 --- a/src/backend/backend.ts +++ b/src/backend/backend.ts @@ -49,4 +49,5 @@ export interface IBackend { getStackVariables(thread: number, frame: number): Thenable<[string, string][]>; evalExpression(name: string): Thenable; isReady(): boolean; + changeVariable(name: string, rawValue: string): Thenable; } \ No newline at end of file diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index 5b5d34e..f0343cc 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -387,38 +387,42 @@ export class MI2 extends EventEmitter implements IBackend { }); } - continue(): Thenable { + continue(reverse: boolean = false): Thenable { return new Promise((resolve, reject) => { - this.sendCommand("exec-continue").then((info) => { + this.sendCommand("exec-continue" + (reverse ? " --reverse" : "")).then((info) => { resolve(info.resultRecords.resultClass == "running"); }, reject); }); } - next(): Thenable { + next(reverse: boolean = false): Thenable { return new Promise((resolve, reject) => { - this.sendCommand("exec-next").then((info) => { + this.sendCommand("exec-next" + (reverse ? " --reverse" : "")).then((info) => { resolve(info.resultRecords.resultClass == "running"); }, reject); }); } - step(): Thenable { + step(reverse: boolean = false): Thenable { return new Promise((resolve, reject) => { - this.sendCommand("exec-step").then((info) => { + this.sendCommand("exec-step" + (reverse ? " --reverse" : "")).then((info) => { resolve(info.resultRecords.resultClass == "running"); }, reject); }); } - stepOut(): Thenable { + stepOut(reverse: boolean = false): Thenable { return new Promise((resolve, reject) => { - this.sendCommand("exec-finish").then((info) => { + this.sendCommand("exec-finish" + (reverse ? " --reverse" : "")).then((info) => { resolve(info.resultRecords.resultClass == "running"); }, reject); }); } + changeVariable(name: string, rawValue: string): Thenable { + return this.sendCommand("gdb-set var " + name + "=" + rawValue); + } + loadBreakPoints(breakpoints: Breakpoint[]): Thenable<[boolean, Breakpoint][]> { let promisses = []; breakpoints.forEach(breakpoint => { diff --git a/src/gdb.ts b/src/gdb.ts index b588234..c84616c 100644 --- a/src/gdb.ts +++ b/src/gdb.ts @@ -31,6 +31,8 @@ class GDBDebugSession extends MI2DebugSession { response.body.supportsConditionalBreakpoints = true; response.body.supportsFunctionBreakpoints = true; response.body.supportsEvaluateForHovers = true; + response.body.supportsSetVariable = true; + response.body.supportsStepBack = true; this.sendResponse(response); } diff --git a/src/mibase.ts b/src/mibase.ts index dab5036..ba745bc 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -81,6 +81,17 @@ export class MI2DebugSession extends DebugSession { this.sendResponse(response); } + protected setVariableRequest(response: DebugProtocol.SetVariableResponse, args: DebugProtocol.SetVariableArguments): void { + this.miDebugger.changeVariable(args.name, args.value).then(() => { + response.body = { + value: args.value + }; + this.sendResponse(response); + }, err => { + this.sendErrorResponse(response, 11, `Could not continue: ${err}`); + }); + } + protected setFunctionBreakPointsRequest(response: DebugProtocol.SetFunctionBreakpointsResponse, args: DebugProtocol.SetFunctionBreakpointsArguments): void { let cb = (() => { this.debugReady = true; @@ -290,6 +301,14 @@ export class MI2DebugSession extends DebugSession { }); } + protected stepBackRequest(response: DebugProtocol.StepBackResponse, args: DebugProtocol.StepBackArguments): void { + this.miDebugger.step(true).then(done => { + this.sendResponse(response); + }, msg => { + this.sendErrorResponse(response, 4, `Could not step back: ${msg} - Try running 'target record-full' before stepping back`); + }); + } + protected stepInRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { this.miDebugger.step().then(done => { this.sendResponse(response);