From d559072646d27418211a7e1d0605940ef4ec7581 Mon Sep 17 00:00:00 2001 From: Simon Sobisch Date: Wed, 7 Feb 2024 08:57:29 +0000 Subject: [PATCH 01/22] check for configured debugger before start to provide a nicer error message --- CHANGELOG.md | 7 +++++++ src/gdb.ts | 14 ++++++++++++-- src/lldb.ts | 14 ++++++++++++-- src/mago.ts | 14 ++++++++++++-- src/mibase.ts | 20 ++++++++++++++++---- 5 files changed, 59 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab0c2613..6e858b26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,13 @@ Versioning]. [keep a changelog]: https://keepachangelog.com/en/1.0.0 [semantic versioning]: https://semver.org/spec/v2.0.0.html +## Unreleased + +### Added + +- check for configured debugger before start to provide a nicer error message + ([@GitMensch]) + ## [0.27.0] - 2024-02-07 ### Added diff --git a/src/gdb.ts b/src/gdb.ts index 3c0357bf..642ca97d 100644 --- a/src/gdb.ts +++ b/src/gdb.ts @@ -53,7 +53,12 @@ class GDBDebugSession extends MI2DebugSession { } protected launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { - this.miDebugger = new MI2(args.gdbpath || "gdb", ["-q", "--interpreter=mi2"], args.debugger_args, args.env); + const dbgCommand = args.gdbpath || "gdb"; + if (this.checkCommand(dbgCommand)) { + this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); + return; + } + this.miDebugger = new MI2(dbgCommand, ["-q", "--interpreter=mi2"], args.debugger_args, args.env); this.setPathSubstitutions(args.pathSubstitutions); this.initDebugger(); this.quit = false; @@ -94,7 +99,12 @@ class GDBDebugSession extends MI2DebugSession { } protected attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { - this.miDebugger = new MI2(args.gdbpath || "gdb", ["-q", "--interpreter=mi2"], args.debugger_args, args.env); + const dbgCommand = args.gdbpath || "gdb"; + if (this.checkCommand(dbgCommand)) { + this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); + return; + } + this.miDebugger = new MI2(dbgCommand, ["-q", "--interpreter=mi2"], args.debugger_args, args.env); this.setPathSubstitutions(args.pathSubstitutions); this.initDebugger(); this.quit = false; diff --git a/src/lldb.ts b/src/lldb.ts index 79b7e709..49fa0215 100644 --- a/src/lldb.ts +++ b/src/lldb.ts @@ -48,7 +48,12 @@ class LLDBDebugSession extends MI2DebugSession { } protected launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { - this.miDebugger = new MI2_LLDB(args.lldbmipath || "lldb-mi", [], args.debugger_args, args.env); + const dbgCommand = args.lldbmipath || "lldb-mi"; + if (this.checkCommand(dbgCommand)) { + this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); + return; + } + this.miDebugger = new MI2_LLDB(dbgCommand, [], args.debugger_args, args.env); this.setPathSubstitutions(args.pathSubstitutions); this.initDebugger(); this.quit = false; @@ -89,7 +94,12 @@ class LLDBDebugSession extends MI2DebugSession { } protected attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { - this.miDebugger = new MI2_LLDB(args.lldbmipath || "lldb-mi", [], args.debugger_args, args.env); + const dbgCommand = args.lldbmipath || "lldb-mi"; + if (this.checkCommand(dbgCommand)) { + this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); + return; + } + this.miDebugger = new MI2_LLDB(dbgCommand, [], args.debugger_args, args.env); this.setPathSubstitutions(args.pathSubstitutions); this.initDebugger(); this.quit = false; diff --git a/src/mago.ts b/src/mago.ts index d9d8fd0d..09345c7d 100644 --- a/src/mago.ts +++ b/src/mago.ts @@ -50,7 +50,12 @@ class MagoDebugSession extends MI2DebugSession { } protected launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { - this.miDebugger = new MI2_Mago(args.magomipath || "mago-mi", ["-q"], args.debugger_args, args.env); + const dbgCommand = args.magomipath || "mago-mi"; + if (this.checkCommand(dbgCommand)) { + this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); + return; + } + this.miDebugger = new MI2_Mago(dbgCommand, ["-q"], args.debugger_args, args.env); this.initDebugger(); this.quit = false; this.attached = false; @@ -69,7 +74,12 @@ class MagoDebugSession extends MI2DebugSession { } protected attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { - this.miDebugger = new MI2_Mago(args.magomipath || "mago-mi", [], args.debugger_args, args.env); + const dbgCommand = args.magomipath || "mago-mi"; + if (this.checkCommand(dbgCommand)) { + this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); + return; + } + this.miDebugger = new MI2_Mago(dbgCommand, ["-q"], args.debugger_args, args.env); this.initDebugger(); this.quit = false; this.attached = true; diff --git a/src/mibase.ts b/src/mibase.ts index 55cfca01..a3230068 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -5,6 +5,7 @@ import { Breakpoint, IBackend, Variable, VariableObject, ValuesFormattingMode, M import { MINode } from './backend/mi_parse'; import { expandValue, isExpandable } from './backend/gdb_expansion'; import { MI2 } from './backend/mi2/mi2'; +import { execSync } from 'child_process'; import * as systemPath from "path"; import * as net from "net"; import * as os from "os"; @@ -17,10 +18,10 @@ class ExtendedVariable { } class VariableScope { - constructor (public readonly name: string, public readonly threadId: number, public readonly level: number) { + constructor(public readonly name: string, public readonly threadId: number, public readonly level: number) { } - public static variableName (handle: number, name: string): string { + public static variableName(handle: number, name: string): string { return `var_${handle}_${name}`; } } @@ -92,6 +93,17 @@ export class MI2DebugSession extends DebugSession { } } + // verifies that the specified command can be executed + protected checkCommand(debuggerName: string): boolean { + try { + const command = process.platform === 'win32' ? 'where' : 'command -v'; + execSync(`${command} ${scriptName}`, { stdio: 'ignore' }); + return true; + } catch (error) { + return false; + } + } + protected setValuesFormattingMode(mode: ValuesFormattingMode) { switch (mode) { case "disabled": @@ -728,7 +740,7 @@ export class MI2DebugSession extends DebugSession { id: 1, label: args.source.name, column: args.column, - line : args.line + line: args.line }] }; this.sendResponse(response); @@ -743,7 +755,7 @@ export class MI2DebugSession extends DebugSession { protected setSourceFileMap(configMap: { [index: string]: string }, fallbackGDB: string, fallbackIDE: string): void { if (configMap === undefined) { - this.sourceFileMap = new SourceFileMap({[fallbackGDB]: fallbackIDE}); + this.sourceFileMap = new SourceFileMap({ [fallbackGDB]: fallbackIDE }); } else { this.sourceFileMap = new SourceFileMap(configMap, fallbackGDB); } From 8c926ca1c3d2d4f397cb817cec4d367648e98af9 Mon Sep 17 00:00:00 2001 From: Simon Sobisch Date: Wed, 7 Feb 2024 13:13:49 +0000 Subject: [PATCH 02/22] docs: minor changelog update --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e858b26..efb978f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ Versioning]. - Added registers view ([@nomtats]) #242 - Enabled breakpoints inside `riscv` files ([@William-An]) #404 +[0.27.0]: https://github.com/WebFreak001/code-debug/compare/v0.26.1...v0.27.0 + ## [0.26.1] - 2022-12-31 ### Fixed From 277d4bf94de4b3fee62271d5f38e3c403b9234a6 Mon Sep 17 00:00:00 2001 From: Simon Sobisch Date: Wed, 7 Feb 2024 13:20:55 +0000 Subject: [PATCH 03/22] fix rebase for startup warning d559072646d27418211a7e1d0605940ef4ec7581 contained an error --- package.json | 2 +- src/mibase.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1ddc57e2..23728b7f 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "debug" ], "license": "public domain", - "version": "0.27.0", + "version": "0.27.1", "publisher": "webfreak", "icon": "images/icon.png", "engines": { diff --git a/src/mibase.ts b/src/mibase.ts index a3230068..152e7875 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -97,7 +97,7 @@ export class MI2DebugSession extends DebugSession { protected checkCommand(debuggerName: string): boolean { try { const command = process.platform === 'win32' ? 'where' : 'command -v'; - execSync(`${command} ${scriptName}`, { stdio: 'ignore' }); + execSync(`${command} ${debuggerName}`, { stdio: 'ignore' }); return true; } catch (error) { return false; From a6f48d656c33a848430a5c54ba8d9b69a3fa5553 Mon Sep 17 00:00:00 2001 From: WebFreak001 Date: Thu, 8 Feb 2024 03:36:34 +0100 Subject: [PATCH 04/22] fix annoying CI step --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efb978f0..27e01e4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -254,7 +254,7 @@ Versioning]. [@reznikmm]: https://github.com/reznikmm [@simark]: https://github.com/simark [@webfreak001]: https://github.com/WebFreak001 -[@William-An]: https://github.com/William-An +[@william-an]: https://github.com/William-An [@yanpas]: https://github.com/Yanpas From be19c277870e04469347bc2f7032af9dd2daf580 Mon Sep 17 00:00:00 2001 From: oltolm Date: Thu, 7 Mar 2024 20:59:02 +0100 Subject: [PATCH 05/22] fixes: set "default" to "prettyPrinters", read thread names, fix variable creation --- package.json | 2 +- src/backend/mi2/mi2.ts | 14 ++++++++------ src/mibase.ts | 8 ++++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 23728b7f..70e6f0b4 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,7 @@ "valuesFormatting": { "type": "string", "description": "Set the way of showing variable values. 'disabled' - show value as is, 'parseText' - parse debuggers output text into structure, 'prettyPrinters' - enable debuggers custom pretty-printers if there are any", - "default": "parseText", + "default": "prettyPrinters", "enum": [ "disabled", "parseText", diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index e6411609..7f2b81e7 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -678,12 +678,10 @@ export class MI2 extends EventEmitter implements IBackend { return threads.map(element => { const ret: Thread = { id: parseInt(MINode.valueOf(element, "id")), - targetId: MINode.valueOf(element, "target-id") + targetId: MINode.valueOf(element, "target-id"), + name: MINode.valueOf(element, "name") || MINode.valueOf(element, "details") }; - ret.name = MINode.valueOf(element, "details") - || undefined; - return ret; }); } @@ -832,10 +830,14 @@ export class MI2 extends EventEmitter implements IBackend { return await this.sendCommand(command); } - async varCreate(expression: string, name: string = "-", frame: string = "@"): Promise { + async varCreate(threadId: number, frameLevel: number, expression: string, name: string = "-", frame: string = "@"): Promise { if (trace) this.log("stderr", "varCreate"); - const res = await this.sendCommand(`var-create ${this.quote(name)} ${frame} "${expression}"`); + let miCommand = "var-create "; + if (threadId != 0) { + miCommand += `--thread ${threadId} --frame ${frameLevel}` + } + const res = await this.sendCommand(`${miCommand} ${this.quote(name)} ${frame} "${expression}"`); return new VariableObject(res.result("")); } diff --git a/src/mibase.ts b/src/mibase.ts index 152e7875..9a273e8a 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -283,7 +283,11 @@ export class MI2DebugSession extends DebugSession { response.body.threads.push(new Thread(thread.id, thread.id + ":" + threadName)); } this.sendResponse(response); - }).catch(error => { + }).catch((error: MIError) => { + if (error.message === 'Selected thread is running.') { + console.error(error); + return; + } this.sendErrorResponse(response, 17, `Could not get threads: ${error}`); }); } @@ -479,7 +483,7 @@ export class MI2DebugSession extends DebugSession { varObj = this.variableHandles.get(varId) as any; } catch (err) { if (err instanceof MIError && err.message == "Variable object not found") { - varObj = await this.miDebugger.varCreate(variable.name, varObjName); + varObj = await this.miDebugger.varCreate(id.threadId, id.level, variable.name, varObjName); const varId = findOrCreateVariable(varObj); varObj.exp = variable.name; varObj.id = varId; From daadc3af2b60ea9ce5416cde33b967b9267ff775 Mon Sep 17 00:00:00 2001 From: oltolm Date: Thu, 7 Mar 2024 20:59:37 +0100 Subject: [PATCH 06/22] small cleanup --- src/backend/backend.ts | 26 +++++++++++--------------- src/backend/mi2/mi2.ts | 26 +++++++++++++------------- src/backend/mi2/mi2lldb.ts | 8 ++++---- 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/backend/backend.ts b/src/backend/backend.ts index d47f89b3..747c0188 100644 --- a/src/backend/backend.ts +++ b/src/backend/backend.ts @@ -141,29 +141,25 @@ export interface MIError extends Error { readonly source: string; } export interface MIErrorConstructor { - new (message: string, source: string): MIError; + new(message: string, source: string): MIError; readonly prototype: MIError; } -export const MIError: MIErrorConstructor = class MIError { - readonly name: string; - readonly message: string; - readonly source: string; +export const MIError: MIErrorConstructor = class MIError { + private readonly _message: string; + private readonly _source: string; public constructor(message: string, source: string) { - Object.defineProperty(this, 'name', { - get: () => (this.constructor as any).name, - }); - Object.defineProperty(this, 'message', { - get: () => message, - }); - Object.defineProperty(this, 'source', { - get: () => source, - }); + this._message = message; + this._source = source; Error.captureStackTrace(this, this.constructor); } + get name() { return this.constructor.name; } + get message() { return this._message; } + get source() { return this._source; } + public toString() { - return `${this.message} (from ${this.source})`; + return `${this.message} (from ${this._source})`; } }; Object.setPrototypeOf(MIError as any, Object.create(Error.prototype)); diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index 7f2b81e7..fe55b09a 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -314,14 +314,14 @@ export class MI2 extends EventEmitter implements IBackend { } } - onOutputStderr(lines) { - lines = lines.split('\n'); + onOutputStderr(str: string) { + let lines = str.split('\n'); lines.forEach(line => { this.log("stderr", line); }); } - onOutputPartial(line) { + onOutputPartial(line: string) { if (couldBeOutput(line)) { this.logNoNewLine("stdout", line); return true; @@ -329,8 +329,8 @@ export class MI2 extends EventEmitter implements IBackend { return false; } - onOutput(lines) { - lines = lines.split('\n'); + onOutput(str: string) { + let lines = str.split('\n'); lines.forEach(line => { if (couldBeOutput(line)) { if (!gdbMatch.exec(line)) @@ -391,13 +391,13 @@ export class MI2 extends EventEmitter implements IBackend { case "solib-event": case "syscall-entry": case "syscall-return": - // TODO: inform the user + // TODO: inform the user this.emit("step-end", parsed); break; case "fork": case "vfork": case "exec": - // TODO: inform the user, possibly add second inferior + // TODO: inform the user, possibly add second inferior this.emit("step-end", parsed); break; case "signal-received": @@ -410,10 +410,10 @@ export class MI2 extends EventEmitter implements IBackend { this.log("stderr", "Program exited with code " + parsed.record("exit-code")); this.emit("exited-normally", parsed); break; - // case "exited-signalled": // consider handling that explicit possible - // this.log("stderr", "Program exited because of signal " + parsed.record("signal")); - // this.emit("stopped", parsed); - // break; + // case "exited-signalled": // consider handling that explicit possible + // this.log("stderr", "Program exited because of signal " + parsed.record("signal")); + // this.emit("stopped", parsed); + // break; default: this.log("console", "Not implemented stop reason (assuming exception): " + reason); @@ -570,7 +570,7 @@ export class MI2 extends EventEmitter implements IBackend { return Promise.all(promisses); } - setBreakPointCondition(bkptNum, condition): Thenable { + setBreakPointCondition(bkptNum: number, condition: string): Thenable { if (trace) this.log("stderr", "setBreakPointCondition"); return this.sendCommand("break-condition " + bkptNum + " " + condition); @@ -802,7 +802,7 @@ export class MI2 extends EventEmitter implements IBackend { const ret: RegisterValue[] = nodes.map(node => { const index = parseInt(MINode.valueOf(node, "number")); const value = MINode.valueOf(node, "value"); - return {index: index, value: value}; + return { index: index, value: value }; }); return ret; } diff --git a/src/backend/mi2/mi2lldb.ts b/src/backend/mi2/mi2lldb.ts index 44999144..e04f118c 100644 --- a/src/backend/mi2/mi2lldb.ts +++ b/src/backend/mi2/mi2lldb.ts @@ -4,7 +4,7 @@ import * as ChildProcess from "child_process"; import * as path from "path"; export class MI2_LLDB extends MI2 { - protected initCommands(target: string, cwd: string, attach: boolean = false) { + protected override initCommands(target: string, cwd: string, attach: boolean = false) { // We need to account for the possibility of the path type used by the debugger being different // than the path type where the extension is running (e.g., SSH from Linux to Windows machine). // Since the CWD is expected to be an absolute path in the debugger's environment, we can test @@ -35,7 +35,7 @@ export class MI2_LLDB extends MI2 { return cmds; } - attach(cwd: string, executable: string, target: string, autorun: string[]): Thenable { + override attach(cwd: string, executable: string, target: string, autorun: string[]): Thenable { return new Promise((resolve, reject) => { const args = this.preargs.concat(this.extraargs || []); this.process = ChildProcess.spawn(this.application, args, { cwd: cwd, env: this.procEnv }); @@ -54,11 +54,11 @@ export class MI2_LLDB extends MI2 { }); } - setBreakPointCondition(bkptNum, condition): Thenable { + override setBreakPointCondition(bkptNum: number, condition: string): Thenable { return this.sendCommand("break-condition " + bkptNum + " \"" + escape(condition) + "\" 1"); } - goto(filename: string, line: number): Thenable { + override goto(filename: string, line: number): Thenable { return new Promise((resolve, reject) => { // LLDB parses the file differently than GDB... // GDB doesn't allow quoting only the file but only the whole argument From 05499b96ae489111f266b95a61bbfc317f10445a Mon Sep 17 00:00:00 2001 From: oltolm Date: Thu, 7 Mar 2024 23:37:01 +0100 Subject: [PATCH 07/22] fix problems found in review --- src/backend/mi2/mi2.ts | 6 +++--- src/mibase.ts | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index fe55b09a..9980557a 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -315,7 +315,7 @@ export class MI2 extends EventEmitter implements IBackend { } onOutputStderr(str: string) { - let lines = str.split('\n'); + const lines = str.split('\n'); lines.forEach(line => { this.log("stderr", line); }); @@ -330,7 +330,7 @@ export class MI2 extends EventEmitter implements IBackend { } onOutput(str: string) { - let lines = str.split('\n'); + const lines = str.split('\n'); lines.forEach(line => { if (couldBeOutput(line)) { if (!gdbMatch.exec(line)) @@ -835,7 +835,7 @@ export class MI2 extends EventEmitter implements IBackend { this.log("stderr", "varCreate"); let miCommand = "var-create "; if (threadId != 0) { - miCommand += `--thread ${threadId} --frame ${frameLevel}` + miCommand += `--thread ${threadId} --frame ${frameLevel}`; } const res = await this.sendCommand(`${miCommand} ${this.quote(name)} ${frame} "${expression}"`); return new VariableObject(res.result("")); diff --git a/src/mibase.ts b/src/mibase.ts index 9a273e8a..159574bf 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -285,7 +285,8 @@ export class MI2DebugSession extends DebugSession { this.sendResponse(response); }).catch((error: MIError) => { if (error.message === 'Selected thread is running.') { - console.error(error); + console.error(error.message); + this.sendResponse(response); return; } this.sendErrorResponse(response, 17, `Could not get threads: ${error}`); From 04068e9ca5477adfa06118d5fe37c39ca11447ad Mon Sep 17 00:00:00 2001 From: oltolm Date: Mon, 11 Mar 2024 20:10:19 +0100 Subject: [PATCH 08/22] fix linting problems --- package-lock.json | 18 +++++++++--------- package.json | 2 +- src/backend/mi2/mi2.ts | 8 ++++---- src/mibase.ts | 1 - 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68d7bce7..b0b94fcd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "debug", - "version": "0.27.0", + "version": "0.27.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "debug", - "version": "0.27.0", + "version": "0.27.1", "license": "public domain", "dependencies": { "ssh2": "^1.6.0", @@ -30,7 +30,7 @@ "nyc": "^15.1.0", "prettier": "^2.6.2", "ts-node": "^10.8.0", - "typescript": "^3.9.3" + "typescript": "^4.3.2" }, "engines": { "vscode": "^1.55.0" @@ -5343,9 +5343,9 @@ } }, "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", + "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -9643,9 +9643,9 @@ } }, "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", + "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", "dev": true }, "uc.micro": { diff --git a/package.json b/package.json index 70e6f0b4..a57ce891 100644 --- a/package.json +++ b/package.json @@ -1125,7 +1125,7 @@ "nyc": "^15.1.0", "prettier": "^2.6.2", "ts-node": "^10.8.0", - "typescript": "^3.9.3" + "typescript": "^4.3.2" }, "__metadata": { "id": "2fd22b8e-b3b8-4e7f-9a28-a5e2d1bdd0d4", diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index 9980557a..3d9a4459 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -410,10 +410,10 @@ export class MI2 extends EventEmitter implements IBackend { this.log("stderr", "Program exited with code " + parsed.record("exit-code")); this.emit("exited-normally", parsed); break; - // case "exited-signalled": // consider handling that explicit possible - // this.log("stderr", "Program exited because of signal " + parsed.record("signal")); - // this.emit("stopped", parsed); - // break; + // case "exited-signalled": // consider handling that explicit possible + // this.log("stderr", "Program exited because of signal " + parsed.record("signal")); + // this.emit("stopped", parsed); + // break; default: this.log("console", "Not implemented stop reason (assuming exception): " + reason); diff --git a/src/mibase.ts b/src/mibase.ts index 159574bf..278acce5 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -285,7 +285,6 @@ export class MI2DebugSession extends DebugSession { this.sendResponse(response); }).catch((error: MIError) => { if (error.message === 'Selected thread is running.') { - console.error(error.message); this.sendResponse(response); return; } From 6942703999afe995cf4c82c7d497200ab99ba66c Mon Sep 17 00:00:00 2001 From: oltolm Date: Wed, 13 Mar 2024 18:00:03 +0100 Subject: [PATCH 09/22] add "override" to methods --- src/backend/mi2/mi2mago.ts | 2 +- src/gdb.ts | 6 +++--- src/lldb.ts | 6 +++--- src/mago.ts | 6 +++--- src/mibase.ts | 38 +++++++++++++++++++------------------- 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/backend/mi2/mi2mago.ts b/src/backend/mi2/mi2mago.ts index 78e9f254..ab5aee6d 100644 --- a/src/backend/mi2/mi2mago.ts +++ b/src/backend/mi2/mi2mago.ts @@ -3,7 +3,7 @@ import { Stack } from "../backend"; import { MINode } from "../mi_parse"; export class MI2_Mago extends MI2_LLDB { - getStack(startFrame: number, maxLevels: number, thread: number): Promise { + override getStack(startFrame: number, maxLevels: number, thread: number): Promise { return new Promise((resolve, reject) => { const command = "stack-list-frames"; this.sendCommand(command).then((result) => { diff --git a/src/gdb.ts b/src/gdb.ts index 642ca97d..3aa0bda1 100644 --- a/src/gdb.ts +++ b/src/gdb.ts @@ -40,7 +40,7 @@ export interface AttachRequestArguments extends DebugProtocol.AttachRequestArgum } class GDBDebugSession extends MI2DebugSession { - protected initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { + protected override initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { response.body.supportsGotoTargetsRequest = true; response.body.supportsHitConditionalBreakpoints = true; response.body.supportsConfigurationDoneRequest = true; @@ -52,7 +52,7 @@ class GDBDebugSession extends MI2DebugSession { this.sendResponse(response); } - protected launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { + protected override launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { const dbgCommand = args.gdbpath || "gdb"; if (this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); @@ -98,7 +98,7 @@ class GDBDebugSession extends MI2DebugSession { } } - protected attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { + protected override attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { const dbgCommand = args.gdbpath || "gdb"; if (this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); diff --git a/src/lldb.ts b/src/lldb.ts index 49fa0215..718af1e5 100644 --- a/src/lldb.ts +++ b/src/lldb.ts @@ -37,7 +37,7 @@ export interface AttachRequestArguments extends DebugProtocol.AttachRequestArgum } class LLDBDebugSession extends MI2DebugSession { - protected initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { + protected override initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { response.body.supportsGotoTargetsRequest = true; response.body.supportsHitConditionalBreakpoints = true; response.body.supportsConfigurationDoneRequest = true; @@ -47,7 +47,7 @@ class LLDBDebugSession extends MI2DebugSession { this.sendResponse(response); } - protected launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { + protected override launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { const dbgCommand = args.lldbmipath || "lldb-mi"; if (this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); @@ -93,7 +93,7 @@ class LLDBDebugSession extends MI2DebugSession { } } - protected attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { + protected override attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { const dbgCommand = args.lldbmipath || "lldb-mi"; if (this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); diff --git a/src/mago.ts b/src/mago.ts index 09345c7d..411797da 100644 --- a/src/mago.ts +++ b/src/mago.ts @@ -36,7 +36,7 @@ class MagoDebugSession extends MI2DebugSession { super(debuggerLinesStartAt1, isServer); } - protected initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { + protected override initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { response.body.supportsHitConditionalBreakpoints = true; response.body.supportsConfigurationDoneRequest = true; response.body.supportsConditionalBreakpoints = true; @@ -49,7 +49,7 @@ class MagoDebugSession extends MI2DebugSession { return 0; } - protected launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { + protected override launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { const dbgCommand = args.magomipath || "mago-mi"; if (this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); @@ -73,7 +73,7 @@ class MagoDebugSession extends MI2DebugSession { }); } - protected attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { + protected override attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { const dbgCommand = args.magomipath || "mago-mi"; if (this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); diff --git a/src/mibase.ts b/src/mibase.ts index 278acce5..8ea52c9e 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -182,7 +182,7 @@ export class MI2DebugSession extends DebugSession { this.quitEvent(); } - protected disconnectRequest(response: DebugProtocol.DisconnectResponse, args: DebugProtocol.DisconnectArguments): void { + protected override disconnectRequest(response: DebugProtocol.DisconnectResponse, args: DebugProtocol.DisconnectArguments): void { if (this.attached) this.miDebugger.detach(); else @@ -192,7 +192,7 @@ export class MI2DebugSession extends DebugSession { this.sendResponse(response); } - protected async setVariableRequest(response: DebugProtocol.SetVariableResponse, args: DebugProtocol.SetVariableArguments): Promise { + protected override async setVariableRequest(response: DebugProtocol.SetVariableResponse, args: DebugProtocol.SetVariableArguments): Promise { try { if (this.useVarObjects) { let name = args.name; @@ -219,7 +219,7 @@ export class MI2DebugSession extends DebugSession { } } - protected setFunctionBreakPointsRequest(response: DebugProtocol.SetFunctionBreakpointsResponse, args: DebugProtocol.SetFunctionBreakpointsArguments): void { + protected override setFunctionBreakPointsRequest(response: DebugProtocol.SetFunctionBreakpointsResponse, args: DebugProtocol.SetFunctionBreakpointsArguments): void { const all = []; args.breakpoints.forEach(brk => { all.push(this.miDebugger.addBreakPoint({ raw: brk.name, condition: brk.condition, countCondition: brk.hitCondition })); @@ -239,7 +239,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments): void { + protected override setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments): void { let path = args.source.path; if (this.isSSH) { // convert local path to ssh path @@ -269,7 +269,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected threadsRequest(response: DebugProtocol.ThreadsResponse): void { + protected override threadsRequest(response: DebugProtocol.ThreadsResponse): void { if (!this.miDebugger) { this.sendResponse(response); return; @@ -300,7 +300,7 @@ export class MI2DebugSession extends DebugSession { return [frameId & 0xffff, frameId >> 16]; } - protected stackTraceRequest(response: DebugProtocol.StackTraceResponse, args: DebugProtocol.StackTraceArguments): void { + protected override stackTraceRequest(response: DebugProtocol.StackTraceResponse, args: DebugProtocol.StackTraceArguments): void { this.miDebugger.getStack(args.startFrame, args.levels, args.threadId).then(stack => { const ret: StackFrame[] = []; stack.forEach(element => { @@ -334,7 +334,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected configurationDoneRequest(response: DebugProtocol.ConfigurationDoneResponse, args: DebugProtocol.ConfigurationDoneArguments): void { + protected override configurationDoneRequest(response: DebugProtocol.ConfigurationDoneResponse, args: DebugProtocol.ConfigurationDoneArguments): void { const promises: Thenable[] = []; let entryPoint: string | undefined = undefined; let runToStart: boolean = false; @@ -403,7 +403,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments): void { + protected override scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments): void { const scopes = new Array(); const [threadId, level] = this.frameIdToThreadAndLevel(args.frameId); @@ -430,7 +430,7 @@ export class MI2DebugSession extends DebugSession { this.sendResponse(response); } - protected async variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments): Promise { + protected override async variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments): Promise { const variables: DebugProtocol.Variable[] = []; const id: VariableScope | string | VariableObject | ExtendedVariable = this.variableHandles.get(args.variablesReference); @@ -649,7 +649,7 @@ export class MI2DebugSession extends DebugSession { } } - protected pauseRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): void { + protected override pauseRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): void { this.miDebugger.interrupt().then(done => { this.sendResponse(response); }, msg => { @@ -657,7 +657,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected reverseContinueRequest(response: DebugProtocol.ReverseContinueResponse, args: DebugProtocol.ReverseContinueArguments): void { + protected override reverseContinueRequest(response: DebugProtocol.ReverseContinueResponse, args: DebugProtocol.ReverseContinueArguments): void { this.miDebugger.continue(true).then(done => { this.sendResponse(response); }, msg => { @@ -665,7 +665,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected continueRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): void { + protected override continueRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): void { this.miDebugger.continue().then(done => { this.sendResponse(response); }, msg => { @@ -673,7 +673,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected stepBackRequest(response: DebugProtocol.StepBackResponse, args: DebugProtocol.StepBackArguments): void { + protected override stepBackRequest(response: DebugProtocol.StepBackResponse, args: DebugProtocol.StepBackArguments): void { this.miDebugger.step(true).then(done => { this.sendResponse(response); }, msg => { @@ -681,7 +681,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected stepInRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { + protected override stepInRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { this.miDebugger.step().then(done => { this.sendResponse(response); }, msg => { @@ -689,7 +689,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected stepOutRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { + protected override stepOutRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { this.miDebugger.stepOut().then(done => { this.sendResponse(response); }, msg => { @@ -697,7 +697,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected nextRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { + protected override nextRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { this.miDebugger.next().then(done => { this.sendResponse(response); }, msg => { @@ -705,7 +705,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected evaluateRequest(response: DebugProtocol.EvaluateResponse, args: DebugProtocol.EvaluateArguments): void { + protected override evaluateRequest(response: DebugProtocol.EvaluateResponse, args: DebugProtocol.EvaluateArguments): void { const [threadId, level] = this.frameIdToThreadAndLevel(args.frameId); if (args.context == "watch" || args.context == "hover") { this.miDebugger.evalExpression(args.expression, threadId, level).then((res) => { @@ -736,7 +736,7 @@ export class MI2DebugSession extends DebugSession { } } - protected gotoTargetsRequest(response: DebugProtocol.GotoTargetsResponse, args: DebugProtocol.GotoTargetsArguments): void { + protected override gotoTargetsRequest(response: DebugProtocol.GotoTargetsResponse, args: DebugProtocol.GotoTargetsArguments): void { const path: string = this.isSSH ? this.sourceFileMap.toRemotePath(args.source.path) : args.source.path; this.miDebugger.goto(path, args.line).then(done => { response.body = { @@ -753,7 +753,7 @@ export class MI2DebugSession extends DebugSession { }); } - protected gotoRequest(response: DebugProtocol.GotoResponse, args: DebugProtocol.GotoArguments): void { + protected override gotoRequest(response: DebugProtocol.GotoResponse, args: DebugProtocol.GotoArguments): void { this.sendResponse(response); } From 86b6678d0983b39ff6402a2f5c8566aecd64f1e7 Mon Sep 17 00:00:00 2001 From: oltolm Date: Wed, 13 Mar 2024 18:00:54 +0100 Subject: [PATCH 10/22] fix variables for lldb-mi --- src/backend/mi2/mi2.ts | 3 +++ src/mibase.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index 3d9a4459..8963b7e9 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -675,6 +675,9 @@ export class MI2 extends EventEmitter implements IBackend { const result = await this.sendCommand(command); const threads = result.result("threads"); const ret: Thread[] = []; + if (!Array.isArray(threads)) { // workaround for lldb-mi bug: `'^done,threads="[]"'` + return ret; + } return threads.map(element => { const ret: Thread = { id: parseInt(MINode.valueOf(element, "id")), diff --git a/src/mibase.ts b/src/mibase.ts index 8ea52c9e..e6cb2054 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -482,7 +482,7 @@ export class MI2DebugSession extends DebugSession { const varId = this.variableHandlesReverse[varObjName]; varObj = this.variableHandles.get(varId) as any; } catch (err) { - if (err instanceof MIError && err.message == "Variable object not found") { + if (err instanceof MIError && (err.message == "Variable object not found" || err.message.endsWith("does not exist"))) { varObj = await this.miDebugger.varCreate(id.threadId, id.level, variable.name, varObjName); const varId = findOrCreateVariable(varObj); varObj.exp = variable.name; From 1b9f13e767562b3e228f32689c45d1d858e8b2ef Mon Sep 17 00:00:00 2001 From: oltolm Date: Thu, 14 Mar 2024 01:04:44 +0100 Subject: [PATCH 11/22] set "noImplicitAny" to true and fix the problems --- package-lock.json | 51 +++++++++++++++++++++++++++++ package.json | 1 + src/backend/backend.ts | 4 +-- src/backend/gdb_expansion.ts | 11 ++++--- src/backend/mi2/mi2.ts | 42 ++++++++++++------------ src/backend/mi2/mi2lldb.ts | 4 +-- src/backend/mi2/mi2mago.ts | 4 +-- src/backend/mi_parse.ts | 21 +++++++----- src/frontend/extension.ts | 4 +-- src/mibase.ts | 22 ++++++------- src/test/unit/gdb_expansion.test.ts | 3 +- tsconfig.json | 3 +- 12 files changed, 114 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0b94fcd..aa8b7454 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/mocha": "^5.2.6", "@types/node": "^11.11.3", + "@types/ssh2": "^1.15.0", "@types/vscode": "^1.55.0", "@typescript-eslint/eslint-plugin": "^5.22.0", "@typescript-eslint/parser": "^5.22.0", @@ -972,6 +973,24 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/ssh2": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.0.tgz", + "integrity": "sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==", + "dev": true, + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.24.tgz", + "integrity": "sha512-eghAz3gnbQbvnHqB+mgB2ZR3aH6RhdEmHGS48BnV75KceQPHqabkxKI0BbUSsqhqy2Ddhc2xD/VAR9ySZd57Lw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@types/vscode": { "version": "1.62.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.62.0.tgz", @@ -5361,6 +5380,12 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -6445,6 +6470,26 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/ssh2": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.0.tgz", + "integrity": "sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==", + "dev": true, + "requires": { + "@types/node": "^18.11.18" + }, + "dependencies": { + "@types/node": { + "version": "18.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.24.tgz", + "integrity": "sha512-eghAz3gnbQbvnHqB+mgB2ZR3aH6RhdEmHGS48BnV75KceQPHqabkxKI0BbUSsqhqy2Ddhc2xD/VAR9ySZd57Lw==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + } + } + }, "@types/vscode": { "version": "1.62.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.62.0.tgz", @@ -9654,6 +9699,12 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", diff --git a/package.json b/package.json index a57ce891..fb20330b 100644 --- a/package.json +++ b/package.json @@ -1112,6 +1112,7 @@ "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/mocha": "^5.2.6", "@types/node": "^11.11.3", + "@types/ssh2": "^1.15.0", "@types/vscode": "^1.55.0", "@typescript-eslint/eslint-plugin": "^5.22.0", "@typescript-eslint/parser": "^5.22.0", diff --git a/src/backend/backend.ts b/src/backend/backend.ts index 747c0188..dcf785e8 100644 --- a/src/backend/backend.ts +++ b/src/backend/backend.ts @@ -60,8 +60,8 @@ export interface IBackend { attach(cwd: string, executable: string, target: string, autorun: string[]): Thenable; connect(cwd: string, executable: string, target: string, autorun: string[]): Thenable; start(runToStart: boolean): Thenable; - stop(); - detach(); + stop(): void; + detach(): void; interrupt(): Thenable; continue(): Thenable; next(): Thenable; diff --git a/src/backend/gdb_expansion.ts b/src/backend/gdb_expansion.ts index d2c83e41..250a0d03 100644 --- a/src/backend/gdb_expansion.ts +++ b/src/backend/gdb_expansion.ts @@ -1,3 +1,4 @@ +import { VariableObject } from "./backend"; import { MINode } from "./mi_parse"; const resultRegex = /^([a-zA-Z_\-][a-zA-Z0-9_\-]*|\[\d+\])\s*=\s*/; @@ -29,7 +30,7 @@ export function isExpandable(value: string): number { else return 0; } -export function expandValue(variableCreate: Function, value: string, root: string = "", extra: any = undefined): any { +export function expandValue(variableCreate: (arg: VariableObject | string, options?: any) => any, value: string, root: string = "", extra: any = undefined): any { const parseCString = () => { value = value.trim(); if (value[0] != '"' && value[0] != '\'') @@ -56,10 +57,10 @@ export function expandValue(variableCreate: Function, value: string, root: strin }; const stack = [root]; - let parseValue, parseCommaResult, parseCommaValue, parseResult, createValue; + let parseValue: () => any, parseCommaResult: (pushToStack: boolean) => any, parseCommaValue: () => any, parseResult: (pushToStack: boolean) => any, createValue: (name: string, val: any) => any; let variable = ""; - const getNamespace = (variable) => { + const getNamespace = (variable: string) => { let namespace = ""; let prefix = ""; stack.push(variable); @@ -209,7 +210,7 @@ export function expandValue(variableCreate: Function, value: string, root: strin return createValue(name, val); }; - createValue = (name, val) => { + createValue = (name: string, val: any) => { let ref = 0; if (typeof val == "object") { ref = variableCreate(val); @@ -223,7 +224,7 @@ export function expandValue(variableCreate: Function, value: string, root: strin val = "Object@" + val; } } else if (typeof val == "string" && val.startsWith("@0x")) { - ref = variableCreate(getNamespace("*&" + name.substr)); + ref = variableCreate(getNamespace("*&" + name.substring(1))); val = "Ref" + val; } else if (typeof val == "string" && val.startsWith("<...>")) { ref = variableCreate(getNamespace(name)); diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index 8963b7e9..bc814cc8 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -6,7 +6,7 @@ import * as linuxTerm from '../linux/console'; import * as net from "net"; import * as fs from "fs"; import * as path from "path"; -import { Client } from "ssh2"; +import { Client, ClientChannel, ExecOptions } from "ssh2"; export function escape(str: string) { return str.replace(/\\/g, "\\\\").replace(/"/g, "\\\""); @@ -29,7 +29,7 @@ export class MI2 extends EventEmitter implements IBackend { super(); if (procEnv) { - const env = {}; + const env: { [key: string]: string } = {}; // Duplicate process.env so we don't override it for (const key in process.env) if (process.env.hasOwnProperty(key)) @@ -57,8 +57,8 @@ export class MI2 extends EventEmitter implements IBackend { this.process = ChildProcess.spawn(this.application, args, { cwd: cwd, env: this.procEnv }); this.process.stdout.on("data", this.stdout.bind(this)); this.process.stderr.on("data", this.stderr.bind(this)); - this.process.on("exit", (() => { this.emit("quit"); }).bind(this)); - this.process.on("error", ((err) => { this.emit("launcherror", err); }).bind(this)); + this.process.on("exit", () => this.emit("quit")); + this.process.on("error", err => this.emit("launcherror", err)); const promises = this.initCommands(target, cwd); if (procArgs && procArgs.length) promises.push(this.sendCommand("exec-arguments " + procArgs)); @@ -137,7 +137,7 @@ export class MI2 extends EventEmitter implements IBackend { this.sshConn.on("ready", () => { this.log("stdout", "Running " + this.application + " over ssh..."); - const execArgs: any = {}; + const execArgs: ExecOptions = {}; if (args.forwardX11) { execArgs.x11 = { single: false, @@ -150,7 +150,7 @@ export class MI2 extends EventEmitter implements IBackend { if (err) { this.log("stderr", "Could not run " + this.application + "(" + sshCMD + ") over ssh!"); if (err === undefined) { - err = ""; + err = new Error(""); } this.log("stderr", err.toString()); this.emit("quit"); @@ -161,10 +161,10 @@ export class MI2 extends EventEmitter implements IBackend { this.stream = stream; stream.on("data", this.stdout.bind(this)); stream.stderr.on("data", this.stderr.bind(this)); - stream.on("exit", (() => { + stream.on("exit", () => { this.emit("quit"); this.sshConn.end(); - }).bind(this)); + }); const promises = this.initCommands(target, cwd, attach); promises.push(this.sendCommand("environment-cd \"" + escape(cwd) + "\"")); if (attach) { @@ -181,7 +181,7 @@ export class MI2 extends EventEmitter implements IBackend { }).on("error", (err) => { this.log("stderr", "Error running " + this.application + " over ssh!"); if (err === undefined) { - err = ""; + err = new Error(""); } this.log("stderr", err.toString()); this.emit("quit"); @@ -235,8 +235,8 @@ export class MI2 extends EventEmitter implements IBackend { this.process = ChildProcess.spawn(this.application, args, { cwd: cwd, env: this.procEnv }); this.process.stdout.on("data", this.stdout.bind(this)); this.process.stderr.on("data", this.stderr.bind(this)); - this.process.on("exit", (() => { this.emit("quit"); }).bind(this)); - this.process.on("error", ((err) => { this.emit("launcherror", err); }).bind(this)); + this.process.on("exit", () => this.emit("quit")); + this.process.on("error", err => this.emit("launcherror", err)); const promises = this.initCommands(target, cwd, true); if (target.startsWith("extended-remote")) { promises.push(this.sendCommand("target-select " + target)); @@ -267,8 +267,8 @@ export class MI2 extends EventEmitter implements IBackend { this.process = ChildProcess.spawn(this.application, args, { cwd: cwd, env: this.procEnv }); this.process.stdout.on("data", this.stdout.bind(this)); this.process.stderr.on("data", this.stderr.bind(this)); - this.process.on("exit", (() => { this.emit("quit"); }).bind(this)); - this.process.on("error", ((err) => { this.emit("launcherror", err); }).bind(this)); + this.process.on("exit", () => this.emit("quit")); + this.process.on("error", err => this.emit("launcherror", err)); const promises = this.initCommands(target, cwd, true); promises.push(this.sendCommand("target-select remote " + target)); promises.push(...autorun.map(value => { return this.sendUserInput(value); })); @@ -279,7 +279,7 @@ export class MI2 extends EventEmitter implements IBackend { }); } - stdout(data) { + stdout(data: any) { if (trace) this.log("stderr", "stdout: " + data); if (typeof data == "string") @@ -298,7 +298,7 @@ export class MI2 extends EventEmitter implements IBackend { } } - stderr(data) { + stderr(data: any) { if (typeof data == "string") this.errbuf += data; else @@ -563,7 +563,7 @@ export class MI2 extends EventEmitter implements IBackend { loadBreakPoints(breakpoints: Breakpoint[]): Thenable<[boolean, Breakpoint][]> { if (trace) this.log("stderr", "loadBreakPoints"); - const promisses = []; + const promisses: Thenable<[boolean, Breakpoint]>[] = []; breakpoints.forEach(breakpoint => { promisses.push(this.addBreakPoint(breakpoint)); }); @@ -651,7 +651,7 @@ export class MI2 extends EventEmitter implements IBackend { if (trace) this.log("stderr", "clearBreakPoints"); return new Promise((resolve, reject) => { - const promises = []; + const promises: Thenable[] = []; const breakpoints = this.breakpoints; this.breakpoints = new Map(); breakpoints.forEach((k, index) => { @@ -709,7 +709,7 @@ export class MI2 extends EventEmitter implements IBackend { const result = await this.sendCommand(["stack-list-frames"].concat(options).join(" ")); const stack = result.result("stack"); - return stack.map(element => { + return stack.map((element: any) => { const level = MINode.valueOf(element, "@frame.level"); const addr = MINode.valueOf(element, "@frame.addr"); const func = MINode.valueOf(element, "@frame.func"); @@ -856,7 +856,7 @@ export class MI2 extends EventEmitter implements IBackend { //TODO: add `from` and `to` arguments const res = await this.sendCommand(`var-list-children --all-values ${this.quote(name)}`); const children = res.result("children") || []; - const omg: VariableObject[] = children.map(child => new VariableObject(child[1])); + const omg: VariableObject[] = children.map((child: any) => new VariableObject(child[1])); return omg; } @@ -945,6 +945,6 @@ export class MI2 extends EventEmitter implements IBackend { protected buffer: string; protected errbuf: string; protected process: ChildProcess.ChildProcess; - protected stream; - protected sshConn; + protected stream: ClientChannel; + protected sshConn: Client; } diff --git a/src/backend/mi2/mi2lldb.ts b/src/backend/mi2/mi2lldb.ts index e04f118c..600c7931 100644 --- a/src/backend/mi2/mi2lldb.ts +++ b/src/backend/mi2/mi2lldb.ts @@ -41,8 +41,8 @@ export class MI2_LLDB extends MI2 { this.process = ChildProcess.spawn(this.application, args, { cwd: cwd, env: this.procEnv }); this.process.stdout.on("data", this.stdout.bind(this)); this.process.stderr.on("data", this.stderr.bind(this)); - this.process.on("exit", (() => { this.emit("quit"); }).bind(this)); - this.process.on("error", ((err) => { this.emit("launcherror", err); }).bind(this)); + this.process.on("exit", () => this.emit("quit")); + this.process.on("error", err => this.emit("launcherror", err)); const promises = this.initCommands(target, cwd, true); promises.push(this.sendCommand("file-exec-and-symbols \"" + escape(executable) + "\"")); promises.push(this.sendCommand("target-attach " + target)); diff --git a/src/backend/mi2/mi2mago.ts b/src/backend/mi2/mi2mago.ts index ab5aee6d..fc63d6a6 100644 --- a/src/backend/mi2/mi2mago.ts +++ b/src/backend/mi2/mi2mago.ts @@ -9,8 +9,8 @@ export class MI2_Mago extends MI2_LLDB { this.sendCommand(command).then((result) => { const stack = result.resultRecords.results; const ret: Stack[] = []; - const remaining = []; - const addToStack = (element) => { + const remaining: any = []; + const addToStack = (element: any) => { const level = MINode.valueOf(element, "frame.level"); const addr = MINode.valueOf(element, "frame.addr"); const func = MINode.valueOf(element, "frame.func"); diff --git a/src/backend/mi_parse.ts b/src/backend/mi_parse.ts index 75a64ae3..f3f4cf8b 100644 --- a/src/backend/mi_parse.ts +++ b/src/backend/mi_parse.ts @@ -150,19 +150,19 @@ export function parseMI(output: string): MINode { */ let token = undefined; - const outOfBandRecord = []; + const outOfBandRecord: { isStream: boolean, type: string, asyncClass: string, output: [string, any][], content: string }[] = []; let resultRecords = undefined; const asyncRecordType = { "*": "exec", "+": "status", "=": "notify" - }; + } as const; const streamRecordType = { "~": "console", "@": "target", "&": "log" - }; + } as const; const parseCString = () => { if (output[0] != '"') @@ -192,7 +192,7 @@ export function parseMI(output: string): MINode { return str; }; - let parseValue, parseCommaResult, parseCommaValue, parseResult; + let parseValue: () => any, parseCommaResult: () => any, parseCommaValue: () => any, parseResult: () => any; const parseTupleOrList = () => { if (output[0] != '{' && output[0] != '[') @@ -274,9 +274,10 @@ export function parseMI(output: string): MINode { output = output.substring(classMatch[0].length); const asyncRecord = { isStream: false, - type: asyncRecordType[match[2]], + type: asyncRecordType[match[2] as keyof typeof asyncRecordType], asyncClass: classMatch[0], - output: [] + output: [] as any, + content: "" }; let result; while (result = parseCommaResult()) @@ -285,8 +286,10 @@ export function parseMI(output: string): MINode { } else if (match[3]) { const streamRecord = { isStream: true, - type: streamRecordType[match[3]], - content: parseCString() + type: streamRecordType[match[3] as keyof typeof streamRecordType], + content: parseCString(), + output: [] as [string, any][], + asyncClass: "" }; outOfBandRecord.push(streamRecord); } @@ -310,5 +313,5 @@ export function parseMI(output: string): MINode { output = output.replace(newlineRegex, ""); } - return new MINode(token, outOfBandRecord || [], resultRecords); + return new MINode(token, outOfBandRecord || [], resultRecords); } diff --git a/src/frontend/extension.ts b/src/frontend/extension.ts index 222be7b3..eaa65583 100644 --- a/src/frontend/extension.ts +++ b/src/frontend/extension.ts @@ -70,7 +70,7 @@ function examineMemory() { else return vscode.window.showErrorMessage("No debugging sessions available"); } - const pickedFile = (file) => { + const pickedFile = (file: string) => { vscode.window.showInputBox({ placeHolder: "Memory Location or Range", validateInput: range => getMemoryRange(range) === undefined ? "Range must either be in format 0xF00-0xF01, 0xF100+32 or 0xABC154" : "" }).then(range => { vscode.window.showTextDocument(vscode.Uri.parse("debugmemory://" + file + "?" + getMemoryRange(range))); }); @@ -90,7 +90,7 @@ class MemoryContentProvider implements vscode.TextDocumentContentProvider { provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): Thenable { return new Promise((resolve, reject) => { const conn = net.connect(path.join(os.tmpdir(), "code-debug-sockets", uri.authority.toLowerCase())); - let from, to; + let from: number, to: number; let highlightAt = -1; const splits = uri.query.split("&"); if (splits[0].split("=")[0] == "at") { diff --git a/src/mibase.ts b/src/mibase.ts index e6cb2054..a342925a 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -13,7 +13,7 @@ import * as fs from "fs"; import { SourceFileMap } from "./source_file_map"; class ExtendedVariable { - constructor(public name, public options) { + constructor(public name: string, public options: { "arg": any }) { } } @@ -75,7 +75,7 @@ export class MI2DebugSession extends DebugSession { func = rawCmd.substring(0, spaceIndex); args = JSON.parse(rawCmd.substring(spaceIndex + 1)); } - Promise.resolve(this.miDebugger[func].apply(this.miDebugger, args)).then(data => { + Promise.resolve((this.miDebugger as any)[func].apply(this.miDebugger, args)).then(data => { c.write(data.toString()); }); }); @@ -220,15 +220,15 @@ export class MI2DebugSession extends DebugSession { } protected override setFunctionBreakPointsRequest(response: DebugProtocol.SetFunctionBreakpointsResponse, args: DebugProtocol.SetFunctionBreakpointsArguments): void { - const all = []; + const all: Thenable<[boolean, Breakpoint]>[] = []; args.breakpoints.forEach(brk => { all.push(this.miDebugger.addBreakPoint({ raw: brk.name, condition: brk.condition, countCondition: brk.hitCondition })); }); Promise.all(all).then(brkpoints => { - const finalBrks = []; + const finalBrks: DebugProtocol.Breakpoint[] = []; brkpoints.forEach(brkp => { if (brkp[0]) - finalBrks.push({ line: brkp[1].line }); + finalBrks.push({ line: brkp[1].line, verified: true }); }); response.body = { breakpoints: finalBrks @@ -250,7 +250,7 @@ export class MI2DebugSession extends DebugSession { return this.miDebugger.addBreakPoint({ file: path, line: brk.line, condition: brk.condition, countCondition: brk.hitCondition }); }); Promise.all(all).then(brkpoints => { - const finalBrks = []; + const finalBrks: DebugProtocol.Breakpoint[] = []; brkpoints.forEach(brkp => { // TODO: Currently all breakpoints returned are marked as verified, // which leads to verified breakpoints on a broken lldb. @@ -434,9 +434,9 @@ export class MI2DebugSession extends DebugSession { const variables: DebugProtocol.Variable[] = []; const id: VariableScope | string | VariableObject | ExtendedVariable = this.variableHandles.get(args.variablesReference); - const createVariable = (arg, options?) => { + const createVariable = (arg: string | VariableObject, options?: any) => { if (options) - return this.variableHandles.create(new ExtendedVariable(arg, options)); + return this.variableHandles.create(new ExtendedVariable(typeof arg === 'string' ? arg : arg.name, options)); else return this.variableHandles.create(arg); }; @@ -473,7 +473,7 @@ export class MI2DebugSession extends DebugSession { try { const changes = await this.miDebugger.varUpdate(varObjName); const changelist = changes.result("changelist"); - changelist.forEach((change) => { + changelist.forEach((change: any) => { const name = MINode.valueOf(change, "name"); const vId = this.variableHandlesReverse[name]; const v = this.variableHandles.get(vId) as any; @@ -582,7 +582,7 @@ export class MI2DebugSession extends DebugSession { } else if (id instanceof ExtendedVariable) { const varReq = id; if (varReq.options.arg) { - const strArr = []; + const strArr: DebugProtocol.Variable[] = []; let argsPart = true; let arrIndex = 0; const submit = () => { @@ -767,7 +767,7 @@ export class MI2DebugSession extends DebugSession { } -function prettyStringArray(strings) { +function prettyStringArray(strings: any) { if (typeof strings == "object") { if (strings.length !== undefined) return strings.join(", "); diff --git a/src/test/unit/gdb_expansion.test.ts b/src/test/unit/gdb_expansion.test.ts index 9f00a8cc..2bc5f085 100644 --- a/src/test/unit/gdb_expansion.test.ts +++ b/src/test/unit/gdb_expansion.test.ts @@ -1,8 +1,9 @@ import * as assert from 'assert'; import { expandValue, isExpandable } from '../../backend/gdb_expansion'; +import { VariableObject } from '../../backend/backend'; suite("GDB Value Expansion", () => { - const variableCreate = (variable) => { return { expanded: variable }; }; + const variableCreate = (variable: string) => ({ expanded: variable }); test("Various values", () => { assert.strictEqual(isExpandable(`false`), 0); assert.strictEqual(expandValue(variableCreate, `false`), "false"); diff --git a/tsconfig.json b/tsconfig.json index 915ff8fc..97824ed7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,8 @@ { "name": "tslint-language-service" } - ] + ], + "noImplicitAny": true }, "exclude": [ "node_modules", From 16951164d1aa27568e1ef67bfdebed3142ecd4a1 Mon Sep 17 00:00:00 2001 From: xuhong Date: Wed, 29 May 2024 20:38:51 +0800 Subject: [PATCH 12/22] add support to Log Message breakpoint --- src/backend/backend.ts | 2 + src/backend/mi2/mi2.ts | 83 +++++++++++++++++++++++++++++++++++++++++- src/gdb.ts | 1 + src/mibase.ts | 2 +- 4 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/backend/backend.ts b/src/backend/backend.ts index dcf785e8..e26bd369 100644 --- a/src/backend/backend.ts +++ b/src/backend/backend.ts @@ -4,11 +4,13 @@ import { DebugProtocol } from "vscode-debugprotocol/lib/debugProtocol"; export type ValuesFormattingMode = "disabled" | "parseText" | "prettyPrinters"; export interface Breakpoint { + id?:number; file?: string; line?: number; raw?: string; condition: string; countCondition?: string; + logMessage?: string; } export interface Thread { diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index bc814cc8..f95c9db1 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -24,6 +24,50 @@ function couldBeOutput(line: string) { const trace = false; +class LogMessage { + protected logMsgVar = ""; + protected logMsgVarProcess = ""; + protected logMsgRplNum = 0; + protected logMsgRplItem: string[] = []; + protected logMsgMatch = /(^\$[0-9]*[\ ]*=[\ ]*)(.*)/; + protected logReplaceTest = /{([^}]*)}/g; + public logMsgBrkList: Breakpoint[] = []; + + logMsgOutput(record){ + if ((record.type === 'console')) { + if(record.content.startsWith("$")){ + const content = record.content; + const variableMatch = this.logMsgMatch.exec(content); + if (variableMatch) { + const value = content.substr(variableMatch[1].length).trim(); + this.logMsgRplItem.push(value); + this.logMsgRplNum--; + if(this.logMsgRplNum == 0){ + for(let i = 0; i < this.logMsgRplItem.length; i++){ + this.logMsgVarProcess = this.logMsgVarProcess.replace("placeHolderForVariable", this.logMsgRplItem[i]); + } + return "Log Message:" + this.logMsgVarProcess; + } + } + } + return null + } + } + + logMsgProcess(parsed){ + this.logMsgBrkList.forEach((brk)=>{ + if(parsed.outOfBandRecord[0].output[0][1] == "breakpoint-hit" && parsed.outOfBandRecord[0].output[2][1] == brk.id){ + this.logMsgVar = brk?.logMessage; + const matches = this.logMsgVar.match(this.logReplaceTest); + const count = matches ? matches.length : 0; + this.logMsgRplNum = count; + this.logMsgVarProcess = this.logMsgVar.replace(this.logReplaceTest, "placeHolderForVariable"); + this.logMsgRplItem = []; + } + }); + } +} + export class MI2 extends EventEmitter implements IBackend { constructor(public application: string, public preargs: string[], public extraargs: string[], procEnv: any, public extraCommands: string[] = []) { super(); @@ -47,6 +91,7 @@ export class MI2 extends EventEmitter implements IBackend { this.procEnv = env; } } + protected logMessage:LogMessage = new LogMessage; load(cwd: string, target: string, procArgs: string, separateConsole: string, autorun: string[]): Thenable { if (!path.isAbsolute(target)) @@ -354,6 +399,10 @@ export class MI2 extends EventEmitter implements IBackend { parsed.outOfBandRecord.forEach(record => { if (record.isStream) { this.log(record.type, record.content); + const logOutput = this.logMessage.logMsgOutput(record); + if(logOutput){ + this.log("console", logOutput); + } } else { if (record.type == "exec") { this.emit("exec-async-output", parsed); @@ -373,6 +422,7 @@ export class MI2 extends EventEmitter implements IBackend { switch (reason) { case "breakpoint-hit": this.emit("breakpoint", parsed); + this.logMessage.logMsgProcess(parsed); break; case "watchpoint-trigger": case "read-watchpoint-trigger": @@ -576,6 +626,23 @@ export class MI2 extends EventEmitter implements IBackend { return this.sendCommand("break-condition " + bkptNum + " " + condition); } + setLogPoint(bkptNum, command): Thenable { + const regex = /{([a-z0-9A-Z-_\.\>\&\*\[\]]*)}/gm; + let m:RegExpExecArray; + let commands:string = ""; + + while ((m = regex.exec(command))) { + if (m.index === regex.lastIndex) { + regex.lastIndex++; + } + if (m[1]) { + commands += `\"print ${m[1]}\" `; + } + } + commands += "\"continue\""; + return this.sendCommand("break-commands " + bkptNum + " " + commands); + } + setEntryBreakPoint(entryPoint: string): Thenable { return this.sendCommand("break-insert -t -f " + entryPoint); } @@ -607,15 +674,29 @@ export class MI2 extends EventEmitter implements IBackend { if (result.resultRecords.resultClass == "done") { const bkptNum = parseInt(result.result("bkpt.number")); const newBrk = { + id: bkptNum, file: breakpoint.file ? breakpoint.file : result.result("bkpt.file"), raw: breakpoint.raw, line: parseInt(result.result("bkpt.line")), - condition: breakpoint.condition + condition: breakpoint.condition, + logMessage: breakpoint?.logMessage, }; if (breakpoint.condition) { this.setBreakPointCondition(bkptNum, breakpoint.condition).then((result) => { if (result.resultRecords.resultClass == "done") { this.breakpoints.set(newBrk, bkptNum); + resolve([true, newBrk]); + } else { + resolve([false, undefined]); + } + }, reject); + } else if (breakpoint.logMessage) { + this.setLogPoint(bkptNum, breakpoint.logMessage).then((result) => { + if (result.resultRecords.resultClass == "done") { + breakpoint.id = newBrk.id; + this.breakpoints.set(newBrk, bkptNum); + this.logMessage.logMsgBrkList.push(breakpoint); + resolve([true, newBrk]); } else { resolve([false, undefined]); diff --git a/src/gdb.ts b/src/gdb.ts index 3aa0bda1..843fca25 100644 --- a/src/gdb.ts +++ b/src/gdb.ts @@ -49,6 +49,7 @@ class GDBDebugSession extends MI2DebugSession { response.body.supportsEvaluateForHovers = true; response.body.supportsSetVariable = true; response.body.supportsStepBack = true; + response.body.supportsLogPoints = true; this.sendResponse(response); } diff --git a/src/mibase.ts b/src/mibase.ts index a342925a..4538d565 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -247,7 +247,7 @@ export class MI2DebugSession extends DebugSession { } this.miDebugger.clearBreakPoints(path).then(() => { const all = args.breakpoints.map(brk => { - return this.miDebugger.addBreakPoint({ file: path, line: brk.line, condition: brk.condition, countCondition: brk.hitCondition }); + return this.miDebugger.addBreakPoint({ file: path, line: brk.line, condition: brk.condition, countCondition: brk.hitCondition, logMessage: brk.logMessage }); }); Promise.all(all).then(brkpoints => { const finalBrks: DebugProtocol.Breakpoint[] = []; From f204573fae2f9614aba4be3307984c28576f3b8d Mon Sep 17 00:00:00 2001 From: xuhong Date: Thu, 30 May 2024 17:58:17 +0800 Subject: [PATCH 13/22] 1. fix lint error 2. add logMessage in README. --- README.md | 6 ++++++ images/logMessage.gif | Bin 0 -> 200476 bytes src/backend/mi2/mi2.ts | 4 +--- 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 images/logMessage.gif diff --git a/README.md b/README.md index b9bda930..21fc0041 100644 --- a/README.md +++ b/README.md @@ -213,4 +213,10 @@ differently based on whether the remote system is a POSIX or a Windows system. You may need to experiment to find the correct escaping necessary for the command to be sent to the debugger as you intended. +### LogMessage + +LogMessage will print a message in the debug console when breakpoint is hit. Expressions within {} are interpolated. + +![LogMessage](images/logMessage.gif) + ## [Issues](https://github.com/WebFreak001/code-debug) diff --git a/images/logMessage.gif b/images/logMessage.gif new file mode 100644 index 0000000000000000000000000000000000000000..4bdb9ac3bc5d64d70a8862c31a88538a26b2158f GIT binary patch literal 200476 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%0DjIYMHE2Q1Hr+YGbV$1Bn29y{rj?jMyw`K5iZ9N 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%0An0}7 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

