Implemented stepping back & changing variables

This commit is contained in:
WebFreak001 2016-07-10 16:34:12 +02:00
commit d704af2501
5 changed files with 39 additions and 14 deletions

View file

@ -6,7 +6,7 @@
"publisher": "webfreak", "publisher": "webfreak",
"icon": "images/icon-plain.svg", "icon": "images/icon-plain.svg",
"engines": { "engines": {
"vscode": "^0.10.8" "vscode": "^1.3.0"
}, },
"categories": [ "categories": [
"Debuggers" "Debuggers"
@ -463,12 +463,11 @@
"test": "node ./node_modules/vscode/bin/test" "test": "node ./node_modules/vscode/bin/test"
}, },
"dependencies": { "dependencies": {
"vscode-debugadapter": "^1.7.0-pre.1", "vscode-debugadapter": "^1.10.0",
"vscode-debugprotocol": "^1.7.0-pre.1", "vscode-debugprotocol": "^1.10.0",
"ssh2": "^0.4.13" "ssh2": "^0.5.0"
}, },
"devDependencies": { "devDependencies": {
"typescript": "^1.7.5", "typescript": "^1.8.10"
"vscode": "0.11.x"
} }
} }

View file

@ -49,4 +49,5 @@ export interface IBackend {
getStackVariables(thread: number, frame: number): Thenable<[string, string][]>; getStackVariables(thread: number, frame: number): Thenable<[string, string][]>;
evalExpression(name: string): Thenable<any>; evalExpression(name: string): Thenable<any>;
isReady(): boolean; isReady(): boolean;
changeVariable(name: string, rawValue: string): Thenable<any>;
} }

View file

@ -387,38 +387,42 @@ export class MI2 extends EventEmitter implements IBackend {
}); });
} }
continue(): Thenable<boolean> { continue(reverse: boolean = false): Thenable<boolean> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.sendCommand("exec-continue").then((info) => { this.sendCommand("exec-continue" + (reverse ? " --reverse" : "")).then((info) => {
resolve(info.resultRecords.resultClass == "running"); resolve(info.resultRecords.resultClass == "running");
}, reject); }, reject);
}); });
} }
next(): Thenable<boolean> { next(reverse: boolean = false): Thenable<boolean> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.sendCommand("exec-next").then((info) => { this.sendCommand("exec-next" + (reverse ? " --reverse" : "")).then((info) => {
resolve(info.resultRecords.resultClass == "running"); resolve(info.resultRecords.resultClass == "running");
}, reject); }, reject);
}); });
} }
step(): Thenable<boolean> { step(reverse: boolean = false): Thenable<boolean> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.sendCommand("exec-step").then((info) => { this.sendCommand("exec-step" + (reverse ? " --reverse" : "")).then((info) => {
resolve(info.resultRecords.resultClass == "running"); resolve(info.resultRecords.resultClass == "running");
}, reject); }, reject);
}); });
} }
stepOut(): Thenable<boolean> { stepOut(reverse: boolean = false): Thenable<boolean> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.sendCommand("exec-finish").then((info) => { this.sendCommand("exec-finish" + (reverse ? " --reverse" : "")).then((info) => {
resolve(info.resultRecords.resultClass == "running"); resolve(info.resultRecords.resultClass == "running");
}, reject); }, reject);
}); });
} }
changeVariable(name: string, rawValue: string): Thenable<any> {
return this.sendCommand("gdb-set var " + name + "=" + rawValue);
}
loadBreakPoints(breakpoints: Breakpoint[]): Thenable<[boolean, Breakpoint][]> { loadBreakPoints(breakpoints: Breakpoint[]): Thenable<[boolean, Breakpoint][]> {
let promisses = []; let promisses = [];
breakpoints.forEach(breakpoint => { breakpoints.forEach(breakpoint => {

View file

@ -31,6 +31,8 @@ class GDBDebugSession extends MI2DebugSession {
response.body.supportsConditionalBreakpoints = true; response.body.supportsConditionalBreakpoints = true;
response.body.supportsFunctionBreakpoints = true; response.body.supportsFunctionBreakpoints = true;
response.body.supportsEvaluateForHovers = true; response.body.supportsEvaluateForHovers = true;
response.body.supportsSetVariable = true;
response.body.supportsStepBack = true;
this.sendResponse(response); this.sendResponse(response);
} }

View file

@ -81,6 +81,17 @@ export class MI2DebugSession extends DebugSession {
this.sendResponse(response); 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 { protected setFunctionBreakPointsRequest(response: DebugProtocol.SetFunctionBreakpointsResponse, args: DebugProtocol.SetFunctionBreakpointsArguments): void {
let cb = (() => { let cb = (() => {
this.debugReady = true; 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 { protected stepInRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void {
this.miDebugger.step().then(done => { this.miDebugger.step().then(done => {
this.sendResponse(response); this.sendResponse(response);