kumo_server_common/
panic.rs

1use nix::sys::signal::{kill, SIGQUIT};
2use nix::unistd::Pid;
3
4pub fn register_panic_hook() {
5    let default_hook = std::panic::take_hook();
6    std::panic::set_hook(Box::new(move |info| {
7        let payload = info.payload();
8        let payload = payload.downcast_ref::<&str>().unwrap_or(&"!?");
9        let bt = backtrace::Backtrace::new();
10        if let Some(loc) = info.location() {
11            tracing::error!(
12                "panic at {}:{}:{} - {}\n{:?}",
13                loc.file(),
14                loc.line(),
15                loc.column(),
16                payload,
17                bt
18            );
19        } else {
20            tracing::error!("panic - {}\n{:?}", payload, bt);
21        }
22
23        default_hook(info);
24
25        // Request a core dump
26        kill(Pid::this(), SIGQUIT).ok();
27    }));
28}