Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/os/windows/vm/decoder_windows.hpp
32284 views
/*1* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#ifndef OS_WINDOWS_VM_DECODER_WINDOWS_HPP25#define OS_WINDOWS_VM_DECIDER_WINDOWS_HPP2627#include <windows.h>28#include <imagehlp.h>2930#include "utilities/decoder.hpp"3132// functions needed for decoding symbols33typedef DWORD (WINAPI *pfn_SymSetOptions)(DWORD);34typedef BOOL (WINAPI *pfn_SymInitialize)(HANDLE, PCTSTR, BOOL);35typedef BOOL (WINAPI *pfn_SymGetSymFromAddr64)(HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64);36typedef DWORD (WINAPI *pfn_UndecorateSymbolName)(const char*, char*, DWORD, DWORD);37typedef BOOL (WINAPI *pfn_SymSetSearchPath)(HANDLE, PCTSTR);38typedef BOOL (WINAPI *pfn_SymGetSearchPath)(HANDLE, PTSTR, int);3940#ifdef AMD6441typedef BOOL (WINAPI *pfn_StackWalk64)(DWORD MachineType,42HANDLE hProcess,43HANDLE hThread,44LPSTACKFRAME64 StackFrame,45PVOID ContextRecord,46PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,47PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,48PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,49PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);50typedef PVOID (WINAPI *pfn_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase);51typedef DWORD64 (WINAPI *pfn_SymGetModuleBase64)(HANDLE hProcess, DWORD64 dwAddr);52#endif5354class WindowsDecoder : public AbstractDecoder {5556public:57WindowsDecoder();58~WindowsDecoder() { uninitialize(); };5960bool can_decode_C_frame_in_vm() const;61bool demangle(const char* symbol, char *buf, int buflen);62bool decode(address addr, char *buf, int buflen, int* offset, const char* modulepath = NULL);63bool decode(address addr, char *buf, int buflen, int* offset, const void* base) {64ShouldNotReachHere();65return false;66}6768private:69void initialize();70void uninitialize();7172private:73HMODULE _dbghelp_handle;74bool _can_decode_in_vm;75pfn_SymGetSymFromAddr64 _pfnSymGetSymFromAddr64;76pfn_UndecorateSymbolName _pfnUndecorateSymbolName;77#ifdef AMD6478pfn_StackWalk64 _pfnStackWalk64;79pfn_SymFunctionTableAccess64 _pfnSymFunctionTableAccess64;80pfn_SymGetModuleBase64 _pfnSymGetModuleBase64;8182friend class WindowsDbgHelp;83#endif84};8586#ifdef AMD6487// TODO: refactor and move the handling of dbghelp.dll outside of Decoder88class WindowsDbgHelp : public Decoder {89public:90static BOOL StackWalk64(DWORD MachineType,91HANDLE hProcess,92HANDLE hThread,93LPSTACKFRAME64 StackFrame,94PVOID ContextRecord,95PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,96PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,97PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,98PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);99static PVOID SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase);100101static pfn_SymFunctionTableAccess64 pfnSymFunctionTableAccess64();102static pfn_SymGetModuleBase64 pfnSymGetModuleBase64();103};104#endif105106#endif // OS_WINDOWS_VM_DECODER_WINDOWS_HPP107108109110