TruffleRubyのデバッグ

例外の出力

例外を出力するとエラーの発生源の発見に役立ち、出力方法は2通りあります:

どちらからもすべての例外が出力され、後で例外が修復された場合も同様です。

Java例外は、--exceptions-print-uncaught-javaまたは--exceptions-print-javaを使用して出力できます。

その他の可能性については、他の--backtraces-*および--exceptions-*オプションを参照してください。

実行中のプロセスのスタックトレースおよびバックトレースの出力

SIGQUITシグナルをTruffleRubyに送信することで、すべてのスレッドのJavaスタックトレースを出力できます。[Ctrl] + [\]を使用すると、端末の現在のプロセスにSIGQUITを送信できます。これは、ハングやデッドロックをデバッグしたり、プロセスが何を実行しているかを把握するために役立ちます。これは、TruffleRubyネイティブとJVMの両方で機能します。

SIGALRMをTruffleRubyプロセスに送信すると、すべてのスレッドのRubyバックトレースが出力されます。

ノート: すべてのスレッドの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を使用すると、様々なサブプロセスに対して別々のログ・ファイルが同時に使用されます。これらのログ・ファイルの先頭は同じパスですが、末尾に12などの接尾辞が付きます。