1个不稳定版本
0.1.0 | 2020年5月30日 |
---|
#8 在 #acquire
20KB
313 行
Rust中实现的回溯机制
描述
一个为Linux操作系统(ELF二进制文件)编写的回溯实现。这是使用其他Rust包如
目前仅支持在
安装
在Cargo.toml
文件中添加包依赖。
[dependencies]
backtrace-rust = "0.1"
使用
实例化一个backtrace::Backtrace
类型的对象,并使用 {:?}
格式打印它。示例
use backtrace_rust::backtrace::Backtrace;
fn main() {
let bt = Backtrace::new();
// other code
println!("{:?}", bt);
}
示例
在examples/
目录中有3个示例。运行示例
$ cargo +nightly run --example complex_inline
0: complex_inline::tazz
at /backtrace-rust/examples/complex_inline.rs:22
1: complex_inline::taz
at /backtrace-rust/examples/complex_inline.rs:28
<complex_inline::MyStruct as complex_inline::MyTrait>::test
at /backtrace-rust/examples/complex_inline.rs:17
2: complex_inline::tar
at /backtrace-rust/examples/complex_inline.rs:34
complex_inline::bar
at /backtrace-rust/examples/complex_inline.rs:39
complex_inline::foo
at /backtrace-rust/examples/complex_inline.rs:44
complex_inline::main
at /backtrace-rust/examples/complex_inline.rs:48
3: std::rt::lang_start::{{closure}}
at /rustc/c20d7eecbc0928b57da8fe30b2ef8528e2bdd5be/src/libstd/rt.rs:67
4: std::rt::lang_start_internal::{{closure}}
at /rustc/c20d7eecbc0928b57da8fe30b2ef8528e2bdd5be/src/libstd/rt.rs:52
std::panicking::try::do_call
at /rustc/c20d7eecbc0928b57da8fe30b2ef8528e2bdd5be/src/libstd/panicking.rs:303
5: __rust_maybe_catch_panic
at /rustc/c20d7eecbc0928b57da8fe30b2ef8528e2bdd5be/src/libpanic_unwind/lib.rs:86
6: std::panicking::try
at /rustc/c20d7eecbc0928b57da8fe30b2ef8528e2bdd5be/src/libstd/panicking.rs:281
std::panic::catch_unwind
at /rustc/c20d7eecbc0928b57da8fe30b2ef8528e2bdd5be/src/libstd/panic.rs:394
std::rt::lang_start_internal
at /rustc/c20d7eecbc0928b57da8fe30b2ef8528e2bdd5be/src/libstd/rt.rs:51
7: std::rt::lang_start
at /rustc/c20d7eecbc0928b57da8fe30b2ef8528e2bdd5be/src/libstd/rt.rs:67
8: main
限制
- 需要Rust nightly通道才能运行(使用内联汇编,这不是一个稳定功能)
- 当不存在
.eh_frame
时,不支持使用.debug_frame
调试节 - 不能评估更复杂的
.eh_frame
寄存器恢复规则(测试中似乎不需要这样的功能)
依赖项
~6MB
~115K SLoC