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);
}