panic.rs 814 B

1234567891011121314151617181920212223242526272829
  1. use core::ffi::c_void;
  2. use eonix_log::println_fatal;
  3. use unwinding::abi::{
  4. UnwindContext, UnwindReasonCode, _Unwind_Backtrace, _Unwind_GetIP, _Unwind_GetRegionStart,
  5. };
  6. pub fn stack_trace() {
  7. struct CallbackData {
  8. counter: usize,
  9. }
  10. extern "C" fn callback(unwind_ctx: &UnwindContext<'_>, arg: *mut c_void) -> UnwindReasonCode {
  11. let data = unsafe { &mut *(arg as *mut CallbackData) };
  12. data.counter += 1;
  13. println_fatal!(
  14. "{:4}: {:#018x} - <unknown> at function {:#018x}",
  15. data.counter,
  16. _Unwind_GetIP(unwind_ctx),
  17. _Unwind_GetRegionStart(unwind_ctx),
  18. );
  19. UnwindReasonCode::NO_REASON
  20. }
  21. let mut data = CallbackData { counter: 0 };
  22. _Unwind_Backtrace(callback, &raw mut data as *mut c_void);
  23. }