Mercurial > hg > truffle
annotate src/os/windows/vm/decoder_windows.cpp @ 21408:32ca2353accf
Truffle/Instrumentation: fix NPE hazard
author | Michael Van De Vanter <michael.van.de.vanter@oracle.com> |
---|---|
date | Sun, 17 May 2015 20:47:04 -0700 |
parents | 38f750491293 |
children |
rev | line source |
---|---|
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
1 /* |
8675
63e54c37ac64
8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents:
7580
diff
changeset
|
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
4 * |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
8 * |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
13 * accompanied this code). |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
14 * |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
18 * |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
21 * questions. |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
22 * |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
23 */ |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
24 |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
25 #include "precompiled.hpp" |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
26 #include "prims/jvm.h" |
8675
63e54c37ac64
8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents:
7580
diff
changeset
|
27 #include "runtime/arguments.hpp" |
4803 | 28 #include "decoder_windows.hpp" |
29 | |
30 WindowsDecoder::WindowsDecoder() { | |
31 _dbghelp_handle = NULL; | |
32 _can_decode_in_vm = false; | |
33 _pfnSymGetSymFromAddr64 = NULL; | |
34 _pfnUndecorateSymbolName = NULL; | |
12199
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
35 #ifdef AMD64 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
36 _pfnStackWalk64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
37 _pfnSymFunctionTableAccess64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
38 _pfnSymGetModuleBase64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
39 #endif |
4803 | 40 _decoder_status = no_error; |
41 initialize(); | |
42 } | |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
43 |
4803 | 44 void WindowsDecoder::initialize() { |
45 if (!has_error() && _dbghelp_handle == NULL) { | |
46 HMODULE handle = ::LoadLibrary("dbghelp.dll"); | |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
47 if (!handle) { |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
48 _decoder_status = helper_not_found; |
4803 | 49 return; |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
50 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
51 |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
52 _dbghelp_handle = handle; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
53 |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
54 pfn_SymSetOptions _pfnSymSetOptions = (pfn_SymSetOptions)::GetProcAddress(handle, "SymSetOptions"); |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
55 pfn_SymInitialize _pfnSymInitialize = (pfn_SymInitialize)::GetProcAddress(handle, "SymInitialize"); |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
56 _pfnSymGetSymFromAddr64 = (pfn_SymGetSymFromAddr64)::GetProcAddress(handle, "SymGetSymFromAddr64"); |
7580
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
57 _pfnUndecorateSymbolName = (pfn_UndecorateSymbolName)::GetProcAddress(handle, "UnDecorateSymbolName"); |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
58 |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
59 if (_pfnSymSetOptions == NULL || _pfnSymInitialize == NULL || _pfnSymGetSymFromAddr64 == NULL) { |
12199
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
60 uninitialize(); |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
61 _decoder_status = helper_func_error; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
62 return; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
63 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
64 |
12199
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
65 #ifdef AMD64 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
66 _pfnStackWalk64 = (pfn_StackWalk64)::GetProcAddress(handle, "StackWalk64"); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
67 _pfnSymFunctionTableAccess64 = (pfn_SymFunctionTableAccess64)::GetProcAddress(handle, "SymFunctionTableAccess64"); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
68 _pfnSymGetModuleBase64 = (pfn_SymGetModuleBase64)::GetProcAddress(handle, "SymGetModuleBase64"); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
69 if (_pfnStackWalk64 == NULL || _pfnSymFunctionTableAccess64 == NULL || _pfnSymGetModuleBase64 == NULL) { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
70 // We can't call StackWalk64 to walk the stack, but we are still |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
71 // able to decode the symbols. Let's limp on. |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
72 _pfnStackWalk64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
73 _pfnSymFunctionTableAccess64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
74 _pfnSymGetModuleBase64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
75 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
76 #endif |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
77 |
7580
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
78 HANDLE hProcess = ::GetCurrentProcess(); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
79 _pfnSymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS | SYMOPT_EXACT_SYMBOLS); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
80 if (!_pfnSymInitialize(hProcess, NULL, TRUE)) { |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
81 _pfnSymGetSymFromAddr64 = NULL; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
82 _pfnUndecorateSymbolName = NULL; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
83 ::FreeLibrary(handle); |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
84 _dbghelp_handle = NULL; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
85 _decoder_status = helper_init_error; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
86 return; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
87 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
88 |
7580
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
89 // set pdb search paths |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
90 pfn_SymSetSearchPath _pfn_SymSetSearchPath = |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
91 (pfn_SymSetSearchPath)::GetProcAddress(handle, "SymSetSearchPath"); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
92 pfn_SymGetSearchPath _pfn_SymGetSearchPath = |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
93 (pfn_SymGetSearchPath)::GetProcAddress(handle, "SymGetSearchPath"); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
94 if (_pfn_SymSetSearchPath != NULL && _pfn_SymGetSearchPath != NULL) { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
95 char paths[MAX_PATH]; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
96 int len = sizeof(paths); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
97 if (!_pfn_SymGetSearchPath(hProcess, paths, len)) { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
98 paths[0] = '\0'; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
99 } else { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
100 // available spaces in path buffer |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
101 len -= (int)strlen(paths); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
102 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
103 |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
104 char tmp_path[MAX_PATH]; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
105 DWORD dwSize; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
106 HMODULE hJVM = ::GetModuleHandle("jvm.dll"); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
107 tmp_path[0] = '\0'; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
108 // append the path where jvm.dll is located |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
109 if (hJVM != NULL && (dwSize = ::GetModuleFileName(hJVM, tmp_path, sizeof(tmp_path))) > 0) { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
110 while (dwSize > 0 && tmp_path[dwSize] != '\\') { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
111 dwSize --; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
112 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
113 |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
114 tmp_path[dwSize] = '\0'; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
115 |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
116 if (dwSize > 0 && len > (int)dwSize + 1) { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
117 strncat(paths, os::path_separator(), 1); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
118 strncat(paths, tmp_path, dwSize); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
119 len -= dwSize + 1; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
120 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
121 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
122 |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
123 // append $JRE/bin. Arguments::get_java_home actually returns $JRE |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
124 // path |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
125 char *p = Arguments::get_java_home(); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
126 assert(p != NULL, "empty java home"); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
127 size_t java_home_len = strlen(p); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
128 if (len > (int)java_home_len + 5) { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
129 strncat(paths, os::path_separator(), 1); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
130 strncat(paths, p, java_home_len); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
131 strncat(paths, "\\bin", 4); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
132 len -= (int)(java_home_len + 5); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
133 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
134 |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
135 // append $JDK/bin path if it exists |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
136 assert(java_home_len < MAX_PATH, "Invalid path length"); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
137 // assume $JRE is under $JDK, construct $JDK/bin path and |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
138 // see if it exists or not |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
139 if (strncmp(&p[java_home_len - 3], "jre", 3) == 0) { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
140 strncpy(tmp_path, p, java_home_len - 3); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
141 tmp_path[java_home_len - 3] = '\0'; |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
142 strncat(tmp_path, "bin", 3); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
143 |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
144 // if the directory exists |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
145 DWORD dwAttrib = GetFileAttributes(tmp_path); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
146 if (dwAttrib != INVALID_FILE_ATTRIBUTES && |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
147 (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
148 // tmp_path should have the same length as java_home_len, since we only |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
149 // replaced 'jre' with 'bin' |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
150 if (len > (int)java_home_len + 1) { |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
151 strncat(paths, os::path_separator(), 1); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
152 strncat(paths, tmp_path, java_home_len); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
153 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
154 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
155 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
156 |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
157 _pfn_SymSetSearchPath(hProcess, paths); |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
158 } |
dd7248d3e151
7152671: RFE: Windows decoder should add some std dirs to the symbol search path
zgu
parents:
6842
diff
changeset
|
159 |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
160 // find out if jvm.dll contains private symbols, by decoding |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
161 // current function and comparing the result |
6258 | 162 address addr = (address)Decoder::demangle; |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
163 char buf[MAX_PATH]; |
4803 | 164 if (decode(addr, buf, sizeof(buf), NULL)) { |
6258 | 165 _can_decode_in_vm = !strcmp(buf, "Decoder::demangle"); |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
166 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
167 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
168 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
169 |
4803 | 170 void WindowsDecoder::uninitialize() { |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
171 _pfnSymGetSymFromAddr64 = NULL; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
172 _pfnUndecorateSymbolName = NULL; |
12199
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
173 #ifdef AMD64 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
174 _pfnStackWalk64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
175 _pfnSymFunctionTableAccess64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
176 _pfnSymGetModuleBase64 = NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
177 #endif |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
178 if (_dbghelp_handle != NULL) { |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
179 ::FreeLibrary(_dbghelp_handle); |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
180 } |
4803 | 181 _dbghelp_handle = NULL; |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
182 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
183 |
4803 | 184 bool WindowsDecoder::can_decode_C_frame_in_vm() const { |
185 return (!has_error() && _can_decode_in_vm); | |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
186 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
187 |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
188 |
4803 | 189 bool WindowsDecoder::decode(address addr, char *buf, int buflen, int* offset, const char* modulepath) { |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
190 if (_pfnSymGetSymFromAddr64 != NULL) { |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
191 PIMAGEHLP_SYMBOL64 pSymbol; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
192 char symbolInfo[MAX_PATH + sizeof(IMAGEHLP_SYMBOL64)]; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
193 pSymbol = (PIMAGEHLP_SYMBOL64)symbolInfo; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
194 pSymbol->MaxNameLength = MAX_PATH; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
195 pSymbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
196 DWORD64 displacement; |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
197 if (_pfnSymGetSymFromAddr64(::GetCurrentProcess(), (DWORD64)addr, &displacement, pSymbol)) { |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
198 if (buf != NULL) { |
4803 | 199 if (demangle(pSymbol->Name, buf, buflen)) { |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
200 jio_snprintf(buf, buflen, "%s", pSymbol->Name); |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
201 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
202 } |
4803 | 203 if(offset != NULL) *offset = (int)displacement; |
204 return true; | |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
205 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
206 } |
4803 | 207 if (buf != NULL && buflen > 0) buf[0] = '\0'; |
208 if (offset != NULL) *offset = -1; | |
209 return false; | |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
210 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
211 |
4803 | 212 bool WindowsDecoder::demangle(const char* symbol, char *buf, int buflen) { |
2022
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
213 return _pfnUndecorateSymbolName != NULL && |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
214 _pfnUndecorateSymbolName(symbol, buf, buflen, UNDNAME_COMPLETE); |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
215 } |
2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff
changeset
|
216 |
12199
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
217 #ifdef AMD64 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
218 BOOL WindowsDbgHelp::StackWalk64(DWORD MachineType, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
219 HANDLE hProcess, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
220 HANDLE hThread, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
221 LPSTACKFRAME64 StackFrame, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
222 PVOID ContextRecord, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
223 PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
224 PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
225 PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
226 PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress) { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
227 DecoderLocker locker; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
228 WindowsDecoder* wd = (WindowsDecoder*)locker.decoder(); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
229 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
230 if (!wd->has_error() && wd->_pfnStackWalk64) { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
231 return wd->_pfnStackWalk64(MachineType, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
232 hProcess, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
233 hThread, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
234 StackFrame, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
235 ContextRecord, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
236 ReadMemoryRoutine, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
237 FunctionTableAccessRoutine, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
238 GetModuleBaseRoutine, |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
239 TranslateAddress); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
240 } else { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
241 return false; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
242 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
243 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
244 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
245 PVOID WindowsDbgHelp::SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase) { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
246 DecoderLocker locker; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
247 WindowsDecoder* wd = (WindowsDecoder*)locker.decoder(); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
248 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
249 if (!wd->has_error() && wd->_pfnSymFunctionTableAccess64) { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
250 return wd->_pfnSymFunctionTableAccess64(hProcess, AddrBase); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
251 } else { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
252 return NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
253 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
254 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
255 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
256 pfn_SymFunctionTableAccess64 WindowsDbgHelp::pfnSymFunctionTableAccess64() { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
257 DecoderLocker locker; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
258 WindowsDecoder* wd = (WindowsDecoder*)locker.decoder(); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
259 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
260 if (!wd->has_error()) { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
261 return wd->_pfnSymFunctionTableAccess64; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
262 } else { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
263 return NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
264 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
265 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
266 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
267 pfn_SymGetModuleBase64 WindowsDbgHelp::pfnSymGetModuleBase64() { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
268 DecoderLocker locker; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
269 WindowsDecoder* wd = (WindowsDecoder*)locker.decoder(); |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
270 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
271 if (!wd->has_error()) { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
272 return wd->_pfnSymGetModuleBase64; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
273 } else { |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
274 return NULL; |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
275 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
276 } |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
277 |
38f750491293
8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents:
8675
diff
changeset
|
278 #endif // AMD64 |