【问题标题】:Debugging a crashing language server调试崩溃的语言服务器
【发布时间】:2017-06-03 12:10:24
【问题描述】:

如果我在这里的细节有点低,我深表歉意,但主要问题实际上是试图找到我的代码的问题。我正在更新我自己的基于语言服务器示例 (https://code.visualstudio.com/docs/extensions/example-language-server) 的旧扩展。我遇到了一个问题,当我使用 F5 运行代码的客户端部分时,调试窗口会触发,我得到:

CSSLint 语言客户端服务器在过去 3 分钟内崩溃了 5 次。服务器不会重启。

好的...所以...事情就是这样。我的扩展客户端代码中的问题视图没有显示任何内容。该代码窗口的 DevTools 没有显示任何内容。

我的服务器代码的问题视图没有显示任何内容。开发工具,同上。

对于 Extension Developer Host 实例,DevTools 确实显示了这一点:

messageService.ts:126 CSSLint 语言客户端服务器在过去 3 分钟内崩溃了 5 次。服务器不会重启。e.doShow@messageService.ts:126

但我无法深入研究细节以找到错误。所以问题是 - 假设我的服务器代码出现故障,错误究竟在哪里出现?

【问题讨论】:

  • 据我所知-问题出在服务器端的特定要求语句上。我现在运行它,但我需要回到原始代码并使其工作,这需要我能够以某种方式找到错误。

标签: visual-studio-code vscode-extensions language-server-protocol


【解决方案1】:

这是我通常用来跟踪服务器崩溃的方法(我假设您的服务器是用 JavaScript / TypeScript 编写的)。

使用以下服务器选项:

    let serverModule = "path to your server"
let debugOptions = { execArgv: ["--nolazy", "--debug=6009"] };
let serverOptions = {
    run: { module: serverModule, transport: TransportKind.ipc },
    debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions}
};

这里的关键是使用 TransportKind.ipc。服务器中发生并打印到 stdio 的错误将显示在与您的服务器关联的输出通道中(输出通道的名称是传递给 LanguageClient 的名称)

如果要调试服务器启动/初始化序列,可以将 debugOptions 更改为:

let debugOptions = { execArgv: ["--nolazy", "--debug-brk=6009"] };

如果扩展以调试模式启动(例如,例如使用 F5 从 VS Code 启动),则 LanguageClient 会自动以调试模式启动服务器。如果扩展正常启动(例如作为 VS Code 中的真正扩展),那么服务器也正常启动。

为了使这一切正常工作,您需要最新版本的 LSP 节点 npm 模块,用于服务器和客户端(例如 2.6.x)

【讨论】:

  • 所以我尝试了你建议的 debug-brk 东西,并在我的服务器代码中添加:let foo = require2('./csslint');然后我进行了构建,在我的客户端代码中,按 f5,我的第三个 VSCode 窗口弹出。但我在客户端代码窗口中什么也看不到。没有迹象表明服务器代码有任何问题。
  • 您提到您基于code.visualstudio.com/docs/extensions/example-language-server 的语言服务器。那里有如何调试客户端和服务器的步骤。如果您使用 --debug-brk 启动服务器,它将在 server.js 文件的第一条语句处中断。因此,您需要在通过 --debug-brk 传递的端口上将调试器附加到服务器。这将允许您单步执行您的服务器代码。你的项目在 GitHub 上可用吗?如果是这样,我可以看看并帮助设置所有内容。
  • 是的 - 我正在关注 tut - 主要区别是您在上面使用了 6009,而他们似乎使用的是 6004。就操作顺序而言 - 服务器中的 ctrl+shift+b,客户端中的 f5 ,然后在服务器中 f5。控制台中仍然没有任何内容。我可以分享代码 - 让我检查一下 - 但请注意它在 server.js 中有一个故意的错误,试图帮助充实它。
猜你喜欢
  • 1970-01-01
  • 2022-07-14
  • 2016-06-12
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多