schedule2021-04-20

【Rust】エラーが出たときの RUST_BACKTRACE=1 を設定する

Rustでエラーがでたときに下のように「注意: バックトレースを表示するために環境変数RUST_BACKTRACE=1をつけて実行しろよ」ってメッセージがでる。

note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
# 注意: バックトレースを表示するために環境変数`RUST_BACKTRACE=1`をつけて実行しろよ

いくつかの環境でRUST_BACKTRACE=1を設定するコマンドを載せます。

以下は実行したプロセス内だけ有効な設定方法です。 環境変数を永続化する方法は検索してください。

Contents

Windows コマンドプロンプト

set RUST_BACKTRACE=1

Windows パワーシェル

$env:RUST_BACKTRACE=1

Mac OS X

export RUST_BACKTRACE=1

Linux

RUST_BACKTRACE=1

# 表示
echo $RUST_BACKTRACE

# 削除
unset RUST_BACKTRACE


# 環境変数を使いつつ実行する
env RUST_BACKTRACE=1 cargo run

バックトレースの例

Windows PowerShellで実行した例です。

> cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.16s
     Running `target\debug\opengl.exe`
OK: init OpenGL: version=3.1
thread 'main' panicked at 'failed to open file: rsc/shader/shader.vs', src\shader.rs:29:33
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `target\debug\opengl.exe` (exit code: 101)

「注意: バックトレースを表示するために環境変数RUST_BACKTRACE=1をつけて実行しろよ」ってメッセージ。 その手前の行でエラーが起きた行とエラー内容がわかるが、バックトレースをつけてもう一度実行する。

RUST_BACKTRACE=1

RUST_BACKTRACE=1をつけて実行する。

> $env:RUST_BACKTRACE=1
> cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.15s
     Running `target\debug\opengl.exe`
OK: init OpenGL: version=3.1
thread 'main' panicked at 'failed to open file: rsc/shader/shader.vs', src\shader.rs:29:33
stack backtrace:
   0: std::panicking::begin_panic_handler
             at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:493
   1: std::panicking::begin_panic_fmt
             at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:435
   2: opengl::shader::{{impl}}::new::{{closure}}
             at .\src\shader.rs:29
   3: core::result::Result<std::fs::File, std::io::error::Error>::unwrap_or_else<std::fs::File,std::io::error::Error,closure-0>
             at C:\Users\suzu6\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\result.rs:825
   4: opengl::shader::Shader::new
             at .\src\shader.rs:28
   5: opengl::main
             at .\src\main.rs:53
   6: core::ops::function::FnOnce::call_once<fn(),tuple<>>
             at C:\Users\suzu6\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:227
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
error: process didn't exit successfully: `target\debug\opengl.exe` (exit code: 101)

作成したプログラムの.\src\shader.rs:29で呼び出しているstdのクレートの中まで追ってパニックが起きた個所を特定出来た。

クレートの中まで追ってエラー原因を特定したいときには、バックトレースを表示する。 バックトレースが表示できどんな内容か把握したので、今後エラーメッセージだけで分からないときに原因を追えるようになった。

RUST_BACKTRACE=full

RUST_BACKTRACE=1でバックトレースを表示すると、さらにRUST_BACKTRACE=fullの設定があることも表示された。 試してみる。

# 数値ではなく文字列なので"で囲っている
> $env:RUST_BACKTRACE="full"

> cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s
     Running `target\debug\opengl.exe`
