VS Code:如何从扩展内访问调试变量?

Mic*_*lus 6 visual-studio-code vscode-extensions vscode-debugger

我正在为 Visual Studio 代码编写一个扩展,我想在其中评估 javascript 调试会话的当前变量。当打开该部分下的调试窗格时,通常会显示这些变量VARIABLES。请参阅随附的屏幕截图。

Visual Studio 代码中的调试变量窗格

我想在用户右键单击编辑器时访问这些变量,但我不知道如何操作。

我当前的扩展设置是这样的:在package.json我已经注册了一个菜单贡献和一个命令:

"contributes": {
    "menus": {
        "editor/context": [{
            "command": "extension.showVariables",
            "group": "navigation"
        }]
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的 extension.ts 中,我注册了这样的命令:

export function activate(context: vscode.ExtensionContext) {

    let disposable = vscode.commands.registerCommand('extension.showVariables', () => {

        // TODO: let variables = vscode.debug.activeDebugSession.variables.toString();

        vscode.window.showInformationMessage(variables);
    });
}
Run Code Online (Sandbox Code Playgroud)

我试图让它们通过,vscode.debug.activeDebugSession但这里没有变量的 API。我还尝试注册一个事件处理程序,vscode.debug.onDidReceiveDebugSessionCustomEvent但我不知道在哪里搜索调试变量。

是否可以在 vs 扩展中访问这些变量,或者我是否需要实现自己的调试器?

Mic*_*lus 2

我已经设法访问局部变量,尽管这不是通用解决方案 - 它可能只能在单线程调试器中工作。如果您知道更好的方法,请回答或评论。

比如说,调试器中断了一个具有局部变量的方法car

为了获取 的值,我在活动调试会话上car使用该方法:customRequest

const session = vscode.debug.activeDebugSession;
const response = await session.customRequest('evaluate', { expression: 'car', frameId: frameId });
const car = response.result;
Run Code Online (Sandbox Code Playgroud)

为了获取frameId,我使用了另一个调用customRequest

const session = vscode.debug.activeDebugSession;
const response = await session.customRequest('stackTrace', { threadId: 1 })
const frameId = response.stackFrames[0].id;
Run Code Online (Sandbox Code Playgroud)

为了在我的扩展中获取真实的汽车对象(不是字符串表示形式),我在 customRequest"JSON.stringify(car)"中作为表达式传递evaluate。然后,我就可以使用JSON.parse(response.result).

要获取所有范围、堆栈和变量,请查看 Debug Session API和DebugProtocol的规范。