デバッグアダプタープロトコル

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

7. 次に、以下の内容でlaunch.jsonファイルを作成します

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

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

もう1つの方法は、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 Dev Toolsよりもデバッグアダプタープロトコルを使用する利点は、(1)Visual Studio Code(VS Code)に「ネイティブ」であり、中間翻訳が不要であること、(2)マルチスレッドをサポートしているため、たとえばRubyアプリケーションをデバッグするのに特に役立つことです。

お問い合わせ