Open
Description
The documentation for Frame::symbol_address
warns:
This will attempt to rewind the instruction pointer returned by ip to the start of the function, returning that value. In some cases, however, backends will just return ip from this function.
Consequently, the following code 'works' on x86_64-unknown-linux-gnu
, but not on aarch64-apple-darwin
:
use backtrace;
use std::{hint::black_box, ptr, ffi::c_void};
fn main() {
black_box(function());
}
#[inline(never)]
fn function() {
let function = function as *const c_void;
println!("searching for symbol_address={:?}", function);
backtrace::trace(|frame| {
println!("unwound to {:?}", frame);
if ptr::eq(frame.symbol_address(), function) {
println!("found it!"); // not reached on aarch64-apple-darwin :(
return false;
}
true
});
}
Is this expected behavior on this platform? If so, is there any way to work around this discrepancy?
In the scoped-trace crate, I use symbol address equality to capture backtraces with limited upper and lower unwinding bounds. I'm hoping to get this crate working on aarch64-apple-darwin
.