@@ -12,24 +12,27 @@ use ffi::CStr;
12
12
use io;
13
13
use libc:: { c_ulong, c_char} ;
14
14
use mem;
15
+ use ptr;
15
16
use sys:: c;
16
17
use sys:: backtrace:: BacktraceContext ;
17
18
use sys_common:: backtrace:: Frame ;
18
19
19
- type SymFromAddrFn =
20
- unsafe extern "system" fn ( c:: HANDLE , u64 , * mut u64 ,
21
- * mut c:: SYMBOL_INFO ) -> c:: BOOL ;
22
- type SymGetLineFromAddr64Fn =
23
- unsafe extern "system" fn ( c:: HANDLE , u64 , * mut u32 ,
24
- * mut c:: IMAGEHLP_LINE64 ) -> c:: BOOL ;
20
+ type SymFromInlineContextFn =
21
+ unsafe extern "system" fn ( c:: HANDLE , u64 , c :: DWORD ,
22
+ * mut u64 , * mut c:: SYMBOL_INFO ) -> c:: BOOL ;
23
+ type SymGetLineFromInlineContextFn =
24
+ unsafe extern "system" fn ( c:: HANDLE , u64 , c :: DWORD , c :: HMODULE ,
25
+ * mut u32 , * mut c:: IMAGEHLP_LINE64 ) -> c:: BOOL ;
25
26
26
27
/// Converts a pointer to symbol to its string value.
27
28
pub fn resolve_symname < F > ( frame : Frame ,
28
29
callback : F ,
29
30
context : & BacktraceContext ) -> io:: Result < ( ) >
30
31
where F : FnOnce ( Option < ( & str , usize ) > ) -> io:: Result < ( ) >
31
32
{
32
- let SymFromAddr = sym ! ( & context. dbghelp, "SymFromAddr" , SymFromAddrFn ) ?;
33
+ let SymFromInlineContext = sym ! ( & context. dbghelp,
34
+ "SymFromInlineContext" ,
35
+ SymFromInlineContextFn ) ?;
33
36
34
37
unsafe {
35
38
let mut info: c:: SYMBOL_INFO = mem:: zeroed ( ) ;
@@ -40,15 +43,25 @@ pub fn resolve_symname<F>(frame: Frame,
40
43
info. SizeOfStruct = 88 ;
41
44
42
45
let mut displacement = 0u64 ;
43
- let ret = SymFromAddr ( context. handle ,
44
- frame. symbol_addr as u64 ,
45
- & mut displacement,
46
- & mut info) ;
47
-
48
- let syminfo = if ret == c:: TRUE {
46
+ let ret = SymFromInlineContext ( context. handle ,
47
+ frame. symbol_addr as u64 ,
48
+ frame. inline_context ,
49
+ & mut displacement,
50
+ & mut info) ;
51
+ let valid_range = if ret == c:: TRUE &&
52
+ frame. symbol_addr as usize >= info. Address as usize {
53
+ if info. Size != 0 {
54
+ ( frame. symbol_addr as usize ) < info. Address as usize + info. Size as usize
55
+ } else {
56
+ true
57
+ }
58
+ } else {
59
+ false
60
+ } ;
61
+ let syminfo = if valid_range {
49
62
let ptr = info. Name . as_ptr ( ) as * const c_char ;
50
63
CStr :: from_ptr ( ptr) . to_str ( ) . ok ( ) . map ( |s| {
51
- ( s, ( frame . symbol_addr as usize ) . wrapping_sub ( displacement as usize ) )
64
+ ( s, info . Address as usize )
52
65
} )
53
66
} else {
54
67
None
@@ -63,19 +76,21 @@ pub fn foreach_symbol_fileline<F>(frame: Frame,
63
76
-> io:: Result < bool >
64
77
where F : FnMut ( & [ u8 ] , u32 ) -> io:: Result < ( ) >
65
78
{
66
- let SymGetLineFromAddr64 = sym ! ( & context. dbghelp,
67
- "SymGetLineFromAddr64 " ,
68
- SymGetLineFromAddr64Fn ) ?;
79
+ let SymGetLineFromInlineContext = sym ! ( & context. dbghelp,
80
+ "SymGetLineFromInlineContext " ,
81
+ SymGetLineFromInlineContextFn ) ?;
69
82
70
83
unsafe {
71
84
let mut line: c:: IMAGEHLP_LINE64 = mem:: zeroed ( ) ;
72
85
line. SizeOfStruct = :: mem:: size_of :: < c:: IMAGEHLP_LINE64 > ( ) as u32 ;
73
86
74
87
let mut displacement = 0u32 ;
75
- let ret = SymGetLineFromAddr64 ( context. handle ,
76
- frame. exact_position as u64 ,
77
- & mut displacement,
78
- & mut line) ;
88
+ let ret = SymGetLineFromInlineContext ( context. handle ,
89
+ frame. exact_position as u64 ,
90
+ frame. inline_context ,
91
+ ptr:: null_mut ( ) ,
92
+ & mut displacement,
93
+ & mut line) ;
79
94
if ret == c:: TRUE {
80
95
let name = CStr :: from_ptr ( line. Filename ) . to_bytes ( ) ;
81
96
f ( name, line. LineNumber as u32 ) ?;
0 commit comments