OK: init OpenGL: version=3.1
thread 'main' panicked at 'failed to open file: rsc/shader/shader.vs', src\shader.rs:29:33
stack backtrace:
   0:     0x7ff7e19b68ae - std::backtrace_rs::backtrace::dbghelp::trace
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\..\..\backtrace\src\backtrace\dbghelp.rs:98
   1:     0x7ff7e19b68ae - std::backtrace_rs::backtrace::trace_unsynchronized
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66
   2:     0x7ff7e19b68ae - std::sys_common::backtrace::_print_fmt
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\sys_common\backtrace.rs:67
   3:     0x7ff7e19b68ae - std::sys_common::backtrace::_print::{{impl}}::fmt
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\sys_common\backtrace.rs:46
   4:     0x7ff7e19c9c3b - core::fmt::write
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\core\src\fmt\mod.rs:1078
   5:     0x7ff7e19b3f48 - std::io::Write::write_fmt<std::sys::windows::stdio::Stderr>
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\io\mod.rs:1517
   6:     0x7ff7e19b928d - std::sys_common::backtrace::_print
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\sys_common\backtrace.rs:49
   7:     0x7ff7e19b928d - std::sys_common::backtrace::print
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\sys_common\backtrace.rs:36
   8:     0x7ff7e19b928d - std::panicking::default_hook::{{closure}}
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:208
   9:     0x7ff7e19b8cf4 - std::panicking::default_hook
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:225
  10:     0x7ff7e19b9b9e - std::panicking::rust_panic_with_hook
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:591
  11:     0x7ff7e19b96c1 - std::panicking::begin_panic_handler::{{closure}}
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:497
  12:     0x7ff7e19b720f - std::sys_common::backtrace::__rust_end_short_backtrace<closure-0,!>
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\sys_common\backtrace.rs:141
  13:     0x7ff7e19b9619 - std::panicking::begin_panic_handler
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:493
  14:     0x7ff7e19b95cc - std::panicking::begin_panic_fmt
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:435
  15:     0x7ff7e19745a8 - opengl::shader::{{impl}}::new::{{closure}}
                               at C:\git\trial-code\rust\opengl\src\shader.rs:29
  16:     0x7ff7e1978cc5 - core::result::Result<std::fs::File, std::io::error::Error>::unwrap_or_else<std::fs::File,std::io::error::Error,closure-0>
                               at C:\Users\suzu6\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\result.rs:825
  17:     0x7ff7e1976af5 - opengl::shader::Shader::new
                               at C:\git\trial-code\rust\opengl\src\shader.rs:28
  18:     0x7ff7e1974e23 - opengl::main
                               at C:\git\trial-code\rust\opengl\src\main.rs:53
  19:     0x7ff7e19735eb - core::ops::function::FnOnce::call_once<fn(),tuple<>>
                               at C:\Users\suzu6\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:227
  20:     0x7ff7e1973e9b - std::sys_common::backtrace::__rust_begin_short_backtrace<fn(),tuple<>>
                               at C:\Users\suzu6\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys_common\backtrace.rs:125
  21:     0x7ff7e1979591 - std::rt::lang_start::{{closure}}<tuple<>>
                               at C:\Users\suzu6\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\rt.rs:66
  22:     0x7ff7e19b9d54 - core::ops::function::impls::{{impl}}::call_once
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\library\core\src\ops\function.rs:280
  23:     0x7ff7e19b9d54 - std::panicking::try::do_call
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:379
  24:     0x7ff7e19b9d54 - std::panicking::try
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panicking.rs:343
  25:     0x7ff7e19b9d54 - std::panic::catch_unwind
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\panic.rs:396
  26:     0x7ff7e19b9d54 - std::rt::lang_start_internal
                               at /rustc/cb75ad5db02783e8b0222fee363c5f63f7e2cf5b\/library\std\src\rt.rs:51
  27:     0x7ff7e1979563 - std::rt::lang_start<tuple<>>
                               at C:\Users\suzu6\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\rt.rs:65
  28:     0x7ff7e1975660 - main
  29:     0x7ff7e19cf2f4 - invoke_main
                               at D:\a01\_work\9\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78
  30:     0x7ff7e19cf2f4 - __scrt_common_main_seh
                               at D:\a01\_work\9\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
  31:     0x7ffa9a4a7034 - BaseThreadInitThunk
  32:     0x7ffa9c422651 - RtlUserThreadStart
error: process didn't exit successfully: `target\debug\opengl.exe` (exit code: 101)

参考