Mercurial > hg > truffle
annotate src/os/windows/vm/decoder_windows.cpp @ 17716:cdb71841f4bc
6498581: ThreadInterruptTest3 produces wrong output on Windows
Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set.
Reviewed-by: acorn, kvn
Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author | minqi |
---|---|
date | Wed, 26 Feb 2014 15:20:41 -0800 |
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 |