GraalVM LLVMランタイムでのデバッグ

GraalVM LLVMランタイムでは、GraalVMのChromeインスペクタ実装を使用したChrome開発者ツールによるソースレベル(C言語など)のデバッグがサポートされています。これには、シングルステップ実行、ブレークポイントおよびローカル変数とグローバル変数の検査のサポートが含まれます。

この機能を使用するには、clangでコンパイルするときに-g引数を指定して、デバッグ情報を有効にした状態でプログラムをコンパイルします(GraalVMに付属のLLVMツールチェーンでは、デバッグ情報は自動的に有効になります)。これにより、プログラムのソース・コードをステップ実行し、その中にブレークポイントを設定できます。

デバッグを開始するには、--inspectオプションを指定してlliを実行します:

$JAVA_HOME/bin/lli --inspect <bitcode file>

インスペクタが起動されると、プログラムの最初の命令で実行が中断され、コンソールへのリンクが出力されます。このリンクをChromeのアドレス・バーに貼り付けると、開発者ツールが開きます。

ブレークポイント

ブレークポイントは、すでに解析されている関数にのみ設定できます。GraalVMのデフォルトでは、LLVMビットコード・ファイル内の関数は初めて実行されるときにのみ解析されます。かわりに、関数を即時に解析し、まだ実行されていない関数にもブレークポイントを設定できるようにするには、オプションlli --llvm.lazyParsing=falseを使用します。

__builtin_debugtrap()を使用したプログラム定義のブレークポイント

__builtin_debugtrap関数を使用したプログラム定義のブレークポイントにより、GraalVMによってプログラムが明示的に停止され、デバッガに切り替わる場所をプログラム内でマークできます。デバッガは、コールにブレークポイントが設定されているかのように、この関数のコールのたびに自動的に停止します。この機能を使用すると、アプリケーションが起動した後にブレークポイントを見つけて設定する必要なく、実際にデバッグしようとしているコードにすばやく到達できます。また、Chromeインスペクタに対して、実行される最初のソース・レベルの文でプログラムを一時停止しないように指定することもできます。そのようにすると、かわりに、__builtin_debugtrap()のコールに達するまでプログラムが実行されてから、デバッガが起動します。この動作を有効にするには、引数lli --inspect.Suspend=false --inspect.WaitAttached=trueを渡す必要があります。

ソース・ファイルの検索

LLVMビットコード・ファイルのデバッグ情報には、ソース・コードの場所を特定するための絶対検索パスが含まれています。ソース・ファイルが移動しなかった場合は、自動的に検出されます。

ソース・ファイルが移動した場合、または別のマシンでコンパイルされた場合は、--inspect.SourcePath=<path>オプションを使用して検索パスを指定できます(複数のパスは:で区切ることができます)。