comparison src/os/windows/vm/decoder_windows.hpp @ 12199:38f750491293

8022335: Native stack walk while generating hs_err does not work on Windows x64 Summary: Use WinDbg API StackWalk64() Reviewed-by: zgu, dholmes
author iklam
date Fri, 06 Sep 2013 08:42:42 -0700
parents dd7248d3e151
children de6a9e811145
comparison
equal deleted inserted replaced
12198:baa7927dfbd2 12199:38f750491293
36 typedef BOOL (WINAPI *pfn_SymGetSymFromAddr64)(HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64); 36 typedef BOOL (WINAPI *pfn_SymGetSymFromAddr64)(HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64);
37 typedef DWORD (WINAPI *pfn_UndecorateSymbolName)(const char*, char*, DWORD, DWORD); 37 typedef DWORD (WINAPI *pfn_UndecorateSymbolName)(const char*, char*, DWORD, DWORD);
38 typedef BOOL (WINAPI *pfn_SymSetSearchPath)(HANDLE, PCTSTR); 38 typedef BOOL (WINAPI *pfn_SymSetSearchPath)(HANDLE, PCTSTR);
39 typedef BOOL (WINAPI *pfn_SymGetSearchPath)(HANDLE, PTSTR, int); 39 typedef BOOL (WINAPI *pfn_SymGetSearchPath)(HANDLE, PTSTR, int);
40 40
41 #ifdef AMD64
42 typedef BOOL (WINAPI *pfn_StackWalk64)(DWORD MachineType,
43 HANDLE hProcess,
44 HANDLE hThread,
45 LPSTACKFRAME64 StackFrame,
46 PVOID ContextRecord,
47 PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
48 PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
49 PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
50 PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);
51 typedef PVOID (WINAPI *pfn_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase);
52 typedef DWORD64 (WINAPI *pfn_SymGetModuleBase64)(HANDLE hProcess, DWORD64 dwAddr);
53 #endif
54
41 class WindowsDecoder : public AbstractDecoder { 55 class WindowsDecoder : public AbstractDecoder {
42 56
43 public: 57 public:
44 WindowsDecoder(); 58 WindowsDecoder();
45 ~WindowsDecoder() { uninitialize(); }; 59 ~WindowsDecoder() { uninitialize(); };
59 private: 73 private:
60 HMODULE _dbghelp_handle; 74 HMODULE _dbghelp_handle;
61 bool _can_decode_in_vm; 75 bool _can_decode_in_vm;
62 pfn_SymGetSymFromAddr64 _pfnSymGetSymFromAddr64; 76 pfn_SymGetSymFromAddr64 _pfnSymGetSymFromAddr64;
63 pfn_UndecorateSymbolName _pfnUndecorateSymbolName; 77 pfn_UndecorateSymbolName _pfnUndecorateSymbolName;
78 #ifdef AMD64
79 pfn_StackWalk64 _pfnStackWalk64;
80 pfn_SymFunctionTableAccess64 _pfnSymFunctionTableAccess64;
81 pfn_SymGetModuleBase64 _pfnSymGetModuleBase64;
82
83 friend class WindowsDbgHelp;
84 #endif
64 }; 85 };
86
87 #ifdef AMD64
88 // TODO: refactor and move the handling of dbghelp.dll outside of Decoder
89 class WindowsDbgHelp : public Decoder {
90 public:
91 static BOOL StackWalk64(DWORD MachineType,
92 HANDLE hProcess,
93 HANDLE hThread,
94 LPSTACKFRAME64 StackFrame,
95 PVOID ContextRecord,
96 PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
97 PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
98 PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
99 PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);
100 static PVOID SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase);
101
102 static pfn_SymFunctionTableAccess64 pfnSymFunctionTableAccess64();
103 static pfn_SymGetModuleBase64 pfnSymGetModuleBase64();
104 };
105 #endif
65 106
66 #endif // OS_WINDOWS_VM_DECODER_WINDOWS_HPP 107 #endif // OS_WINDOWS_VM_DECODER_WINDOWS_HPP
67 108