如何使用DebugSession.customRequest运行任意gdb命令并获得结果

时间:2019-03-23 17:38:32

标签: typescript visual-studio-code

我正在使用扩展中的VSCode调试API。我的目标是在调试会话期间从gdb / lldb调试器读取C ++程序的CPU寄存器。我还对其他调试器不提供的其他要求(读取内存,反汇编等)有类似要求

扩展程序中包含以下内容...如果需要,我可以提供完整的测试用例。是的,我知道我这里有个错误,因为第一次等待后,该会话可能不再处于活动状态,并且没有显示完整的错误检查。

static async getRegisters() {
    const session = vscode.debug.activeDebugSession;
    if (session && text) {      // Make sure we still have a session
        // The following gets me the right result
        const sTrace = await session.customRequest('stackTrace', { threadId: 1 });
        const frameId = sTrace.stackFrames[0].id; 

        // The following does execute but the results are printed to debug console
        // rather than returning the result
        // I tried many variations of arguments and contexts types
        const text = '-exec -data-list-register-names';
        const arg : DebugProtocol.EvaluateArguments = {expression: text, frameId: frameId, context:'hover'};
        session.customRequest('evaluate', arg).then((response) => {
            console.log(response.result); 
        });
    }
}

我希望以某种方式将gdb的结果提供回我的扩展程序。结果将被打印到调试控制台,而我得到一个空字符串。我也尝试过为自定义命令设置事件处理程序vscode.debug.onDidReceiveDebugSessionCustomEvent,但不会触发任何事件。有更好的方法吗?

也许customRequest的第一个参数不应该是'evaluate',但是在DebugProtocol spec.中看不到其他任何东西可以向实际调试器发送自定义命令。

1 个答案:

答案 0 :(得分:1)

同一期!这是我的解决方案:

  1. 注册“ DebugAdapterTracker”(我相信您已经知道);
  2. 在跟踪器的“ onDidSendMessage(message:any)”中,请注意“事件”消息,尤其是在“ message.event ===” output””时;
  3. 惊奇地检查“ message.body.output”!

DA似乎没有触发具有正确值的响应,而是直接触发了要在调试控制台上打印的事件。