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インスペクターに、実行されている最初のソースレベルのステートメントでプログラムを中断しないように指示することもできます。これを行うと、GraalVMは、デバッガを起動する前に__builtin_debugtrap()の呼び出しに達するまでプログラムを実行します。この動作を有効にするには、lli --inspect.Suspend=false --inspect.WaitAttached=true引数を渡す必要があります。

ソースファイルの検索 #

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

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

お問い合わせ