src/os/windows/vm/decoder_windows.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 22,44 **** * */ #include "precompiled.hpp" #include "prims/jvm.h" ! #include "runtime/os.hpp" ! #include "utilities/decoder.hpp" ! HMODULE Decoder::_dbghelp_handle = NULL; ! bool Decoder::_can_decode_in_vm = false; ! pfn_SymGetSymFromAddr64 Decoder::_pfnSymGetSymFromAddr64 = NULL; ! pfn_UndecorateSymbolName Decoder::_pfnUndecorateSymbolName = NULL; ! void Decoder::initialize() { ! if (!_initialized) { ! _initialized = true; ! HINSTANCE handle = os::win32::load_Windows_dll("dbghelp.dll", NULL, 0); if (!handle) { _decoder_status = helper_not_found; return; } --- 22,46 ---- * */ #include "precompiled.hpp" #include "prims/jvm.h" ! #include "decoder_windows.hpp" ! WindowsDecoder::WindowsDecoder() { ! _dbghelp_handle = NULL; ! _can_decode_in_vm = false; ! _pfnSymGetSymFromAddr64 = NULL; ! _pfnUndecorateSymbolName = NULL; ! _decoder_status = no_error; ! initialize(); ! } ! void WindowsDecoder::initialize() { ! if (!has_error() && _dbghelp_handle == NULL) { ! HMODULE handle = ::LoadLibrary("dbghelp.dll"); if (!handle) { _decoder_status = helper_not_found; return; }
*** 68,124 **** return; } // find out if jvm.dll contains private symbols, by decoding // current function and comparing the result ! address addr = (address)Decoder::initialize; char buf[MAX_PATH]; ! if (decode(addr, buf, sizeof(buf), NULL) == no_error) { ! _can_decode_in_vm = !strcmp(buf, "Decoder::initialize"); } } } ! void Decoder::uninitialize() { ! assert(_initialized, "Decoder not yet initialized"); _pfnSymGetSymFromAddr64 = NULL; _pfnUndecorateSymbolName = NULL; if (_dbghelp_handle != NULL) { ::FreeLibrary(_dbghelp_handle); } ! _initialized = false; } ! bool Decoder::can_decode_C_frame_in_vm() { ! initialize(); ! return _can_decode_in_vm; } ! Decoder::decoder_status Decoder::decode(address addr, char *buf, int buflen, int *offset) { ! assert(_initialized, "Decoder not yet initialized"); if (_pfnSymGetSymFromAddr64 != NULL) { PIMAGEHLP_SYMBOL64 pSymbol; char symbolInfo[MAX_PATH + sizeof(IMAGEHLP_SYMBOL64)]; pSymbol = (PIMAGEHLP_SYMBOL64)symbolInfo; pSymbol->MaxNameLength = MAX_PATH; pSymbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); DWORD64 displacement; if (_pfnSymGetSymFromAddr64(::GetCurrentProcess(), (DWORD64)addr, &displacement, pSymbol)) { if (buf != NULL) { ! if (!demangle(pSymbol->Name, buf, buflen)) { jio_snprintf(buf, buflen, "%s", pSymbol->Name); } } ! if (offset != NULL) *offset = (int)displacement; ! return no_error; } } ! return helper_not_found; } ! bool Decoder::demangle(const char* symbol, char *buf, int buflen) { ! assert(_initialized, "Decoder not yet initialized"); return _pfnUndecorateSymbolName != NULL && _pfnUndecorateSymbolName(symbol, buf, buflen, UNDNAME_COMPLETE); } --- 70,124 ---- return; } // find out if jvm.dll contains private symbols, by decoding // current function and comparing the result ! address addr = (address)Decoder::decode; char buf[MAX_PATH]; ! if (decode(addr, buf, sizeof(buf), NULL)) { ! _can_decode_in_vm = !strcmp(buf, "Decoder::decode"); } } } ! void WindowsDecoder::uninitialize() { _pfnSymGetSymFromAddr64 = NULL; _pfnUndecorateSymbolName = NULL; if (_dbghelp_handle != NULL) { ::FreeLibrary(_dbghelp_handle); } ! _dbghelp_handle = NULL; } ! bool WindowsDecoder::can_decode_C_frame_in_vm() const { ! return (!has_error() && _can_decode_in_vm); } ! bool WindowsDecoder::decode(address addr, char *buf, int buflen, int* offset, const char* modulepath) { if (_pfnSymGetSymFromAddr64 != NULL) { PIMAGEHLP_SYMBOL64 pSymbol; char symbolInfo[MAX_PATH + sizeof(IMAGEHLP_SYMBOL64)]; pSymbol = (PIMAGEHLP_SYMBOL64)symbolInfo; pSymbol->MaxNameLength = MAX_PATH; pSymbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); DWORD64 displacement; if (_pfnSymGetSymFromAddr64(::GetCurrentProcess(), (DWORD64)addr, &displacement, pSymbol)) { if (buf != NULL) { ! if (demangle(pSymbol->Name, buf, buflen)) { jio_snprintf(buf, buflen, "%s", pSymbol->Name); } } ! if(offset != NULL) *offset = (int)displacement; ! return true; } } ! if (buf != NULL && buflen > 0) buf[0] = '\0'; ! if (offset != NULL) *offset = -1; ! return false; } ! bool WindowsDecoder::demangle(const char* symbol, char *buf, int buflen) { return _pfnUndecorateSymbolName != NULL && _pfnUndecorateSymbolName(symbol, buf, buflen, UNDNAME_COMPLETE); }