< prev index next >
src/os/windows/vm/decoder_windows.cpp
Print this page
rev 13549 : 8185712: [windows] Improve native symbol decoder
Reviewed-by: goetz, zgu
@@ -21,138 +21,30 @@
* questions.
*
*/
#include "precompiled.hpp"
-#include "prims/jvm.h"
-#include "runtime/arguments.hpp"
-#include "runtime/os.hpp"
-#include "decoder_windows.hpp"
+#include "utilities/decoder.hpp"
+#include "symbolengine.hpp"
#include "windbghelp.hpp"
-WindowsDecoder::WindowsDecoder() {
- _can_decode_in_vm = true;
- _decoder_status = no_error;
- initialize();
+bool Decoder::decode(address addr, char* buf, int buflen, int* offset, const char* modulepath, bool demangle) {
+ return SymbolEngine::decode(addr, buf, buflen, offset, demangle);
}
-void WindowsDecoder::initialize() {
- if (!has_error()) {
- HANDLE hProcess = ::GetCurrentProcess();
- WindowsDbgHelp::symSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS | SYMOPT_EXACT_SYMBOLS);
- if (!WindowsDbgHelp::symInitialize(hProcess, NULL, TRUE)) {
- _decoder_status = helper_init_error;
- return;
- }
-
- // set pdb search paths
- char paths[MAX_PATH];
- int len = sizeof(paths);
- if (!WindowsDbgHelp::symGetSearchPath(hProcess, paths, len)) {
- paths[0] = '\0';
- } else {
- // available spaces in path buffer
- len -= (int)strlen(paths);
- }
-
- char tmp_path[MAX_PATH];
- DWORD dwSize;
- HMODULE hJVM = ::GetModuleHandle("jvm.dll");
- tmp_path[0] = '\0';
- // append the path where jvm.dll is located
- if (hJVM != NULL && (dwSize = ::GetModuleFileName(hJVM, tmp_path, sizeof(tmp_path))) > 0) {
- while (dwSize > 0 && tmp_path[dwSize] != '\\') {
- dwSize --;
- }
-
- tmp_path[dwSize] = '\0';
-
- if (dwSize > 0 && len > (int)dwSize + 1) {
- strncat(paths, os::path_separator(), 1);
- strncat(paths, tmp_path, dwSize);
- len -= dwSize + 1;
- }
- }
-
- // append $JRE/bin. Arguments::get_java_home actually returns $JRE
- // path
- char *p = Arguments::get_java_home();
- assert(p != NULL, "empty java home");
- size_t java_home_len = strlen(p);
- if (len > (int)java_home_len + 5) {
- strncat(paths, os::path_separator(), 1);
- strncat(paths, p, java_home_len);
- strncat(paths, "\\bin", 4);
- len -= (int)(java_home_len + 5);
- }
-
- // append $JDK/bin path if it exists
- assert(java_home_len < MAX_PATH, "Invalid path length");
- // assume $JRE is under $JDK, construct $JDK/bin path and
- // see if it exists or not
- if (strncmp(&p[java_home_len - 3], "jre", 3) == 0) {
- strncpy(tmp_path, p, java_home_len - 3);
- tmp_path[java_home_len - 3] = '\0';
- strncat(tmp_path, "bin", 3);
-
- // if the directory exists
- DWORD dwAttrib = GetFileAttributes(tmp_path);
- if (dwAttrib != INVALID_FILE_ATTRIBUTES &&
- (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) {
- // tmp_path should have the same length as java_home_len, since we only
- // replaced 'jre' with 'bin'
- if (len > (int)java_home_len + 1) {
- strncat(paths, os::path_separator(), 1);
- strncat(paths, tmp_path, java_home_len);
- }
- }
- }
-
- WindowsDbgHelp::symSetSearchPath(hProcess, paths);
-
- // find out if jvm.dll contains private symbols, by decoding
- // current function and comparing the result
- address addr = (address)Decoder::demangle;
- char buf[MAX_PATH];
- if (decode(addr, buf, sizeof(buf), NULL, NULL, true /* demangle */)) {
- _can_decode_in_vm = !strcmp(buf, "Decoder::demangle");
- }
- }
+bool Decoder::decode(address addr, char* buf, int buflen, int* offset, const void* base) {
+ return SymbolEngine::decode(addr, buf, buflen, offset, true);
}
-void WindowsDecoder::uninitialize() {}
-
-bool WindowsDecoder::can_decode_C_frame_in_vm() const {
- return (!has_error() && _can_decode_in_vm);
+bool Decoder::get_source_info(address pc, char* buf, size_t buflen, int* line) {
+ return SymbolEngine::get_source_info(pc, buf, buflen, line);
}
-
-bool WindowsDecoder::decode(address addr, char *buf, int buflen, int* offset, const char* modulepath, bool demangle_name) {
- if (!has_error()) {
- 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 (WindowsDbgHelp::symGetSymFromAddr64(::GetCurrentProcess(), (DWORD64)addr, &displacement, pSymbol)) {
- if (buf != NULL) {
- if (!(demangle_name && 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 Decoder::demangle(const char* symbol, char* buf, int buflen) {
+ return SymbolEngine::demangle(symbol, buf, buflen);
}
-bool WindowsDecoder::demangle(const char* symbol, char *buf, int buflen) {
- if (!has_error()) {
- return WindowsDbgHelp::unDecorateSymbolName(symbol, buf, buflen, UNDNAME_COMPLETE) > 0;
- }
- return false;
+void Decoder::print_state_on(outputStream* st) {
+ WindowsDbgHelp::print_state_on(st);
+ SymbolEngine::print_state_on(st);
}
< prev index next >