Experimental feature in GraalVM

TruffleRubyのデバッグ

TruffleRubyは、他のGraalVM言語と同様に、2つの標準デバッグプロトコルをサポートしています。

デバッガー以外のツールについては、ツールも参照してください。

VSCode #

シンプルかつ高速 #

  1. デバッグしたいプロジェクトでVSCodeを開きます。
     $ cd /path/to/project
     $ code .
    
  2. 以下の内容で.vscode/launch.jsonファイルを作成します。
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach",
            "type": "node",
            "request": "attach",
            "debugServer": 4711
        }
    ]
}
  1. コマンドラインでTruffleRubyを実行し、--dapを渡します。例:
     $ ruby --dap test.rb
     $ ruby --dap -Ilib test/some_test.rb
     $ TRUFFLERUBYOPT=--dap bundle exec rspec some_spec.rb
    
  2. VSCodeで実行 -> デバッグの開始をクリックします。

GraalVM 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-*オプションで、より多くの可能性を確認してください。

実行中のプロセスのスタックトレースとバックトレースの出力 #

TruffleRubyにSIGQUITシグナルを送信して、すべてのスレッドのJavaスタックトレースを出力させることができます。ターミナルで現在のプロセスにSIGQUITを送信するには、Ctrl + \ を使用できます。これは、ハングやデッドロックをデバッグしたり、プロセスが何をしているかを知るのに役立ちます。これはTruffleRuby NativeとJVMの両方で機能します。

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

バックトレースのより多くの情報 #

TruffleRubyは、可能な限りMRIのバックトレース形式に一致するように努めています。これは、追加の利用可能な情報が表示されない場合があることを意味します。デバッグ時には、この情報を表示したい場合があります。

より多くの情報を表示するオプションは--backtraces-interleave-java=trueで、各Rubyメソッドの実行に関与したJavaメソッドが表示されます。

C拡張機能を含む他の言語と相互運用する場合、Java例外のバックトレースは、Rubyがバックトレースにフォーマットする機会があるまでに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などの接尾辞で終わります。

お問い合わせ