Rust Panicスタックトレース(バックトレース)の解析

Rust panicバックトレースを解析。RUST_BACKTRACE=1でのRustランタイムpanic出力から関数シンボル、デマングル名、ファイルパス、行番号を抽出します。

Rust

詳細な説明

Rust Panicバックトレースの理解

Rust panicは他の言語の例外とは根本的に異なります。panicはスタックをアンワインド(デフォルト)してスレッドを終了します。バックトレースはRUST_BACKTRACE=1またはRUST_BACKTRACE=full環境変数が設定されている場合に表示されます。

Rustバックトレースフォーマット

thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 5', src/main.rs:15:10
stack backtrace:
   0: rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::panicking::panic_bounds_check
   3: my_app::process_items
             at ./src/main.rs:15:10
   4: my_app::main
             at ./src/main.rs:8:5

バックトレースコンポーネント

  • スレッド名 --- thread 'main'でpanicしたスレッドを識別
  • Panicメッセージ --- 人間が読めるエラーの説明
  • Panic位置 --- panic!()が呼び出された、またはエラーが発生したfile:line:column
  • フレーム番号 --- 0から始まる連番
  • シンボル名 --- 完全モジュールパス付きのデマングルされたRust関数名
  • ファイル位置 --- ソースファイルと行番号

RUST_BACKTRACEレベル

  • RUST_BACKTRACE=0 --- バックトレースなし(デフォルト)
  • RUST_BACKTRACE=1 --- 短いバックトレース(一部の内部フレームをフィルタリング)
  • RUST_BACKTRACE=full --- すべてのランタイムフレームを含む完全なバックトレース

一般的なRust Panic

  • index out of bounds --- 配列/スライスの長さを超えるアクセス
  • called Option::unwrap() on a None value --- Noneのアンラップ
  • called Result::unwrap() on an Err value --- エラーのアンラップ
  • attempt to divide by zero --- 整数のゼロ除算
  • 明示的なpanic!()またはtodo!() / unimplemented!()マクロ

ユースケース

Rust panicはCLIツール、Webサーバー(Actix、Axum、Rocket)、組み込みシステム、WebAssemblyアプリケーション、システムレベルソフトウェアに表示されます。Rustの型システムは多くの一般的なエラーをコンパイル時に防止するため、本番でのpanicはバウンド違反やアンラップ失敗などのロジックバグを示すことが多いです。ランタイム内部をすばやく通過してpanicが発生したアプリケーションフレームにナビゲーションするためにバックトレースを解析することは、Rust本番の問題のデバッグに不可欠です。

試してみる — Stack Trace Parser & Formatter

フルツールを開く