Chromeデバッガ

GraalVMでは、ゲスト言語アプリケーションのデバッグがサポートされており、Chrome DevTools Protocolの組込み実装が提供されています。これにより、Chrome Developer Toolsなどの互換性のあるデバッガをGraalVMにアタッチできます。

ゲスト言語アプリケーションをデバッグするには、Node.js HelloWorldプログラムを使用した次の例のように、--inspectオプションをコマンドライン・ランチャに渡します:

var http = require('http');

var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello World!\n");
});

server.listen(8000);

console.log("Server running at http://localhost:8000/");
  1. このプログラムをHelloWorld.jsとして保存し、次のコマンドを実行します:
    $JAVA_HOME/bin/node --inspect --jvm HelloWorld.js
    Debugger listening on ws://127.0.0.1:9229/SBqxI5YIqtREaDrXkFr8hLE0HL1AfKx8TjkI8qPMq2s
    For help, see: https://www.graalvm.org/tools/chrome-debugger
    E.g. in Chrome open: devtools://devtools/bundled/js_app.html?ws=127.0.0.1:9229/SBqxI5YIqtREaDrXkFr8hLE0HL1AfKx8TjkI8qPMq2s
    
  2. ブラウザでhttp://localhost:8000/に移動して、ノード・アプリケーションを起動します。

  3. 別のChromeブラウザ・タブで、devtools:...リンクを開きます。

  4. HelloWorld.jsファイルに移動し、4行目でブレークポイントを送信します。

  5. node.jsアプリケーションをリフレッシュすると、ブレークポイントのヒットが表示されます。

これで、ツールチップ内のスタック、変数、評価変数、選択した式などを検査できます。たとえば、response変数の上にホバーすると、次のスクリーンショットに示すように、そのプロパティを検査できます:

Chrome DevToolsのデバッグ機能の詳細は、『JavaScript Debugging Reference』を参照してください。

このデバッグ・プロセスは、GraalVMでサポートされるすべてのゲスト言語に適用されます。RやRubyなどの他の言語は、ゲスト言語の相互運用性を使用しているときに言語境界をまたいでステップ実行するなど、JavaScriptと同様に簡単にデバッグできます。

検査オプション

ノード・ランチャ

GraalVMのNode.jsランタイムでは、次のようなV8 JavaScriptエンジンでビルドされたnode.jsと同じオプションが有効です:

--inspect[=[host:]<port number>]

これにより、インスペクタ・エージェントが有効になり、デフォルトで、ポート9229をリスニングします。別のポートでリスニングするには、オプションのポート番号を指定します:

--inspect-brk[=[host:]<port number>]

これは、nodeランチャにのみ適用されます。

その他の言語ランチャ

jspythonRscriptrubyllipolyglotなどの他のゲスト言語ランチャは、--inspect[=[host:]<port number>]オプションを受け入れますが、デフォルトでは、アプリケーション・コードの最初の行で一時停止します。

--inspect.Suspend=(true|false)

これにより、--inspect.Suspend=falseを指定した場合、初期の一時停止が無効になります。

その他の共通検査オプション

すべてのランチャは、次の追加オプションも受け入れます:

拡張デバッグ・オプション

次のオプションは、言語エキスパートおよび言語開発者向けです:

インスペクタ・バックエンドのプログラムによる起動

埋込み機能を使用すると、インスペクタ・バックエンドを起動するために、適切なインスペクタ・オプションをEngine/Contextに指定できます。次のコード・スニペットは、可能な起動の例を示しています:

import org.graalvm.polyglot.*;

class DebuggerSample {
    public static void main(String... args) {
        String port = "4242";
        String path = java.util.UUID.randomUUID().toString();
        Context context = Context.newBuilder("js")
                    .option("inspect", port)
                    .option("inspect.Path", path)
                    .build();
        String hostAdress = "localhost";
        String url = String.format(
                    "chrome-devtools://devtools/bundled/js_app.html?ws=%s:%s/%s",
                    hostAdress, port, path);
    }
}