从 Rust 钩子中的恐慌中检索回溯?

KUN*_*yoh 7 logging backtrace panic rust

我的应用程序需要通过标准输出将日志以 JSON 格式发送到 fluentd。
当我试图处理恐慌并将 a&std::panic::PanicInfo作为 JSON安排时std::panic::set_hook,我找不到从 a 中检索回溯的方法&PanicInfo

有没有办法从自定义钩子中的恐慌中检索回溯?

Mat*_* M. 8

PanicInfo 不包含回溯,但您可以在恐慌钩子中自己捕获它。

set_hook文档:

注册一个自定义的恐慌挂钩,替换之前注册的任何一个。

当线程发生恐慌时,但在调用恐慌运行时之前,会调用恐慌挂钩。因此,钩子将在中止和展开运行时运行。默认钩子会向标准错误打印一条消息,并在需要时生成回溯,但可以使用set_hooktake_hook函数自定义此行为。

由于恐慌钩在 unwinding 之前运行,您可以使用backtrace@hellow 已经提到的箱子在恐慌钩中自己捕获回溯:

panic::set_hook(Box::new(|panic_info| {
    let backtrace = Backtrace::new();
    //  Do something with backtrace and panic_info.
}));
Run Code Online (Sandbox Code Playgroud)

  • 我想过提供这个答案,但在恐慌处理程序中执行复杂逻辑的想法感觉非常冒险...... (2认同)

hel*_*low 4

您可以使用backtrace crate生成当前堆栈的回溯。

RUST_BACKTRACE=1这与发生恐慌时Rust 在内部使用的箱子完全相同。

最简单的例子(取自文档)只是调用backtrace::Backtrace

use backtrace::Backtrace;

fn main() {
    println!("{:?}", Backtrace::new());
}
Run Code Online (Sandbox Code Playgroud)

它将返回(在我的例子中)

use backtrace::Backtrace;

fn main() {
    println!("{:?}", Backtrace::new());
}
Run Code Online (Sandbox Code Playgroud)