4

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

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

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

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

"contributes": {
    "menus": {
        "editor/context": [{
            "command": "extension.showVariables",
            "group": "navigation"
        }]
    }
}

在我的 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);
    });
}

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

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

4

2 回答 2

2

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

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

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

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

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

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

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

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

于 2018-05-15T09:16:14.500 回答
1

您必须使用调试适配器协议直接使用vscode.debug.activeDebugSession.customRequest(command: string, args?: any)( Ref )与调试适配器通信

该函数接收 2 个参数:command 和 args。查看此资源以查找这些参数的所有可能值。一个例子是Michael Hilus他的回答中使用的“评估”命令:

在此处输入图像描述

如果要在多线程调试会话中获取变量,则必须按此顺序执行这些请求

  1. 线程请求:获取线程 ID
  2. StackTrace 请求:获取帧 ID
  3. 范围请求:获取变量参考
  4. 变量请求:最后,获取变量名及其值。如果一个变量是一个对象,您可能希望再次使用变量请求,该变量的 variablesReference 具有对象值。

PS:在 DAP 规范中很难找到你想要的东西,所以这里有一个提示:

  1. 转到右侧菜单中的“类型”部分并找到您想要的内容。例如,断点。
  2. Ctrl+F 并搜索“:断点”
  3. 查看每个请求的响应部分中的所有匹配项。

在这种情况下,variablesReference我必须variablesReference: number在 Evaluate Request、Scope (type) 和 Variable (also type) 的响应中搜索找到它。

于 2020-12-30T13:59:20.853 回答