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/");
- このプログラムを
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
-
ブラウザで
http://localhost:8000/
に移動して、ノード・アプリケーションを起動します。 -
別のChromeブラウザ・タブで、
devtools:...
リンクを開きます。 -
HelloWorld.js
ファイルに移動し、4行目でブレークポイントを送信します。 - 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
ランチャにのみ適用されます。
その他の言語ランチャ
js
、python
、Rscript
、ruby
、lli
、polyglot
などの他のゲスト言語ランチャは、--inspect[=[host:]<port number>]
オプションを受け入れますが、デフォルトでは、アプリケーション・コードの最初の行で一時停止します。
--inspect.Suspend=(true|false)
これにより、--inspect.Suspend=false
を指定した場合、初期の一時停止が無効になります。
その他の共通検査オプション
すべてのランチャは、次の追加オプションも受け入れます:
--inspect.Path=<path>
を使用すると、ユーザーは接続URLを生成するカスタム・パスを指定できます。ノート: ブラウザで開くWebサイトのうち、このURLを認識するものはすべて、デバッガに接続できます。このため、ファイアウォールで保護されていても、悪質なWebサイトがコンピュータ上で任意のコードを実行するために予測可能なパスを不正に使用する可能性があります。したがって、デフォルトでは、パスはランダムに生成されます。--inspect.SourcePath=<source path>
は、ソース・パスを表すディレクトリまたはZIP/JARファイルのリストを指定します。検査対象のアプリケーションにソース・ファイルへの相対参照が含まれている場合、そのコンテンツは、このソース・パスに対して解決された場所からロードされます。これは、たとえば、LLVMのデバッグ中に役立ちます。パスは、UNIXシステムでは:
、MS Windowsでは;
によって区切られます。--inspect.Secure=(true|false)
は、trueの場合、TLS/SSLを使用してデバッグ・プロトコルを保護します。WS (Webソケット)プロトコルがWSSに変更されることに加えて、デバッグ対象に関するメタデータを提供するHTTPエンドポイントもHTTPSに変更されます。たとえば、chrome://inspectページではデバッグ対象に関する情報を提供してデバッガを起動できないため、このことは互換性がありません。出力されたWSS URLを介して、デバッグを直接起動します。標準のjavax.net.ssl.*
システム・オプションを使用して、TLS/SSL暗号化キーでキーストアに関する情報を指定するか、次のオプションを使用します:--inspect.KeyStore
- キーストア・ファイル・パス--inspect.KeyStoreType
- キーストア・ファイル・タイプ(デフォルトはJKS)--inspect.KeyStorePassword
- キーストア・パスワード--inspect.KeyPassword
- キーをリカバリするためのパスワード(キーストア・パスワードと異なる場合)
--inspect.WaitAttached=(true|false)
は、trueの場合、インスペクタ・クライアントが接続されるまでゲスト言語のソース・コードを実行しません。--inspect.Suspend=true
とは異なり、クライアントの接続直後に実行が再開されます。これにより、インスペクタ・クライアントによってすべて確実に実行されます。デフォルトはfalse
です。
拡張デバッグ・オプション
次のオプションは、言語エキスパートおよび言語開発者向けです:
--inspect.Initialization=(true|false)
は、trueの場合、このオプションにより言語の初期化フェーズを検査します。初期の一時停止がアクティブな場合、これは必ずしもアプリケーション・コードの先頭ではなく、言語の初期化の最初に一時停止します。デフォルトはfalse
です。--inspect.Internal=(true|false)
は、trueの場合、内部ソースも検査されます。内部ソースでは、言語実装の詳細を提供できます。デフォルトは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);
}
}
OpenJDKで実行する場合、埋込みからChromeインスペクタ・ツールを使用するように、次のMaven依存関係を宣言する必要があります:
<dependency>
<groupId>org.graalvm.tools</groupId>
<artifactId>chromeinspector</artifactId>
<version>${graalvm.version}</version>
</dependency>
Chromeインスペクタ・ツールは、常にGraalVMのツールとして使用できます。依存関係を明示的に宣言する必要はありません。