TruffleRubyのデバッグ
TruffleRubyは、他のGraalVM言語と同様に、2つの標準デバッグ・プロトコルをサポートしています:
- Debug Adapter Protocol (DAP)。最も強力にサポートされています
- Chrome DevTools Protocol。スレッドを扱わないため、サポートに制限があります
デバッガ以外のツールについては、ツールに関する項も参照してください。
VSCode
まず、GraalVM VSCode拡張をインストールします。
次に、このドキュメントに従って、VSCodeでTruffleRubyをデバッグします。
RubyMine
残念ながら、RubyMine/IntelliJ IDEAは、Rubyデバッグ用のDebug Adapter Protocolをまだサポートしていません。
興味があることを示すには、機能のリクエストに投票するかコメントしてください。
コマンドライン・デバッグ・オプション
例外の出力
例外を出力するとエラーの発生源の発見に役立ち、出力方法は2通りあります:
- それぞれの例外が発生した
file:line
を出力する標準Rubyの-d
フラグ - 発生したそれぞれの例外の完全なバックトレースを表示する
--backtraces-raise
どちらからもすべての例外が出力され、後で例外が修復された場合も同様です。
Java例外は、--exceptions-print-uncaught-java
または--exceptions-print-java
を使用して出力できます。
その他の可能性については、他の--backtraces-*
および--exceptions-*
オプションを参照してください。
実行中のプロセスのスタックトレースおよびバックトレースの出力
SIGQUIT
シグナルをTruffleRubyに送信することで、すべてのスレッドのJavaスタックトレースを出力できます。[Ctrl] + [\]
を使用すると、端末の現在のプロセスにSIGQUIT
を送信できます。これは、ハングやデッドロックをデバッグしたり、プロセスが何を実行しているかを把握するために役立ちます。これは、TruffleRubyネイティブとJVMの両方で機能します。
SIGALRM
をTruffleRubyプロセスに送信すると、すべてのスレッドのRubyバックトレースが出力されます。
バックトレースの詳細情報
TruffleRubyは、MRIのバックトレース形式にできるかぎり厳密にあわせるように努めています。このことは、使用可能な追加情報が表示されないことを意味する場合があります。デバッグ時には、こうした情報を表示することをお薦めします。
詳細情報を表示するオプションは--backtraces-interleave-java=true
であり、これにより、それぞれのRubyメソッドの実行に関与しているJavaメソッドが表示されます。
C拡張機能を含め、他の言語と相互運用している場合、RubyがJavaフレームをフォーマットしてバックトレースとして出力するころには、それらが消失しているため、Java例外のバックトレースでは情報が欠落している可能性があります。
サブプロセスの出力
オプション--log-subprocess
を使用して、TruffleRubyによって作成されたすべてのサブプロセスをログに記録できます。
$ ruby --log-subprocess -e '`ls .`'
[ruby] INFO: spawn: ls .
ただし、TRUFFLERUBYOPT
でこのオプションを設定しないかぎり、これは推移的ではありません。
TruffleRubyのプロセスおよび引数の出力
bin/truffleruby
ランチャを使用して作成されたTruffleRubyプロセスとその引数を、--log-process-args
で記録できます。
$ ruby --log-process-args -e 0
[ruby] INFO: new process: truffleruby --log-process-args -e 0
このオプションをTRUFFLERUBYOPT
で設定すると、TruffleRubyサブプロセスにも適用できます。--log.file=PATH
を使用すると、様々なサブプロセスに対して別々のログ・ファイルが同時に使用されます。これらのログ・ファイルの先頭は同じパスですが、末尾に1
、2
などの接尾辞が付きます。