mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-30 10:53:58 +00:00
A panic unwind print lock
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
c9347e59f4
commit
cf4aee0061
@ -7,6 +7,7 @@ use core::ffi::c_void;
|
|||||||
use crate::{
|
use crate::{
|
||||||
arch::qemu::{exit_qemu, QemuExitCode},
|
arch::qemu::{exit_qemu, QemuExitCode},
|
||||||
cpu_local_cell, early_print, early_println,
|
cpu_local_cell, early_print, early_println,
|
||||||
|
sync::SpinLock,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern crate cfg_if;
|
extern crate cfg_if;
|
||||||
@ -55,7 +56,6 @@ pub fn panic_handler(info: &core::panic::PanicInfo) -> ! {
|
|||||||
begin_panic(Box::new(throw_info.clone()));
|
begin_panic(Box::new(throw_info.clone()));
|
||||||
}
|
}
|
||||||
early_println!("{}", info);
|
early_println!("{}", info);
|
||||||
early_println!("Printing stack trace:");
|
|
||||||
print_stack_trace();
|
print_stack_trace();
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
@ -66,6 +66,13 @@ pub fn abort() -> ! {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn print_stack_trace() {
|
fn print_stack_trace() {
|
||||||
|
/// We acquire a global lock to prevent the frames in the stack trace from
|
||||||
|
/// interleaving. The spin lock is used merely for its simplicity.
|
||||||
|
static BACKTRACE_PRINT_LOCK: SpinLock<()> = SpinLock::new(());
|
||||||
|
let _lock = BACKTRACE_PRINT_LOCK.lock();
|
||||||
|
|
||||||
|
early_println!("Printing stack trace:");
|
||||||
|
|
||||||
struct CallbackData {
|
struct CallbackData {
|
||||||
counter: usize,
|
counter: usize,
|
||||||
}
|
}
|
||||||
@ -99,6 +106,7 @@ fn print_stack_trace() {
|
|||||||
early_print!("\n\n");
|
early_print!("\n\n");
|
||||||
UnwindReasonCode::NO_REASON
|
UnwindReasonCode::NO_REASON
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut data = CallbackData { counter: 0 };
|
let mut data = CallbackData { counter: 0 };
|
||||||
_Unwind_Backtrace(callback, &mut data as *mut _ as _);
|
_Unwind_Backtrace(callback, &mut data as *mut _ as _);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user