VS Code: Как получить доступ к отладочным переменным из расширения? - PullRequest
0 голосов
/ 11 мая 2018

Я пишу расширение для кода Visual Studio, в котором я хочу оценить текущие переменные сеанса отладки JavaScript. Эти переменные обычно отображаются, когда открыта панель отладки в разделе VARIABLES. Смотрите прикрепленный скриншот.

Debug variables pane in visual studio code

Я хочу получить доступ к этим переменным, когда пользователь щелкает правой кнопкой мыши на редакторе, но я не знаю, как.

Моя текущая настройка расширения для этого такова: в 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 или мне нужно реализовать собственный отладчик?

1 Ответ

0 голосов
/ 15 мая 2018

Мне удалось получить доступ к локальным переменным, хотя это не общее решение - оно может работать только в однопоточном отладчике. Если вы знаете какой-либо способ лучше, пожалуйста, ответьте или прокомментируйте.

Скажем, отладчик прерывает метод с локальной переменной 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).

Чтобы получить все области, стеки и переменные, взгляните на API сеанса отладки и спецификация DebugProtocol .

...