调试适配器协议

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

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

  • --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 Dev Tools 相比,使用调试适配器协议的优势在于 (1) 它对 Visual Studio Code (VS Code) 而言是“原生”的,这意味着它不需要任何中间转换,以及 (2) 它支持多线程,这对于调试例如 Ruby 应用程序特别有用。

联系我们