Use signal handler only on supported platforms
This commit is contained in:
parent
ec6a85a536
commit
162ed4d7da
1 changed files with 43 additions and 38 deletions
|
@ -1312,55 +1312,60 @@ pub fn init_env_logger(env: &str) {
|
||||||
tracing::subscriber::set_global_default(subscriber).unwrap();
|
tracing::subscriber::set_global_default(subscriber).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(all(unix, any(target_env = "gnu", target_os = "macos")))]
|
||||||
extern "C" {
|
mod signal_handler {
|
||||||
fn backtrace_symbols_fd(buffer: *const *mut libc::c_void, size: libc::c_int, fd: libc::c_int);
|
extern "C" {
|
||||||
}
|
fn backtrace_symbols_fd(
|
||||||
|
buffer: *const *mut libc::c_void,
|
||||||
|
size: libc::c_int,
|
||||||
|
fd: libc::c_int,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
extern "C" fn print_stack_trace(_: libc::c_int) {
|
||||||
extern "C" fn print_stack_trace(_: libc::c_int) {
|
const MAX_FRAMES: usize = 256;
|
||||||
const MAX_FRAMES: usize = 256;
|
static mut STACK_TRACE: [*mut libc::c_void; MAX_FRAMES] =
|
||||||
static mut STACK_TRACE: [*mut libc::c_void; MAX_FRAMES] = [std::ptr::null_mut(); MAX_FRAMES];
|
[std::ptr::null_mut(); MAX_FRAMES];
|
||||||
unsafe {
|
unsafe {
|
||||||
let depth = libc::backtrace(STACK_TRACE.as_mut_ptr(), MAX_FRAMES as i32);
|
let depth = libc::backtrace(STACK_TRACE.as_mut_ptr(), MAX_FRAMES as i32);
|
||||||
if depth == 0 {
|
if depth == 0 {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
backtrace_symbols_fd(STACK_TRACE.as_ptr(), depth, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// When an error signal (such as SIGABRT or SIGSEGV) is delivered to the
|
||||||
|
// process, print a stack trace and then exit.
|
||||||
|
pub(super) fn install() {
|
||||||
|
unsafe {
|
||||||
|
const ALT_STACK_SIZE: usize = libc::MINSIGSTKSZ + 64 * 1024;
|
||||||
|
let mut alt_stack: libc::stack_t = std::mem::zeroed();
|
||||||
|
alt_stack.ss_sp =
|
||||||
|
std::alloc::alloc(std::alloc::Layout::from_size_align(ALT_STACK_SIZE, 1).unwrap())
|
||||||
|
as *mut libc::c_void;
|
||||||
|
alt_stack.ss_size = ALT_STACK_SIZE;
|
||||||
|
libc::sigaltstack(&mut alt_stack, std::ptr::null_mut());
|
||||||
|
|
||||||
|
let mut sa: libc::sigaction = std::mem::zeroed();
|
||||||
|
sa.sa_sigaction = print_stack_trace as libc::sighandler_t;
|
||||||
|
sa.sa_flags = libc::SA_NODEFER | libc::SA_RESETHAND | libc::SA_ONSTACK;
|
||||||
|
libc::sigemptyset(&mut sa.sa_mask);
|
||||||
|
libc::sigaction(libc::SIGSEGV, &sa, std::ptr::null_mut());
|
||||||
}
|
}
|
||||||
backtrace_symbols_fd(STACK_TRACE.as_ptr(), depth, 2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(not(all(unix, any(target_env = "gnu", target_os = "macos"))))]
|
||||||
// When an error signal (such as SIGABRT or SIGSEGV) is delivered to the
|
mod signal_handler {
|
||||||
// process, print a stack trace and then exit.
|
pub(super) fn install() {}
|
||||||
fn install_signal_handler() {
|
|
||||||
unsafe {
|
|
||||||
const ALT_STACK_SIZE: usize = libc::MINSIGSTKSZ + 64 * 1024;
|
|
||||||
let mut alt_stack: libc::stack_t = std::mem::zeroed();
|
|
||||||
alt_stack.ss_sp =
|
|
||||||
std::alloc::alloc(std::alloc::Layout::from_size_align(ALT_STACK_SIZE, 1).unwrap())
|
|
||||||
as *mut libc::c_void;
|
|
||||||
alt_stack.ss_size = ALT_STACK_SIZE;
|
|
||||||
libc::sigaltstack(&mut alt_stack, std::ptr::null_mut());
|
|
||||||
|
|
||||||
let mut sa: libc::sigaction = std::mem::zeroed();
|
|
||||||
sa.sa_sigaction = print_stack_trace as libc::sighandler_t;
|
|
||||||
sa.sa_flags = libc::SA_NODEFER | libc::SA_RESETHAND | libc::SA_ONSTACK;
|
|
||||||
libc::sigemptyset(&mut sa.sa_mask);
|
|
||||||
libc::sigaction(libc::SIGSEGV, &sa, std::ptr::null_mut());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(unix))]
|
|
||||||
// When an error signal (such as SIGABRT or SIGSEGV) is delivered to the
|
|
||||||
// process, print a stack trace and then exit.
|
|
||||||
fn install_signal_handler() {}
|
|
||||||
|
|
||||||
pub fn main() -> ! {
|
pub fn main() -> ! {
|
||||||
let start_time = Instant::now();
|
let start_time = Instant::now();
|
||||||
let start_rss = get_resident_set_size();
|
let start_rss = get_resident_set_size();
|
||||||
init_rustc_env_logger();
|
init_rustc_env_logger();
|
||||||
install_signal_handler();
|
signal_handler::install();
|
||||||
let mut callbacks = TimePassesCallbacks::default();
|
let mut callbacks = TimePassesCallbacks::default();
|
||||||
install_ice_hook();
|
install_ice_hook();
|
||||||
let exit_code = catch_with_exit_code(|| {
|
let exit_code = catch_with_exit_code(|| {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue