Open
Description
I'm trying to get a backtrace from a SIGSEGV caused by stack overflow (hitting guard page). It seems that this is not working on macOS.
My reproduction case:
use backtrace::Backtrace;
use std::{mem, ptr};
#[inline(never)]
fn f(x: i32) -> i32 {
if x == 0 || x == 1 {
1
} else {
f(x - 1) + f(x - 2)
}
}
fn main() {
unsafe {
let mut handler: libc::sigaction = mem::zeroed();
handler.sa_flags = libc::SA_ONSTACK;
handler.sa_sigaction = trap_handler as usize;
libc::sigemptyset(&mut handler.sa_mask);
assert_eq!(libc::sigaction(libc::SIGSEGV, &handler, ptr::null_mut()), 0);
// Backtracing from a normal SIGSEGV works
//println!("Before invalid write");
//ptr::write_volatile(0 as *mut u32, 0);
//println!("After invalid write");
// Backtracing from a stack overflow crashes
println!("Before stack overflow");
println!("{}", f(0xfffffff));
println!("After stack overflow");
}
}
unsafe extern "C" fn trap_handler(
_: libc::c_int
) {
println!("Backtrace begin");
let backtrace = Backtrace::new_unresolved();
println!("Backtrace result: {:?}", backtrace);
}
Output:
% ./target/release/backtrace-stackoverflow-bug
Before stack overflow
Backtrace begin
zsh: segmentation fault ./target/release/backtrace-stackoverflow-bug
Rust version:
rustc 1.46.0-nightly (16957bd4d 2020-06-30)
binary: rustc
commit-hash: 16957bd4d3a5377263f76ed74c572aad8e4b7e59
commit-date: 2020-06-30
host: x86_64-apple-darwin
release: 1.46.0-nightly
LLVM version: 10.0