默认情况下,栈调用只会展示最基本的信息:
thread ‘main’ panicked at ‘index out of bounds: the len is 3 but the index is 99’,
src/main.rs:4:5
note: run with RUST_BACKTRACE=1
environment variable to display a backtrace
但是有时候,我们还希望获取更详细的信息:
3. 🌟
填空以打印全部的调用栈
提示: 你可以在之前的默认 panic 信息中找到相关线索
$ __ cargo run
thread ‘main’ panicked at ‘assertion failed: (left == right)
left: [97, 98, 99]
,
right: [96, 97, 98]
’, src/main.rs:3:5
stack backtrace:
0: rust_begin_unwind
at
/rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/std/src/panicking.rs:498:5
1: core::panicking::panic_fmt
at
/rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/core/src/panicking.rs:116:14
2: core::panicking::assert_failed_inner
3: core::panicking::assert_failed
at
/rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/core/src/panicking.rs:154:5
4: study_cargo::main
at ./src/main.rs:3:5
5: core::ops::function::FnOnce::call_once
at
/rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/core/src/ops/function.rs:227:5
note: Some details are omitted, run with RUST_BACKTRACE=full
for a verbose backtrace.
unwinding 和 abort
当出现 panic! 时,程序提供了两种方式来处理终止流程:栈展开和直接终止。
其中,默认的方式就是 栈展开 ,这意味着 Rust 会回溯栈上数据和函数调用,因此也意味着更多的善后工
作,好处是可以给出充分的报错信息和栈调用信息,便于事后的问题复盘。 直接终止 ,顾名思义,不清理
数据就直接退出程序,善后工作交与操作系统来负责。
对于绝大多数用户,使用默认选择是最好的,但是当你关心最终编译出的二进制可执行文件大小时,那么
可以尝试去使用直接终止的方式,例如下面的配置修改 Cargo.toml 文件,实现在 release 模式下遇到
panic 直接终止:
[profile.release]
panic = ‘abort’