|
9 | 9 | // except according to those terms.
|
10 | 10 |
|
11 | 11 | use io;
|
12 |
| -use io::prelude::*; |
| 12 | +use intrinsics; |
| 13 | +use ffi::CStr; |
13 | 14 | use libc;
|
| 15 | +use sys::backtrace::BacktraceContext; |
| 16 | +use sys_common::backtrace::Frame; |
14 | 17 |
|
15 |
| -pub fn print(w: &mut Write, idx: isize, addr: *mut libc::c_void, |
16 |
| - _symaddr: *mut libc::c_void) -> io::Result<()> { |
17 |
| - use sys_common::backtrace::{output}; |
18 |
| - use intrinsics; |
19 |
| - use ffi::CStr; |
20 |
| - |
21 |
| - #[repr(C)] |
22 |
| - struct Dl_info { |
23 |
| - dli_fname: *const libc::c_char, |
24 |
| - dli_fbase: *mut libc::c_void, |
25 |
| - dli_sname: *const libc::c_char, |
26 |
| - dli_saddr: *mut libc::c_void, |
27 |
| - } |
28 |
| - extern { |
29 |
| - fn dladdr(addr: *const libc::c_void, |
30 |
| - info: *mut Dl_info) -> libc::c_int; |
| 18 | +pub fn resolve_symname<F>(frame: Frame, |
| 19 | + callback: F, |
| 20 | + _: &BacktraceContext) -> io::Result<()> |
| 21 | + where F: FnOnce(Option<&str>) -> io::Result<()> |
| 22 | +{ |
| 23 | + unsafe { |
| 24 | + let mut info: Dl_info = intrinsics::init(); |
| 25 | + let symname = if dladdr(frame.exact_position, &mut info) == 0 { |
| 26 | + None |
| 27 | + } else { |
| 28 | + CStr::from_ptr(info.dli_sname).to_str().ok() |
| 29 | + }; |
| 30 | + callback(symname) |
31 | 31 | }
|
| 32 | +} |
32 | 33 |
|
33 |
| - let mut info: Dl_info = unsafe { intrinsics::init() }; |
34 |
| - if unsafe { dladdr(addr, &mut info) == 0 } { |
35 |
| - output(w, idx,addr, None) |
36 |
| - } else { |
37 |
| - output(w, idx, addr, Some(unsafe { |
38 |
| - CStr::from_ptr(info.dli_sname).to_bytes() |
39 |
| - })) |
40 |
| - } |
| 34 | +pub fn foreach_symbol_fileline<F>(_symbol_addr: Frame, |
| 35 | + _f: F, |
| 36 | + _: &BacktraceContext) -> io::Result<bool> |
| 37 | + where F: FnMut(&[u8], libc::c_int) -> io::Result<()> |
| 38 | +{ |
| 39 | + Ok(false) |
| 40 | +} |
| 41 | + |
| 42 | +#[repr(C)] |
| 43 | +struct Dl_info { |
| 44 | + dli_fname: *const libc::c_char, |
| 45 | + dli_fbase: *mut libc::c_void, |
| 46 | + dli_sname: *const libc::c_char, |
| 47 | + dli_saddr: *mut libc::c_void, |
| 48 | +} |
| 49 | + |
| 50 | +extern { |
| 51 | + fn dladdr(addr: *const libc::c_void, |
| 52 | + info: *mut Dl_info) -> libc::c_int; |
41 | 53 | }
|
0 commit comments