Debug Adapter Protocol

GraalVMでは、サポートされているすべての言語(JavaScript/TypeScript、Python, R、Ruby)で記述されたゲスト言語アプリケーションのデバッグがサポートされ、Debug Adapter Protocol (DAP)の組込み実装が提供されています。Debug Adapter Protocolは、デバッグ・コンポーネントと具体的なデバッガまたはランタイムの間の通信を標準化することを目的としています。これにより、Visual Studio Code (VS Code)などの互換性のあるデバッガをGraalVMにアタッチできます。

Debug Adapter Protocolを提供するデバッガ・ポートを開くには、コマンドライン・ランチャに--dapオプションを渡す必要があります。Debug Adapter Protocolの使用方法は、GraalVMランタイムの既存のChrome DevTools Protocol実装の場合と似ています:

次に、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. 「View」→「Run」に移動して、起動構成([Ctrl]+[Shift]+[D])を作成します:

7. 次のコンテンツのlaunch.jsonファイルを作成します:

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

8. デバッグを開始します([F5])。

その他のアプローチは、VS CodeをGraalVM拡張機能がインストールされた状態で使用することです。「Node.js and JavaScript Debugging」で説明されているステップに従って、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よりもDebug Adapter Protocolを使用する利点は、(1) Visual Studio Code (VS Code)に対してネイティブであり、中間変換を必要としないこと、(2)マルチスレッドがサポートされており、特に、Rubyアプリケーションなどのデバッグに役立つこと、の2点です。