Rustコンパイラのデバッグ出力を見る

Rustコンパイラの細かい挙動を追うには、コンパイラ内に設置してある debug!(..) の出力を追う手がある。

デバッグ出力を有効化してコンパイラをビルドする

まず手元のRustコンパイラのソースから、デバッグ出力を有効化したコンパイラを作成する必要がある。

それにはまず src/bootstrap/config.toml.example をコピーして config.toml を作成し、以下の設定をする。

[rust]
debug-assertions = true

この状態でビルドする。

$ ./x.py build

デバッグ出力を有効にしてコンパイラを起動する

RUST_LOG 環境変数によりログを制御することができる。

$ RUST_LOG=rustc_typeck,rustc_mir,rustc::ty build/x86_64-unknown-linux-gnu/stage1/bin/rustc test.rs

RUST_LOGのフォーマット

RUST_LOG は以下のフォーマットを持つ。

  • ログレベル指定
  • ログレベル指定/フィルター

ログレベル指定はモジュールごとにカンマ区切りで指定する。カンマで区切られた各要素は以下のフォーマットに従う。

  • ログレベル
  • モジュール
  • モジュール=
  • モジュール=ログレベル

ログレベルは以下のどちらかである。

  • 非負整数。
  • error, info, warn, debug, traceのいずれかの文字列。大文字小文字は区別しない。それぞれ1,2,3,4,5に対応する。

ログレベルを省略したときは最大(全てのレベルが出力される)の意味になる。

ログレベルのみを指定したときはモジュールとして空文字列を指定したのとほぼ同じ動作をする。

モジュール指定は、ログ出力命令のあるモジュールのパスに、文字列として先頭一致で判定される。複数の指令に該当する場合は最長一致で採用される。

フィルターを指定した場合は、それが部分文字列として含まれているログのみ出力される。