#backtrace #stack-trace #elf #cargo #mechanism #run-time #acquire

nightly backtrace-rust

一个用Rust编写的库,无需C依赖,用于在Rust程序中获取运行时堆栈跟踪(backtrace)

1个不稳定版本

0.1.0 2020年5月30日

#8#acquire

MIT/Apache

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
      &ltcomplex_inline::MyStruct as complex_inline::MyTrait&gt::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