use std::fmt;
use std::os::raw::c_void;
use debug_builders::DebugStruct;
pub trait Symbol {
fn name(&self) -> Option<&[u8]> { None }
fn addr(&self) -> Option<*mut c_void> { None }
fn filename(&self) -> Option<&[u8]> { None }
fn lineno(&self) -> Option<u32> { None }
}
pub fn resolve(addr: *mut c_void, cb: &mut FnMut(&Symbol)) {
resolve_imp(addr, cb)
}
impl fmt::Debug for Symbol {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut d = DebugStruct::new(f, "Symbol");
if let Some(name) = self.name() {
d = d.field("name", &String::from_utf8_lossy(name));
}
if let Some(addr) = self.addr() {
d = d.field("addr", &addr);
}
if let Some(filename) = self.filename() {
d = d.field("filename", &String::from_utf8_lossy(filename));
}
if let Some(lineno) = self.lineno() {
d = d.field("lineno", &lineno);
}
d.finish()
}
}
cfg_if! {
if #[cfg(all(windows, feature = "dbghelp"))] {
mod dbghelp;
use self::dbghelp::resolve as resolve_imp;
} else if #[cfg(all(feature = "libbacktrace", unix,
not(target_os = "macos")))] {
mod libbacktrace;
use self::libbacktrace::resolve as resolve_imp;
} else if #[cfg(all(unix, feature = "dladdr"))] {
mod dladdr;
use self::dladdr::resolve as resolve_imp;
} else {
mod noop;
use self::noop::resolve as resolve_imp;
}
}