DS=r@%2Wq8%ciX8H>UFGYSNh^+X=7Muf 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%0AeoO=S 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 Date: Fri, 31 May 2024 11:06:36 +0800 Subject: [PATCH 14/22] 1.fix implicitly type error --- src/backend/mi2/mi2.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index 706ae03b..82e7ae6a 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -33,7 +33,7 @@ class LogMessage { protected logReplaceTest = /{([^}]*)}/g; public logMsgBrkList: Breakpoint[] = []; - logMsgOutput(record){ + logMsgOutput(record:any){ if ((record.type === 'console')) { if(record.content.startsWith("$")){ const content = record.content; @@ -54,7 +54,7 @@ class LogMessage { } } - logMsgProcess(parsed){ + logMsgProcess(parsed:any){ this.logMsgBrkList.forEach((brk)=>{ if(parsed.outOfBandRecord[0].output[0][1] == "breakpoint-hit" && parsed.outOfBandRecord[0].output[2][1] == brk.id){ this.logMsgVar = brk?.logMessage; @@ -626,7 +626,7 @@ export class MI2 extends EventEmitter implements IBackend { return this.sendCommand("break-condition " + bkptNum + " " + condition); } - setLogPoint(bkptNum, command): Thenable { + setLogPoint(bkptNum:number, command:string): Thenable { const regex = /{([a-z0-9A-Z-_\.\>\&\*\[\]]*)}/gm; let m:RegExpExecArray; let commands:string = ""; From 2869f942a461410004199b4018849f0505766e2f Mon Sep 17 00:00:00 2001 From: xuhong Date: Fri, 31 May 2024 11:09:26 +0800 Subject: [PATCH 15/22] 1.fix gdb check error --- src/gdb.ts | 4 ++-- src/lldb.ts | 4 ++-- src/mago.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gdb.ts b/src/gdb.ts index 843fca25..ecc6c3ce 100644 --- a/src/gdb.ts +++ b/src/gdb.ts @@ -55,7 +55,7 @@ class GDBDebugSession extends MI2DebugSession { protected override launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { const dbgCommand = args.gdbpath || "gdb"; - if (this.checkCommand(dbgCommand)) { + if (!this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); return; } @@ -101,7 +101,7 @@ class GDBDebugSession extends MI2DebugSession { protected override attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { const dbgCommand = args.gdbpath || "gdb"; - if (this.checkCommand(dbgCommand)) { + if (!this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); return; } diff --git a/src/lldb.ts b/src/lldb.ts index 718af1e5..5db0bbea 100644 --- a/src/lldb.ts +++ b/src/lldb.ts @@ -49,7 +49,7 @@ class LLDBDebugSession extends MI2DebugSession { protected override launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { const dbgCommand = args.lldbmipath || "lldb-mi"; - if (this.checkCommand(dbgCommand)) { + if (!this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); return; } @@ -95,7 +95,7 @@ class LLDBDebugSession extends MI2DebugSession { protected override attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { const dbgCommand = args.lldbmipath || "lldb-mi"; - if (this.checkCommand(dbgCommand)) { + if (!this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); return; } diff --git a/src/mago.ts b/src/mago.ts index 411797da..df53e6df 100644 --- a/src/mago.ts +++ b/src/mago.ts @@ -51,7 +51,7 @@ class MagoDebugSession extends MI2DebugSession { protected override launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { const dbgCommand = args.magomipath || "mago-mi"; - if (this.checkCommand(dbgCommand)) { + if (!this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); return; } @@ -75,7 +75,7 @@ class MagoDebugSession extends MI2DebugSession { protected override attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { const dbgCommand = args.magomipath || "mago-mi"; - if (this.checkCommand(dbgCommand)) { + if (!this.checkCommand(dbgCommand)) { this.sendErrorResponse(response, 104, `Configured debugger ${dbgCommand} not found.`); return; } From 25e1f2876a07f96e21619fc0a432e824b3489dc8 Mon Sep 17 00:00:00 2001 From: xuhong Date: Wed, 21 Aug 2024 09:57:11 +0800 Subject: [PATCH 16/22] =?UTF-8?q?1=E3=80=81add=20changlog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27e01e4a..521f9e90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ Versioning]. ### Added +- fix gdb check error when debug beginning ([@henryriley0]) +- fix implicitly type error in log message when build vsix ([@henryriley0]) - check for configured debugger before start to provide a nicer error message ([@GitMensch]) @@ -242,6 +244,7 @@ Versioning]. [@gentoo90]: https://github.com/gentoo90 [@gitmensch]: https://github.com/GitMensch [@haronk]: https://github.com/HaronK +[@henryriley0]: https://github.com/HenryRiley0 [@jelleroets]: https://github.com/JelleRoets [@karljs]: https://github.com/karljs [@kvinwang]: https://github.com/kvinwang From 7d276df77c2913aace5bdef622d4725c6eda9a79 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 22 Aug 2024 14:38:18 +0200 Subject: [PATCH 17/22] Support GDB frame filters This adds a new `frameFilters` option for GDB. When enabled, `enable-frame-filters` is passed to GDB which will run frame filters before they are passed to the extension. --- CHANGELOG.md | 3 +++ package.json | 10 ++++++++++ src/backend/mi2/mi2.ts | 10 +++++++++- src/gdb.ts | 4 ++++ src/mibase.ts | 2 +- 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 521f9e90..b41a3c0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ Versioning]. - fix implicitly type error in log message when build vsix ([@henryriley0]) - check for configured debugger before start to provide a nicer error message ([@GitMensch]) +- New `frameFilters` option for GDB that allows using custom frame filters, + enabled by default ([@JacquesLucke]) ## [0.27.0] - 2024-02-07 @@ -245,6 +247,7 @@ Versioning]. [@gitmensch]: https://github.com/GitMensch [@haronk]: https://github.com/HaronK [@henryriley0]: https://github.com/HenryRiley0 +[@jacqueslucke]: https://github.com/JacquesLucke [@jelleroets]: https://github.com/JelleRoets [@karljs]: https://github.com/karljs [@kvinwang]: https://github.com/kvinwang diff --git a/package.json b/package.json index fb20330b..5454bf60 100644 --- a/package.json +++ b/package.json @@ -194,6 +194,11 @@ "prettyPrinters" ] }, + "frameFilters": { + "type": "boolean", + "description": "Use frame filters registered in GDB", + "default": true + }, "printCalls": { "type": "boolean", "description": "Prints all GDB calls to the console", @@ -322,6 +327,11 @@ "prettyPrinters" ] }, + "frameFilters": { + "type": "boolean", + "description": "Use frame filters registered in GDB", + "default": true + }, "printCalls": { "type": "boolean", "description": "Prints all GDB calls to the console", diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index 82e7ae6a..f28c61aa 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -54,7 +54,7 @@ class LogMessage { } } - logMsgProcess(parsed:any){ + logMsgProcess(parsed:MINode){ this.logMsgBrkList.forEach((brk)=>{ if(parsed.outOfBandRecord[0].output[0][1] == "breakpoint-hit" && parsed.outOfBandRecord[0].output[2][1] == brk.id){ this.logMsgVar = brk?.logMessage; @@ -264,6 +264,8 @@ export class MI2 extends EventEmitter implements IBackend { cmds.push(this.sendCommand("file-exec-and-symbols \"" + escape(target) + "\"")); if (this.prettyPrint) cmds.push(this.sendCommand("enable-pretty-printing")); + if (this.frameFilters) + cmds.push(this.sendCommand("enable-frame-filters")); for (const cmd of this.extraCommands) { cmds.push(this.sendCommand(cmd)); } @@ -794,6 +796,11 @@ export class MI2 extends EventEmitter implements IBackend { const func = MINode.valueOf(element, "@frame.func"); const filename = MINode.valueOf(element, "@frame.file"); let file: string = MINode.valueOf(element, "@frame.fullname"); + if (!file) { + // Fallback to using `file` if `fullname` is not provided. + // GDB does this for some reason when frame filters are used. + file = MINode.valueOf(element, "@frame.file"); + } if (file) { if (this.isSSH) file = path.posix.normalize(file); @@ -1012,6 +1019,7 @@ export class MI2 extends EventEmitter implements IBackend { } prettyPrint: boolean = true; + frameFilters: boolean = true; printCalls: boolean; debugOutput: boolean; features: string[]; diff --git a/src/gdb.ts b/src/gdb.ts index ecc6c3ce..b8d9d5ac 100644 --- a/src/gdb.ts +++ b/src/gdb.ts @@ -17,6 +17,7 @@ export interface LaunchRequestArguments extends DebugProtocol.LaunchRequestArgum stopAtEntry: boolean | string; ssh: SSHArguments; valuesFormatting: ValuesFormattingMode; + frameFilters: boolean; printCalls: boolean; showDevDebugOutput: boolean; } @@ -35,6 +36,7 @@ export interface AttachRequestArguments extends DebugProtocol.AttachRequestArgum stopAtEntry: boolean | string; ssh: SSHArguments; valuesFormatting: ValuesFormattingMode; + frameFilters: boolean; printCalls: boolean; showDevDebugOutput: boolean; } @@ -69,6 +71,7 @@ class GDBDebugSession extends MI2DebugSession { this.started = false; this.crashed = false; this.setValuesFormattingMode(args.valuesFormatting); + this.miDebugger.frameFilters = !!args.frameFilters; this.miDebugger.printCalls = !!args.printCalls; this.miDebugger.debugOutput = !!args.showDevDebugOutput; this.stopAtEntry = args.stopAtEntry; @@ -113,6 +116,7 @@ class GDBDebugSession extends MI2DebugSession { this.initialRunCommand = args.stopAtConnect ? RunCommand.NONE : RunCommand.CONTINUE; this.isSSH = false; this.setValuesFormattingMode(args.valuesFormatting); + this.miDebugger.frameFilters = !!args.frameFilters; this.miDebugger.printCalls = !!args.printCalls; this.miDebugger.debugOutput = !!args.showDevDebugOutput; this.stopAtEntry = args.stopAtEntry; diff --git a/src/mibase.ts b/src/mibase.ts index 4538d565..9bc16127 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -320,7 +320,7 @@ export class MI2DebugSession extends DebugSession { ret.push(new StackFrame( this.threadAndLevelToFrameId(args.threadId, element.level), - element.function + "@" + element.address, + element.function + (element.address ? "@" + element.address : ""), source, element.line, 0)); From 6f48d8624b51f1d3ba4cd3417f189657a6434a72 Mon Sep 17 00:00:00 2001 From: xuhong Date: Fri, 23 Aug 2024 17:36:45 +0800 Subject: [PATCH 18/22] 1.add static variable support --- CHANGELOG.md | 1 + src/backend/gdb_expansion.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b41a3c0b..f52dac84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Versioning]. ### Added +- add static variable support ([@henryriley0]) - fix gdb check error when debug beginning ([@henryriley0]) - fix implicitly type error in log message when build vsix ([@henryriley0]) - check for configured debugger before start to provide a nicer error message diff --git a/src/backend/gdb_expansion.ts b/src/backend/gdb_expansion.ts index 250a0d03..0b10e6d0 100644 --- a/src/backend/gdb_expansion.ts +++ b/src/backend/gdb_expansion.ts @@ -197,6 +197,7 @@ export function expandValue(variableCreate: (arg: VariableObject | string, optio parseResult = (pushToStack: boolean = false) => { value = value.trim(); + value = value.replace(/^static /, ""); const variableMatch = resultRegex.exec(value); if (!variableMatch) return undefined; From 5dac985feb1c98fb69339937cbb0ca7b1a6f3896 Mon Sep 17 00:00:00 2001 From: xuhong Date: Tue, 27 Aug 2024 09:40:02 +0800 Subject: [PATCH 19/22] 1.fix missing output of variable type for structure --- CHANGELOG.md | 1 + src/mibase.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f52dac84..0f844a77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Versioning]. ### Added +- fix missing output of variable type for structure ([@henryriley0]) - add static variable support ([@henryriley0]) - fix gdb check error when debug beginning ([@henryriley0]) - fix implicitly type error in log message when build vsix ([@henryriley0]) diff --git a/src/mibase.ts b/src/mibase.ts index 9bc16127..499293e4 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -517,7 +517,7 @@ export class MI2DebugSession extends DebugSession { variables.push({ name: variable.name, type: variable.type, - value: "", + value: variable.type, variablesReference: createVariable(variable.name) }); } From 8403fb5ecdf3d6336c2cb0b5674c468efbfea17b Mon Sep 17 00:00:00 2001 From: oltolm Date: Sat, 24 Aug 2024 17:45:10 +0200 Subject: [PATCH 20/22] prevent error in evaluateRequest in the "hover" context --- CHANGELOG.md | 1 + src/mibase.ts | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f844a77..6112a983 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ Versioning]. ([@GitMensch]) - New `frameFilters` option for GDB that allows using custom frame filters, enabled by default ([@JacquesLucke]) +- Suppress error for hover as the user may just play with the mouse ([@oltolm]). ## [0.27.0] - 2024-02-07 diff --git a/src/mibase.ts b/src/mibase.ts index 499293e4..1aa859a5 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -715,7 +715,12 @@ export class MI2DebugSession extends DebugSession { }; this.sendResponse(response); }, msg => { - this.sendErrorResponse(response, 7, msg.toString()); + if (args.context == "hover") { + // suppress error for hover as the user may just play with the mouse + this.sendResponse(response); + } else { + this.sendErrorResponse(response, 7, msg.toString()); + } }); } else { this.miDebugger.sendUserInput(args.expression, threadId, level).then(output => { From 1328784e5c9ab127d80cf65a9f5396c41650e59c Mon Sep 17 00:00:00 2001 From: xuhong Date: Wed, 18 Sep 2024 17:42:47 +0800 Subject: [PATCH 21/22] solve the problem of failed parsing of std containers, add test suite --- CHANGELOG.md | 1 + src/backend/gdb_expansion.ts | 27 +++++++-- src/mibase.ts | 9 ++- src/test/unit/gdb_expansion.test.ts | 88 +++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6112a983..9320aca8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Versioning]. - New `frameFilters` option for GDB that allows using custom frame filters, enabled by default ([@JacquesLucke]) - Suppress error for hover as the user may just play with the mouse ([@oltolm]). +- solve the problem of failed parsing of containers ([@henryriley0]) ## [0.27.0] - 2024-02-07 diff --git a/src/backend/gdb_expansion.ts b/src/backend/gdb_expansion.ts index 0b10e6d0..ba81fb8c 100644 --- a/src/backend/gdb_expansion.ts +++ b/src/backend/gdb_expansion.ts @@ -1,8 +1,8 @@ import { VariableObject } from "./backend"; import { MINode } from "./mi_parse"; -const resultRegex = /^([a-zA-Z_\-][a-zA-Z0-9_\-]*|\[\d+\])\s*=\s*/; -const variableRegex = /^[a-zA-Z_\-][a-zA-Z0-9_\-]*/; +const resultRegex = /^([a-zA-Z_\-][a-zA-Z0-9_\-<> :(),]*|\[\d+\])\s*=\s*/; +const variableRegex = /^[a-zA-Z_\-\'\(][a-zA-Z0-9_\-\|\>\ \\\'\)\:]*/; const errorRegex = /^\<.+?\>/; const referenceStringRegex = /^(0x[0-9a-fA-F]+\s*)"/; const referenceRegex = /^0x[0-9a-fA-F]+/; @@ -105,14 +105,18 @@ export function expandValue(variableCreate: (arg: VariableObject | string, optio const eqPos = value.indexOf("="); const newValPos1 = value.indexOf("{"); const newValPos2 = value.indexOf(","); + const newValPos3 = value.indexOf("}"); let newValPos = newValPos1; if (newValPos2 != -1 && newValPos2 < newValPos1) newValPos = newValPos2; - if (newValPos != -1 && eqPos > newValPos || eqPos == -1) { // is value list + if (newValPos != -1 && eqPos > newValPos || eqPos == -1 || eqPos > newValPos3 && newValPos2 != -1 || value.startsWith("std::")) { // is value list const values = []; stack.push("[0]"); let val = parseValue(); stack.pop(); + if(typeof val == "string" && val.endsWith('>')){ + val = val.substring(0, val.length - 2); + } values.push(createValue("[0]", val)); const remaining = value; let i = 0; @@ -191,18 +195,26 @@ export function expandValue(variableCreate: (arg: VariableObject | string, optio return parseCString(); else if (value[0] == '{') return parseTupleOrList(); + else if(value.startsWith("std::")){ + const eqPos = value.indexOf("="); + value = value.substring(eqPos + 2); + return parseValue(); + } else return parsePrimitive(); }; parseResult = (pushToStack: boolean = false) => { - value = value.trim(); - value = value.replace(/^static /, ""); + value = value.replace(/^ 1 && !name.includes("anonymous union") && !name.includes(',')){ + name = tmpName[tmpName.length - 1]; + } if (pushToStack) stack.push(variable); const val = parseValue(); @@ -231,6 +243,9 @@ export function expandValue(variableCreate: (arg: VariableObject | string, optio ref = variableCreate(getNamespace(name)); val = "..."; } + value = value.trim(); + value = value.replace(/^, /, ""); + return { name: name, value: val, diff --git a/src/mibase.ts b/src/mibase.ts index 1aa859a5..ba3fbeb5 100644 --- a/src/mibase.ts +++ b/src/mibase.ts @@ -537,7 +537,14 @@ export class MI2DebugSession extends DebugSession { // TODO: this evaluates on an (effectively) unknown thread for multithreaded programs. variable = await this.miDebugger.evalExpression(JSON.stringify(id), 0, 0); try { - let expanded = expandValue(createVariable, variable.result("value"), id, variable); + let variableValue = variable.result("value"); + const pattern = /'([^']*)' /g; + variableValue = variableValue.replace(pattern, (_: any, char: string, count: string) => { + const repeatCount = parseInt(count, 10) + 1; + const repeatedArray = Array(repeatCount).fill(char); + return `{${repeatedArray.map(item => `'${item}'`).join(', ')}}`; + }); + let expanded = expandValue(createVariable, variableValue, id, variable); if (!expanded) { this.sendErrorResponse(response, 2, `Could not expand variable`); } else { diff --git a/src/test/unit/gdb_expansion.test.ts b/src/test/unit/gdb_expansion.test.ts index 2bc5f085..a455b876 100644 --- a/src/test/unit/gdb_expansion.test.ts +++ b/src/test/unit/gdb_expansion.test.ts @@ -304,4 +304,92 @@ suite("GDB Value Expansion", () => { { name: "floatval2", value: "234.45", variablesReference: 0 } ]); }); + test("std container values", () => { + let node = `std::vector of length 4, capacity 6 = {1, 2, 3, 4}`; + let variables = expandValue(variableCreate, node); + assert.strictEqual(variables[3].value, `4`); + node = `std::deque with 7 elements = {0, 1, 2, 3, 4, 5, 6}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[6].value, `6`); + node = `std::__cxx11::list = {[0] = 6, [1] = 7, [2] = 8, [3] = 9, [4] = 10}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[4].value, `10`); + node = `std::vector of length 4, capacity 6 = {std::vector of length 3, capacity 3 = {1, 2, 3}, std::vector of length 3, capacity 3 = {4, 5, 6}, std::vector of length 3, capacity 3 = {7, 8, 9}, std::vector of length 4, capacity 4 = {1, 2, 3, 4}}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[3].variablesReference.expanded[3].value, `4`); + node = `std::deque with 3 elements = {std::deque with 2 elements = {10, 20}, std::deque with 2 elements = {30, 40}, std::deque with 7 elements = {0, 1, 2, 3, 4, 5, 6}}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[2].variablesReference.expanded[6].value, `6`); + node = `std::__cxx11::list = {[0] = std::__cxx11::list = {[0] = 11, [1] = 12}, [1] = std::__cxx11::list = {[0] = 13, [1] = 14}, [2] = std::__cxx11::list = {[0] = 6, [1] = 7, [2] = 8, [3] = 9, [4] = 10}}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[2].variablesReference.expanded[4].value, `10`); + node = `std::forward_list = {[0] = 0, [1] = 1, [2] = 2, [3] = 3}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[3].value, `3`); + node = `std::set with 5 elements = {[0] = 1, [1] = 2, [2] = 3, [3] = 4, [4] = 5}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[4].value, `5`); + node = `std::multiset with 6 elements = {[0] = 1, [1] = 2, [2] = 2, [3] = 2, [4] = 3, [5] = 4}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[5].value, `4`); + node = `std::map with 3 elements = {[1] = \"one\", [2] = \"two\", [3] = \"three\"}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[2].value, `"three"`); + node = `std::multimap with 3 elements = {[1] = \"one\", [2] = \"two\", [2] = \"another two\"}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[2].value, `"another two"`); + node = `std::unordered_set with 5 elements = {[0] = 5, [1] = 2, [2] = 3, [3] = 1, [4] = 4}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[4].value, `4`); + node = `std::unordered_multiset with 6 elements = {[0] = 1, [1] = 2, [2] = 2, [3] = 2, [4] = 3, [5] = 4}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[5].value, `4`); + node = `std::unordered_map with 3 elements = {[3] = \"three\", [1] = \"one\", [2] = \"two\"}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[2].value, `"two"`); + node = `std::unordered_multimap with 3 elements = {[2] = \"another two\", [2] = \"two\", [1] = \"one\"}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[2].value, `"one"`); + node = `std::stack wrapping: std::deque with 2 elements = {1, 2}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[1].value, `2`); + node = `std::queue wrapping: std::deque with 2 elements = {1, 2}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[1].value, `2`); + node = `std::priority_queue wrapping: std::vector of length 3, capacity 4 = {4, 1, 3}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[2].value, `3`); + node = `std::bitset = {[0] = 1, [2] = 1, [4] = 1, [6] = 1, [7] = 1}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[3].value, `1`); + node = `{_M_elems = {1, 2, 3}}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[0].variablesReference.expanded[2].value, `3`); + node = `std::unique_ptr = {get() = 0x5555555d7d20}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[0].name, `get()`); + assert.strictEqual(variables[0].value, `Object@*0x5555555d7d20`); + node = `std::unique_ptr = {get() = 0x5555555d7d40}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[0].name, `get()`); + assert.strictEqual(variables[0].value, `Object@*0x5555555d7d40`); + node = `std::shared_ptr (use count 1, weak count 1) = {get() = 0x5555555d7d70}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[0].name, `get()`); + assert.strictEqual(variables[0].value, `Object@*0x5555555d7d70`); + node = `{> = {static _S_alignment = 4, _M_i = 0}, }`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[0].name, `std::__atomic_base>`); + assert.strictEqual(variables[0].variablesReference.expanded[1].name, `_M_i`); + assert.strictEqual(variables[0].variablesReference.expanded[1].value, `0`); + node = `{ = {_M_mutex = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 0, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, __size = '\\000' , __align = 0}}, }`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[0].variablesReference.expanded[0].variablesReference.expanded[0].variablesReference.expanded[7].variablesReference.expanded[1].name, `__next`); + assert.strictEqual(variables[0].variablesReference.expanded[0].variablesReference.expanded[0].variablesReference.expanded[7].variablesReference.expanded[1].value, ``); + node = `{static icase = , static nosubs = , static optimize = , static collate = , static ECMAScript = (unknown: 16), static basic = , static extended = , static awk = , static grep = , static egrep = , _M_flags = (unknown: 16), _M_loc = {static none = 0, static ctype = 1, static numeric = 2, static collate = 4, static time = 8, static monetary = 16, static messages = 32, static all = 63, _M_impl = 0x7ffff7fa8ce0, static _S_classic = , static _S_global = , static _S_categories = , static _S_once = , static _S_twinned_facets = }, _M_automaton = std::shared_ptr >> (use count 1, weak count 0) = {get() = 0x5555555d81b0}}`; + variables = expandValue(variableCreate, node); + assert.strictEqual(variables[12].name, `_M_automaton`); + assert.strictEqual(variables[12].variablesReference.expanded[0].value, `Object@*0x5555555d81b0`); + + }); }); From 97efe10d1f0c78191563cda2d43ea76ad768f2fa Mon Sep 17 00:00:00 2001 From: chenzhiy2001 Date: Wed, 18 Sep 2024 07:01:02 -0700 Subject: [PATCH 22/22] Add `registerLimit` config option to specify the registers to list in Registers view --- CHANGELOG.md | 3 +++ README.md | 14 ++++++++++++++ package.json | 30 ++++++++++++++++++++++++++++++ src/backend/mi2/mi2.ts | 3 ++- src/gdb.ts | 4 ++++ src/lldb.ts | 4 ++++ src/mago.ts | 4 ++++ 7 files changed, 61 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9320aca8..47db805e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ Versioning]. enabled by default ([@JacquesLucke]) - Suppress error for hover as the user may just play with the mouse ([@oltolm]). - solve the problem of failed parsing of containers ([@henryriley0]) +- Fixes #421 - Added `registerLimit` option to specify the registers to + display - PR #444 ([@chenzhiy2001]) ## [0.27.0] - 2024-02-07 @@ -243,6 +245,7 @@ Versioning]. [@abussy-aldebaran]: https://github.com/abussy-aldebaran [@anshulrouthu]: https://github.com/anshulrouthu [@brownts]: https://github.com/brownts +[@chenzhiy2001]: https://github.com/chenzhiy2001 [@coldencullen]: https://github.com/ColdenCullen [@eamousing]: https://github.com/eamousing [@evangrayk]: https://github.com/evangrayk diff --git a/README.md b/README.md index 21fc0041..603bdf8c 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,20 @@ that location prior to continuing execution. Note that stopping at the entry po attach configuration assumes that the entry point has not yet been entered at the time of attach, otherwise this will have no affect. +There is a Registers view in the VARIABLES view. As we fetch all registers at once, there can +be cases where a register that cannot be fetched causes the entire register request to fail, +corrupting the entire Registers output. If this happens, you might need to set the +`registerLimit` option to specify which registers you want the debugger to fetch +automatically. + +For example, to display only registers `rax` and `rip` in an x64 debug session, send the +command `-data-list-register-names` in the debug console of an active x64 debug session. +You will then receive a response containing an array starting with `["rax","rbx" ...]`. +In this array, the index of `rax` is 0 and `rip` is 16, so set the option as +`"registerLimit": "0 16"`. If you find the response text hard to navigate, you can paste +it into a browser's developer tools console and press enter to get an expandable response +object with array elements' indices explicitly displayed. + ### Attaching to existing processes Attaching to existing processes currently only works by specifying the PID in the diff --git a/package.json b/package.json index 5454bf60..107d5131 100644 --- a/package.json +++ b/package.json @@ -299,6 +299,11 @@ "description": "Content will be executed on the SSH host before the debugger call." } } + }, + "registerLimit": { + "type": "string", + "description": "List of numbers specifying the registers to display. An empty string indicates that the contents of all the registers must be returned.", + "default": "" } } }, @@ -468,6 +473,11 @@ "description": "Content will be executed on the SSH host before the debugger call." } } + }, + "registerLimit": { + "type": "string", + "description": "List of numbers specifying the registers to display. An empty string indicates that the contents of all the registers must be returned.", + "default": "" } } } @@ -766,6 +776,11 @@ "description": "Content will be executed on the SSH host before the debugger call." } } + }, + "registerLimit": { + "type": "string", + "description": "List of numbers specifying the registers to display. An empty string indicates that the contents of all the registers must be returned.", + "default": "" } } }, @@ -846,6 +861,11 @@ ], "description": "Whether debugger should stop at application entry point", "default": false + }, + "registerLimit": { + "type": "string", + "description": "List of numbers specifying the registers to display. An empty string indicates that the contents of all the registers must be returned.", + "default": "" } } } @@ -992,6 +1012,11 @@ "type": "array", "description": "mago commands to run when starting to debug", "default": [] + }, + "registerLimit": { + "type": "string", + "description": "List of numbers specifying the registers to display. An empty string indicates that the contents of all the registers must be returned.", + "default": "" } } }, @@ -1057,6 +1082,11 @@ "type": "boolean", "description": "Whether debugger should stop after connecting to target", "default": false + }, + "registerLimit": { + "type": "string", + "description": "List of numbers specifying the registers to display. An empty string indicates that the contents of all the registers must be returned.", + "default": "" } } } diff --git a/src/backend/mi2/mi2.ts b/src/backend/mi2/mi2.ts index f28c61aa..5b91e593 100644 --- a/src/backend/mi2/mi2.ts +++ b/src/backend/mi2/mi2.ts @@ -883,7 +883,7 @@ export class MI2 extends EventEmitter implements IBackend { async getRegisterValues(): Promise { if (trace) this.log("stderr", "getRegisterValues"); - const result = await this.sendCommand("data-list-register-values N"); + const result = await this.sendCommand("data-list-register-values --skip-unavailable N " + this.registerLimit); const nodes = result.result('register-values'); if (!Array.isArray(nodes)) { throw new Error('Failed to retrieve register values.'); @@ -1024,6 +1024,7 @@ export class MI2 extends EventEmitter implements IBackend { debugOutput: boolean; features: string[]; public procEnv: any; + public registerLimit: string; protected isSSH: boolean; protected sshReady: boolean; protected currentToken: number = 1; diff --git a/src/gdb.ts b/src/gdb.ts index b8d9d5ac..c1e178c0 100644 --- a/src/gdb.ts +++ b/src/gdb.ts @@ -20,6 +20,7 @@ export interface LaunchRequestArguments extends DebugProtocol.LaunchRequestArgum frameFilters: boolean; printCalls: boolean; showDevDebugOutput: boolean; + registerLimit: string; } export interface AttachRequestArguments extends DebugProtocol.AttachRequestArguments { @@ -39,6 +40,7 @@ export interface AttachRequestArguments extends DebugProtocol.AttachRequestArgum frameFilters: boolean; printCalls: boolean; showDevDebugOutput: boolean; + registerLimit: string; } class GDBDebugSession extends MI2DebugSession { @@ -75,6 +77,7 @@ class GDBDebugSession extends MI2DebugSession { this.miDebugger.printCalls = !!args.printCalls; this.miDebugger.debugOutput = !!args.showDevDebugOutput; this.stopAtEntry = args.stopAtEntry; + this.miDebugger.registerLimit = args.registerLimit ?? ""; if (args.ssh !== undefined) { if (args.ssh.forwardX11 === undefined) args.ssh.forwardX11 = true; @@ -120,6 +123,7 @@ class GDBDebugSession extends MI2DebugSession { this.miDebugger.printCalls = !!args.printCalls; this.miDebugger.debugOutput = !!args.showDevDebugOutput; this.stopAtEntry = args.stopAtEntry; + this.miDebugger.registerLimit = args.registerLimit ?? ""; if (args.ssh !== undefined) { if (args.ssh.forwardX11 === undefined) args.ssh.forwardX11 = true; diff --git a/src/lldb.ts b/src/lldb.ts index 5db0bbea..0d7bbd46 100644 --- a/src/lldb.ts +++ b/src/lldb.ts @@ -18,6 +18,7 @@ export interface LaunchRequestArguments extends DebugProtocol.LaunchRequestArgum valuesFormatting: ValuesFormattingMode; printCalls: boolean; showDevDebugOutput: boolean; + registerLimit: string; } export interface AttachRequestArguments extends DebugProtocol.AttachRequestArguments { @@ -34,6 +35,7 @@ export interface AttachRequestArguments extends DebugProtocol.AttachRequestArgum valuesFormatting: ValuesFormattingMode; printCalls: boolean; showDevDebugOutput: boolean; + registerLimit: string; } class LLDBDebugSession extends MI2DebugSession { @@ -66,6 +68,7 @@ class LLDBDebugSession extends MI2DebugSession { this.miDebugger.printCalls = !!args.printCalls; this.miDebugger.debugOutput = !!args.showDevDebugOutput; this.stopAtEntry = args.stopAtEntry; + this.miDebugger.registerLimit = args.registerLimit ?? ""; if (args.ssh !== undefined) { if (args.ssh.forwardX11 === undefined) args.ssh.forwardX11 = true; @@ -110,6 +113,7 @@ class LLDBDebugSession extends MI2DebugSession { this.miDebugger.printCalls = !!args.printCalls; this.miDebugger.debugOutput = !!args.showDevDebugOutput; this.stopAtEntry = args.stopAtEntry; + this.miDebugger.registerLimit = args.registerLimit ?? ""; this.miDebugger.attach(args.cwd, args.executable, args.target, args.autorun || []).then(() => { this.sendResponse(response); }, err => { diff --git a/src/mago.ts b/src/mago.ts index df53e6df..20f7f2fe 100644 --- a/src/mago.ts +++ b/src/mago.ts @@ -15,6 +15,7 @@ export interface LaunchRequestArguments extends DebugProtocol.LaunchRequestArgum valuesFormatting: ValuesFormattingMode; printCalls: boolean; showDevDebugOutput: boolean; + registerLimit: string; } export interface AttachRequestArguments extends DebugProtocol.AttachRequestArguments { @@ -29,6 +30,7 @@ export interface AttachRequestArguments extends DebugProtocol.AttachRequestArgum valuesFormatting: ValuesFormattingMode; printCalls: boolean; showDevDebugOutput: boolean; + registerLimit: string; } class MagoDebugSession extends MI2DebugSession { @@ -66,6 +68,7 @@ class MagoDebugSession extends MI2DebugSession { this.setValuesFormattingMode(args.valuesFormatting); this.miDebugger.printCalls = !!args.printCalls; this.miDebugger.debugOutput = !!args.showDevDebugOutput; + this.miDebugger.registerLimit = args.registerLimit ?? ""; this.miDebugger.load(args.cwd, args.target, args.arguments, undefined, args.autorun || []).then(() => { this.sendResponse(response); }, err => { @@ -88,6 +91,7 @@ class MagoDebugSession extends MI2DebugSession { this.setValuesFormattingMode(args.valuesFormatting); this.miDebugger.printCalls = !!args.printCalls; this.miDebugger.debugOutput = !!args.showDevDebugOutput; + this.miDebugger.registerLimit = args.registerLimit ?? ""; this.miDebugger.attach(args.cwd, args.executable, args.target, args.autorun || []).then(() => { this.sendResponse(response); }, err => {