我的应用程序需要通过stdout将日志发送给fluentd。
当我试图处理 panics 并将&std::panic::PanicInfo
作为std::panic::set_hook
的JSON排列时,我找不到从&PanicInfo
检索 backtrace 的方法。
有没有办法从恐慌中检索自定义钩子的回溯?
PanicInfo
不包含回溯,但您可以在恐慌中捕获它。
来自set_hook
文档:
注册一个自定义的恐慌钩,替换了以前注册的所有内容。
当恐慌时,请调用恐慌钩,但在调用恐慌运行时。因此,钩子将随着流产和放松的运行时间而运行。默认挂钩将消息打印到标准错误并在要求时生成回溯,但是可以使用
set_hook
和take_hook
函数自定义此行为。
由于恐慌挂钩在放开之前运行,您可以使用@Hellow提到的backtrace
板条键在恐慌钩中捕获回溯:
panic::set_hook(Box::new(|panic_info| {
let backtrace = Backtrace::new();
// Do something with backtrace and panic_info.
}));
您可以使用回溯板条箱生成当前堆栈的回溯。
这与Rust在恐慌时使用RUST_BACKTRACE=1
时内部使用的板条箱完全相同。
最简单的示例(取自文档)只是调用backtrace::Backtrace
:
use backtrace::Backtrace;
fn main() {
println!("{:?}", Backtrace::new());
}
将返回(在我的示例中)
stack backtrace:
0: playground::main::h990b23e2761eee55 (0x564800753fb1)
at src/main.rs:4
1: std::rt::lang_start::{{closure}}::hd025ca578a744b4f (0x564800753d3f)
at /rustc/9fda7c2237db910e41d6a712e9a2139b352e558b/src/libstd/rt.rs:74
2: std::rt::lang_start_internal::{{closure}}::hdfc28107b5be47c9 (0x564800789f92)
at src/libstd/rt.rs:59
std::panicking::try::do_call::h69790245ac2d03fe
at src/libstd/panicking.rs:310
3: __rust_maybe_catch_panic (0x564800797409)
at src/libpanic_unwind/lib.rs:102
4: std::panicking::try::h9c1cbc5599e1efbf (0x56480078a963)
at src/libstd/panicking.rs:289
std::panic::catch_unwind::h0562757d03ff60b3
at src/libstd/panic.rs:398
std::rt::lang_start_internal::h540c897fe52ba9c5
at src/libstd/rt.rs:58
5: std::rt::lang_start::h78189d3d761bfa86 (0x564800753d18)
at /rustc/9fda7c2237db910e41d6a712e9a2139b352e558b/src/libstd/rt.rs:74
6: main (0x5648007540b9)
7: __libc_start_main (0x7fdab1a23b96)
8: _start (0x564800753be9)
9: <unknown> (0x0)