1
Fork 0

Use signal handler only on supported platforms

This commit is contained in:
Tyler Mandry 2021-07-02 00:20:04 +00:00
parent ec6a85a536
commit 162ed4d7da

View file

@ -1312,15 +1312,20 @@ 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] = [std::ptr::null_mut(); MAX_FRAMES]; static mut STACK_TRACE: [*mut libc::c_void; 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 {
@ -1328,12 +1333,11 @@ extern "C" fn print_stack_trace(_: libc::c_int) {
} }
backtrace_symbols_fd(STACK_TRACE.as_ptr(), depth, 2); backtrace_symbols_fd(STACK_TRACE.as_ptr(), depth, 2);
} }
} }
#[cfg(unix)] // When an error signal (such as SIGABRT or SIGSEGV) is delivered to the
// When an error signal (such as SIGABRT or SIGSEGV) is delivered to the // process, print a stack trace and then exit.
// process, print a stack trace and then exit. pub(super) fn install() {
fn install_signal_handler() {
unsafe { unsafe {
const ALT_STACK_SIZE: usize = libc::MINSIGSTKSZ + 64 * 1024; const ALT_STACK_SIZE: usize = libc::MINSIGSTKSZ + 64 * 1024;
let mut alt_stack: libc::stack_t = std::mem::zeroed(); let mut alt_stack: libc::stack_t = std::mem::zeroed();
@ -1349,18 +1353,19 @@ fn install_signal_handler() {
libc::sigemptyset(&mut sa.sa_mask); libc::sigemptyset(&mut sa.sa_mask);
libc::sigaction(libc::SIGSEGV, &sa, std::ptr::null_mut()); libc::sigaction(libc::SIGSEGV, &sa, std::ptr::null_mut());
} }
}
} }
#[cfg(not(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() {} }
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(|| {