toolkit/bootstrap/host/
panic.rs1use std::sync::Once;
2
3static PANIC_HOOK_INIT: Once = Once::new();
4
5pub fn init_panic_tracing() {
6 PANIC_HOOK_INIT.call_once(|| {
7 std::panic::set_hook(Box::new(|panic_info| {
8 let backtrace = std::backtrace::Backtrace::force_capture();
9 let location = panic_info.location().map_or_else(
10 || "unknown location".to_owned(),
11 |loc| format!("{}:{}:{}", loc.file(), loc.line(), loc.column()),
12 );
13 let payload = if let Some(s) = panic_info.payload().downcast_ref::<&str>() {
14 (*s).to_owned()
15 } else if let Some(s) = panic_info.payload().downcast_ref::<String>() {
16 s.clone()
17 } else {
18 "non-string panic payload".to_owned()
19 };
20
21 tracing::error!(%location, %payload, %backtrace, "PANIC");
22 }));
23
24 tracing::debug!("tracing of panic is initialized");
25 });
26}