【问题标题】:VS Code: How to access debug variables from within extension?VS Code:如何从扩展中访问调试变量?
【发布时间】:2018-10-21 14:02:46
【问题描述】:

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

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

我当前的扩展设置是这样的:在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 扩展中访问这些变量还是我需要实现自己的调试器?

【问题讨论】:

  • 我刚刚看到我可以向调试适配器发送customRequest(评估)。但是要获取局部变量,我需要传递一个 frameId(或通过传递一个线程 id 来获取调用堆栈/帧)。如何获取调试器的线程id?

标签: visual-studio-code vscode-extensions vscode-debugger


【解决方案1】:

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

比如说,调试器中断了一个具有局部变量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;

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

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

【讨论】:

  • 不幸的是,它对我的​​调试提供者不起作用,我想每个调试提供者都可以随心所欲地实现这个功能,你怎么知道有evaluatestackTrace自定义请求?你手头有文档参考吗?
  • 我查看了代码,挖掘后发现:github.com/Microsoft/vscode-debugadapter-node/blob/master/…
【解决方案2】:

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

此函数接收 2 个参数:command 和 args。查看this resource 以查找这些参数的所有可能值。一个例子是 Michael Hilushis answer 中使用的“评估”命令:

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

  1. Threads Request:获取线程ID
  2. StackTrace Request: 获取框架ID
  3. Scopes Request:获取变量参考
  4. Variables Request:最后,获取变量名及其值。如果变量是对象,您可能希望再次使用 Variables Request 与具有对象值的变量的 variablesReference。

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

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

对于variablesReference,我必须搜索variablesReference: number,才能在评估请求、范围(类型)和变量(也是类型)的响应中找到它。

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多