signal_backtrace/
lib.rs

1#![feature(core_intrinsics)]
2
3extern "C" fn handler(sig: i32) {
4    let thread = std::thread::current();
5    let name = thread.name().unwrap_or("<unnamed>");
6    println!(
7        "Received signal '{}' in thread '{}'. Backtrace:\n{:?}",
8        sig,
9        name,
10        backtrace::Backtrace::new()
11    );
12
13    // Basically `std::intrinsics::abort()` but able to run on stable.
14    //
15    // Execute an invalid assembly instruction.
16    std::intrinsics::abort();
17}
18
19pub fn install() {
20    use sig::{ffi::Sig, signal};
21
22    // handle segfaults
23    signal!(Sig::SEGV, handler);
24    // handle stack overflow and unsupported CPUs
25    signal!(Sig::ILL, handler);
26    // handle double panics
27    // note: alias for SIGABRT
28    signal!(Sig::IOT, handler);
29    // handle invalid memory access
30    signal!(Sig::BUS, handler);
31}