调试适配器协议

GraalVM 支持调试以任何支持语言(JavaScript/TypeScript、Python、R 或 Ruby)编写的访客语言应用程序,并提供 调试适配器协议 (DAP) 的内置实现。根据定义,调试适配器协议用于标准化调试组件和具体调试器或运行时之间的“通信”。这使您能够将兼容的调试器(如 Visual Studio Code (VS Code))附加到 GraalVM。

要打开一个提供调试适配器协议的调试器端口,您需要将 --dap 选项传递给命令行启动器。调试适配器协议的使用类似于 GraalVM 运行时中现有的 Chrome DevTools 协议实现

  • --dap.Suspend=false:禁用在第一行源代码处暂停执行,默认情况下启用。
  • --dap.WaitAttached:在调试器客户端连接之前不执行任何源代码。默认值为 false。
  • --dap=<[[host:]port]>:在与默认端口(<host>:4711)不同的端口上启动调试器。

然后,您需要一个 DAP 客户端连接到打开的 DAP 端口。将使用 VS Code 作为示例。

1. 将此 Node.js 应用程序保存在名为 App.js 的文件中

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.get('/neverCalled', (req, res) => {
  res.send('You should not be here')
})

app.get('/shutdown', (req, res) => {
  process.exit();
})
app.listen(port, () => console.log(`Example app listening on port ${port}!`))

2. 在保存文件的目录中安装 express 模块依赖项

$JAVA_HOME/bin/npm install express

3. 使用 DAP 启用运行应用程序

$JAVA_HOME/bin/node --dap App.js
[Graal DAP] Starting server and listening on localhost/127.0.0.1:4711

4. 启动 VS Code,新安装且没有扩展

code .

5. 在 VS Code 中打开 App.js 源代码,并在其中设置断点,例如在第 6 行(res.send('Hello World!'))设置。

6. 导航到“查看” > “运行” 以创建启动配置(Ctrl+Shift+D):创建启动配置

7. 然后使用以下内容创建 launch.json 文件

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach",
            "type": "node",
            "request": "attach",
            "debugServer": 4711
        }
    ]
}

8. 开始调试 (F5)。

另一种方法是使用安装了 GraalVM 扩展的 VS Code。按照 Node.js 和 JavaScript 调试 中描述的步骤操作,直接从 VS Code 启动要调试的应用程序。从 VS Code 调试访客语言应用程序时,用户可以通过将相应调试配置中的协议属性设置为 chromeDevToolsdebugAdapter 来选择要使用的协议。要在这种情况下连接到打开的 DAP 端口,launch.json 的内容应为

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "graalvm",
            "request": "launch",
            "name": "Launch Node App",
            "outputCapture": "std",
            "protocol": "debugAdapter",
            "program": "${workspaceFolder}/App.js"
        }
    ]
}

使用调试适配器协议而不是 Chrome DevTools 的优势在于:(1)它对 Visual Studio Code (VS Code) 来说是“本地的”,这意味着它不需要任何中间转换,以及(2)它支持多线程,这在调试(例如,Ruby 应用程序)时可能特别有用。

联系我们