- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
调试适配器协议
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 调试访客语言应用程序时,用户可以通过将相应调试配置中的协议属性设置为 chromeDevTools
或 debugAdapter
来选择要使用的协议。在这种情况下,要连接到打开的 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 应用程序特别有用。