- 適用於 JDK 23 的 GraalVM (最新)
- 適用於 JDK 24 的 GraalVM (搶先體驗)
- 適用於 JDK 21 的 GraalVM
- 適用於 JDK 17 的 GraalVM
- 封存
- 開發版本
除錯器介面協定
GraalVM 支援對使用任何支援語言(JavaScript/TypeScript、Python、R 或 Ruby)編寫的客體語言應用程式進行除錯,並提供 除錯器介面協定 (DAP) 的內建實作。根據定義,除錯器介面協定是為了標準化除錯元件與具體的除錯器或執行時期之間的「通訊」。這允許您將相容的除錯器(例如 Visual Studio Code (VS Code))附加到 GraalVM。
若要開啟提供除錯器介面協定的除錯器埠,您需要將 --dap
選項傳遞給命令列啟動器。除錯器介面協定的使用方式與 GraalVM 執行時期的現有 Chrome 開發人員工具協定實作 類似。
--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 除錯客體語言應用程式時,使用者可以透過將對應除錯設定中的 protocol 屬性設為 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 開發人員工具,使用除錯器介面協定的優點是 (1) 它「原生」於 Visual Studio Code (VS Code),表示它不需要任何中間轉譯,以及 (2) 它支援多執行緒,這在除錯 Ruby 應用程式時特別有用。