Mercurial > hg > truffle
annotate agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java @ 2072:d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
Summary: Change ExportDirectoryTableImpl to return the 'Export RVA' field without modification. Read 'Base Of Data' field in optional header when PE32 format COFF file is read. Refine search for dbgeng.dll and dbghelp.dll. Other cleanups.
Reviewed-by: swamyv, poonam
author | dcubed |
---|---|
date | Thu, 23 Dec 2010 07:58:35 -0800 |
parents | c18cbe5936b8 |
children | 8e47bac5643a |
rev | line source |
---|---|
0 | 1 /* |
2072
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
2 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 package sun.jvm.hotspot.debugger.windbg; | |
26 | |
27 import java.io.*; | |
28 import java.net.*; | |
29 import java.util.*; | |
30 import sun.jvm.hotspot.debugger.*; | |
31 import sun.jvm.hotspot.debugger.amd64.*; | |
32 import sun.jvm.hotspot.debugger.x86.*; | |
33 import sun.jvm.hotspot.debugger.ia64.*; | |
34 import sun.jvm.hotspot.debugger.windbg.amd64.*; | |
35 import sun.jvm.hotspot.debugger.windbg.x86.*; | |
36 import sun.jvm.hotspot.debugger.windbg.ia64.*; | |
37 import sun.jvm.hotspot.debugger.win32.coff.*; | |
38 import sun.jvm.hotspot.debugger.cdbg.*; | |
39 import sun.jvm.hotspot.debugger.cdbg.basic.BasicDebugEvent; | |
40 import sun.jvm.hotspot.utilities.*; | |
41 import sun.jvm.hotspot.utilities.memo.*; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
42 import sun.jvm.hotspot.runtime.*; |
0 | 43 |
44 /** <P> An implementation of the JVMDebugger interface which talks to | |
45 windbg and symbol table management is done in Java. </P> | |
46 | |
47 <P> <B>NOTE</B> that since we have the notion of fetching "Java | |
48 primitive types" from the remote process (which might have | |
49 different sizes than we expect) we have a bootstrapping | |
50 problem. We need to know the sizes of these types before we can | |
51 fetch them. The current implementation solves this problem by | |
52 requiring that it be configured with these type sizes before they | |
53 can be fetched. The readJ(Type) routines here will throw a | |
54 RuntimeException if they are called before the debugger is | |
55 configured with the Java primitive type sizes. </P> */ | |
56 | |
57 public class WindbgDebuggerLocal extends DebuggerBase implements WindbgDebugger { | |
58 private PageCache cache; | |
59 private boolean attached; | |
60 private boolean isCore; | |
61 | |
62 // Symbol lookup support | |
63 // This is a map of library names to DLLs | |
64 private Map nameToDllMap; | |
65 | |
66 // C/C++ debugging support | |
67 private List/*<LoadObject>*/ loadObjects; | |
68 private CDebugger cdbg; | |
69 | |
70 // thread access | |
71 private Map threadIntegerRegisterSet; | |
72 private List threadList; | |
73 | |
74 // windbg native interface pointers | |
75 | |
76 private long ptrIDebugClient; | |
77 private long ptrIDebugControl; | |
78 private long ptrIDebugDataSpaces; | |
79 private long ptrIDebugOutputCallbacks; | |
80 private long ptrIDebugAdvanced; | |
81 private long ptrIDebugSymbols; | |
82 private long ptrIDebugSystemObjects; | |
83 | |
84 private WindbgThreadFactory threadFactory; | |
85 | |
86 //-------------------------------------------------------------------------------- | |
87 // Implementation of Debugger interface | |
88 // | |
89 | |
90 /** <P> machDesc may not be null. </P> | |
91 | |
92 <P> useCache should be set to true if debugging is being done | |
93 locally, and to false if the debugger is being created for the | |
94 purpose of supporting remote debugging. </P> */ | |
95 public WindbgDebuggerLocal(MachineDescription machDesc, | |
96 boolean useCache) throws DebuggerException { | |
97 this.machDesc = machDesc; | |
98 utils = new DebuggerUtilities(machDesc.getAddressSize(), machDesc.isBigEndian()) { | |
99 public void checkAlignment(long address, long alignment) { | |
100 // Need to override default checkAlignment because we need to | |
101 // relax alignment constraints on Windows/x86 | |
102 if ( (address % alignment != 0) | |
103 &&(alignment != 8 || address % 4 != 0)) { | |
104 throw new UnalignedAddressException( | |
105 "Trying to read at address: " | |
106 + addressValueToString(address) | |
107 + " with alignment: " + alignment, | |
108 address); | |
109 } | |
110 } | |
111 }; | |
112 | |
113 String cpu = PlatformInfo.getCPU(); | |
114 if (cpu.equals("x86")) { | |
115 threadFactory = new WindbgX86ThreadFactory(this); | |
116 } else if (cpu.equals("amd64")) { | |
117 threadFactory = new WindbgAMD64ThreadFactory(this); | |
118 } else if (cpu.equals("ia64")) { | |
119 threadFactory = new WindbgIA64ThreadFactory(this); | |
120 } | |
121 | |
122 if (useCache) { | |
123 // Cache portion of the remote process's address space. | |
124 // Fetching data over the socket connection to dbx is slow. | |
125 // Might be faster if we were using a binary protocol to talk to | |
126 // dbx, but would have to test. For now, this cache works best | |
127 // if it covers the entire heap of the remote process. FIXME: at | |
128 // least should make this tunable from the outside, i.e., via | |
129 // the UI. This is a cache of 4096 4K pages, or 16 MB. The page | |
130 // size must be adjusted to be the hardware's page size. | |
131 // (FIXME: should pick this up from the debugger.) | |
132 initCache(4096, 4096); | |
133 } | |
134 // FIXME: add instantiation of thread factory | |
135 | |
136 } | |
137 | |
138 /** From the Debugger interface via JVMDebugger */ | |
139 public boolean hasProcessList() throws DebuggerException { | |
140 return false; | |
141 } | |
142 | |
143 /** From the Debugger interface via JVMDebugger */ | |
144 public List getProcessList() throws DebuggerException { | |
145 return null; | |
146 } | |
147 | |
148 | |
149 /** From the Debugger interface via JVMDebugger */ | |
150 public synchronized void attach(int processID) throws DebuggerException { | |
151 attachInit(); | |
152 attach0(processID); | |
153 attached = true; | |
154 isCore = false; | |
155 } | |
156 | |
157 /** From the Debugger interface via JVMDebugger */ | |
158 public synchronized void attach(String executableName, String coreFileName) throws DebuggerException { | |
159 attachInit(); | |
160 attach0(executableName, coreFileName); | |
161 attached = true; | |
162 isCore = true; | |
163 } | |
164 | |
165 public List getLoadObjectList() { | |
166 requireAttach(); | |
167 return loadObjects; | |
168 } | |
169 | |
170 /** From the Debugger interface via JVMDebugger */ | |
171 public synchronized boolean detach() { | |
172 if ( ! attached) | |
173 return false; | |
174 | |
175 // Close all open DLLs | |
176 if (nameToDllMap != null) { | |
177 for (Iterator iter = nameToDllMap.values().iterator(); iter.hasNext(); ) { | |
178 DLL dll = (DLL) iter.next(); | |
179 dll.close(); | |
180 } | |
181 nameToDllMap = null; | |
182 loadObjects = null; | |
183 } | |
184 | |
185 cdbg = null; | |
186 clearCache(); | |
187 | |
188 threadIntegerRegisterSet = null; | |
189 threadList = null; | |
190 try { | |
191 detach0(); | |
192 } finally { | |
193 attached = false; | |
194 resetNativePointers(); | |
195 } | |
196 return true; | |
197 } | |
198 | |
199 | |
200 /** From the Debugger interface via JVMDebugger */ | |
201 public Address parseAddress(String addressString) throws NumberFormatException { | |
202 return newAddress(utils.scanAddress(addressString)); | |
203 } | |
204 | |
205 /** From the Debugger interface via JVMDebugger */ | |
206 public String getOS() { | |
207 return PlatformInfo.getOS(); | |
208 } | |
209 | |
210 /** From the Debugger interface via JVMDebugger */ | |
211 public String getCPU() { | |
212 return PlatformInfo.getCPU(); | |
213 } | |
214 | |
215 public boolean hasConsole() throws DebuggerException { | |
216 return true; | |
217 } | |
218 | |
219 public synchronized String consoleExecuteCommand(String cmd) throws DebuggerException { | |
220 requireAttach(); | |
221 if (! attached) { | |
222 throw new DebuggerException("debugger not yet attached to a Dr. Watson dump!"); | |
223 } | |
224 | |
225 return consoleExecuteCommand0(cmd); | |
226 } | |
227 | |
228 public String getConsolePrompt() throws DebuggerException { | |
229 return "(windbg)"; | |
230 } | |
231 | |
232 public CDebugger getCDebugger() throws DebuggerException { | |
233 if (cdbg == null) { | |
234 // FIXME: CDebugger is not yet supported for IA64 because | |
235 // of native stack walking issues. | |
236 if (! getCPU().equals("ia64")) { | |
237 cdbg = new WindbgCDebugger(this); | |
238 } | |
239 } | |
240 return cdbg; | |
241 } | |
242 | |
243 /** From the SymbolLookup interface via Debugger and JVMDebugger */ | |
244 public synchronized Address lookup(String objectName, String symbol) { | |
245 requireAttach(); | |
246 return newAddress(lookupByName(objectName, symbol)); | |
247 } | |
248 | |
249 /** From the SymbolLookup interface via Debugger and JVMDebugger */ | |
250 public synchronized OopHandle lookupOop(String objectName, String symbol) { | |
251 Address addr = lookup(objectName, symbol); | |
252 if (addr == null) { | |
253 return null; | |
254 } | |
255 return addr.addOffsetToAsOopHandle(0); | |
256 } | |
257 | |
258 public synchronized ClosestSymbol lookup(long address) { | |
259 return lookupByAddress0(address); | |
260 } | |
261 | |
262 /** From the Debugger interface */ | |
263 public MachineDescription getMachineDescription() { | |
264 return machDesc; | |
265 } | |
266 | |
267 //-------------------------------------------------------------------------------- | |
268 // Implementation of ThreadAccess interface | |
269 // | |
270 | |
271 | |
272 /** From the ThreadAccess interface via Debugger and JVMDebugger */ | |
273 public ThreadProxy getThreadForIdentifierAddress(Address addr) { | |
274 return threadFactory.createThreadWrapper(addr); | |
275 } | |
276 | |
277 public ThreadProxy getThreadForThreadId(long handle) { | |
278 // with windbg we can't make out using handle | |
279 throw new DebuggerException("Unimplemented!"); | |
280 } | |
281 | |
282 public long getThreadIdFromSysId(long sysId) throws DebuggerException { | |
283 requireAttach(); | |
284 return getThreadIdFromSysId0(sysId); | |
285 } | |
286 | |
287 //---------------------------------------------------------------------- | |
288 // Overridden from DebuggerBase because we need to relax alignment | |
289 // constraints on x86 | |
290 | |
291 public long readJLong(long address) | |
292 throws UnmappedAddressException, UnalignedAddressException { | |
293 checkJavaConfigured(); | |
294 // FIXME: allow this to be configurable. Undesirable to add a | |
295 // dependency on the runtime package here, though, since this | |
296 // package should be strictly underneath it. | |
297 // utils.checkAlignment(address, jlongSize); | |
298 utils.checkAlignment(address, jintSize); | |
299 byte[] data = readBytes(address, jlongSize); | |
300 return utils.dataToJLong(data, jlongSize); | |
301 } | |
302 | |
303 //-------------------------------------------------------------------------------- | |
304 // Internal routines (for implementation of WindbgAddress). | |
305 // These must not be called until the MachineDescription has been set up. | |
306 // | |
307 | |
308 /** From the WindbgDebugger interface */ | |
309 public String addressValueToString(long address) { | |
310 return utils.addressValueToString(address); | |
311 } | |
312 | |
313 /** From the WindbgDebugger interface */ | |
314 public WindbgAddress readAddress(long address) | |
315 throws UnmappedAddressException, UnalignedAddressException { | |
316 return (WindbgAddress) newAddress(readAddressValue(address)); | |
317 } | |
318 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
319 public WindbgAddress readCompOopAddress(long address) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
320 throws UnmappedAddressException, UnalignedAddressException { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
321 return (WindbgAddress) newAddress(readCompOopAddressValue(address)); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
322 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
323 |
0 | 324 /** From the WindbgDebugger interface */ |
325 public WindbgOopHandle readOopHandle(long address) | |
326 throws UnmappedAddressException, UnalignedAddressException, NotInHeapException { | |
327 long value = readAddressValue(address); | |
328 return (value == 0 ? null : new WindbgOopHandle(this, value)); | |
329 } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
330 public WindbgOopHandle readCompOopHandle(long address) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
331 throws UnmappedAddressException, UnalignedAddressException, NotInHeapException { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
332 long value = readCompOopAddressValue(address); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
333 return (value == 0 ? null : new WindbgOopHandle(this, value)); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
334 } |
0 | 335 |
336 /** From the WindbgDebugger interface */ | |
337 public int getAddressSize() { | |
338 return (int) machDesc.getAddressSize(); | |
339 } | |
340 | |
341 //-------------------------------------------------------------------------------- | |
342 // Thread context access | |
343 // | |
344 | |
345 private synchronized void setThreadIntegerRegisterSet(long threadId, | |
346 long[] regs) { | |
347 threadIntegerRegisterSet.put(new Long(threadId), regs); | |
348 } | |
349 | |
350 private synchronized void addThread(long sysId) { | |
351 threadList.add(threadFactory.createThreadWrapper(sysId)); | |
352 } | |
353 | |
354 public synchronized long[] getThreadIntegerRegisterSet(long threadId) | |
355 throws DebuggerException { | |
356 requireAttach(); | |
357 return (long[]) threadIntegerRegisterSet.get(new Long(threadId)); | |
358 } | |
359 | |
360 public synchronized List getThreadList() throws DebuggerException { | |
361 requireAttach(); | |
362 return threadList; | |
363 } | |
364 | |
365 private String findFullPath(String file) { | |
366 File f = new File(file); | |
367 if (f.exists()) { | |
368 return file; | |
369 } else { | |
370 // remove path part, if any. | |
371 file = f.getName(); | |
372 StringTokenizer st = new StringTokenizer(imagePath, File.pathSeparator); | |
373 while (st.hasMoreTokens()) { | |
374 f = new File(st.nextToken(), file); | |
375 if (f.exists()) { | |
376 return f.getPath(); | |
377 } | |
378 } | |
379 } | |
380 return null; | |
381 } | |
382 | |
383 private synchronized void addLoadObject(String file, long size, long base) { | |
384 String path = findFullPath(file); | |
385 if (path != null) { | |
386 DLL dll = null; | |
387 if (useNativeLookup) { | |
388 dll = new DLL(this, path, size,newAddress(base)) { | |
389 public ClosestSymbol closestSymbolToPC(Address pcAsAddr) { | |
390 long pc = getAddressValue(pcAsAddr); | |
391 ClosestSymbol sym = lookupByAddress0(pc); | |
392 if (sym == null) { | |
393 return super.closestSymbolToPC(pcAsAddr); | |
394 } else { | |
395 return sym; | |
396 } | |
397 } | |
398 }; | |
399 } else { | |
400 dll = new DLL(this, path, size, newAddress(base)); | |
401 } | |
402 loadObjects.add(dll); | |
403 nameToDllMap.put(new File(file).getName(), dll); | |
404 } | |
405 } | |
406 | |
407 //-------------------------------------------------------------------------------- | |
408 // Address access | |
409 // | |
410 | |
411 /** From the Debugger interface */ | |
412 public long getAddressValue(Address addr) { | |
413 if (addr == null) return 0; | |
414 return ((WindbgAddress) addr).getValue(); | |
415 } | |
416 | |
417 /** From the WindbgDebugger interface */ | |
418 public Address newAddress(long value) { | |
419 if (value == 0) return null; | |
420 return new WindbgAddress(this, value); | |
421 } | |
422 | |
423 //-------------------------------------------------------------------------------- | |
424 // Internals only below this point | |
425 // | |
426 | |
427 // attach/detach helpers | |
428 private void checkAttached() { | |
429 if (attached) { | |
430 String msg = (isCore)? "already attached to a Dr. Watson dump!" : | |
431 "already attached to a process!"; | |
432 throw new DebuggerException(msg); | |
433 } | |
434 } | |
435 | |
436 private void requireAttach() { | |
437 if (!attached) { | |
438 throw new RuntimeException("not attached to a process or Dr Watson dump"); | |
439 } | |
440 } | |
441 | |
442 private void attachInit() { | |
443 checkAttached(); | |
444 loadObjects = new ArrayList(); | |
445 nameToDllMap = new HashMap(); | |
446 threadIntegerRegisterSet = new HashMap(); | |
447 threadList = new ArrayList(); | |
448 } | |
449 | |
450 private void resetNativePointers() { | |
451 ptrIDebugClient = 0L; | |
452 ptrIDebugControl = 0L; | |
453 ptrIDebugDataSpaces = 0L; | |
454 ptrIDebugOutputCallbacks = 0L; | |
455 ptrIDebugAdvanced = 0L; | |
456 ptrIDebugSymbols = 0L; | |
457 ptrIDebugSystemObjects = 0L; | |
458 } | |
459 | |
460 synchronized long lookupByName(String objectName, String symbol) { | |
461 long res = 0L; | |
462 if (useNativeLookup) { | |
463 res = lookupByName0(objectName, symbol); | |
464 if (res != 0L) { | |
465 return res; | |
466 } // else fallthru... | |
467 } | |
468 | |
469 DLL dll = (DLL) nameToDllMap.get(objectName); | |
470 // The DLL can be null because we use this to search through known | |
471 // DLLs in HotSpotTypeDataBase (for example) | |
472 if (dll != null) { | |
473 WindbgAddress addr = (WindbgAddress) dll.lookupSymbol(symbol); | |
474 if (addr != null) { | |
475 return addr.getValue(); | |
476 } | |
477 } | |
478 return 0L; | |
479 } | |
480 | |
481 /** This reads bytes from the remote process. */ | |
482 public synchronized ReadResult readBytesFromProcess(long address, long numBytes) | |
483 throws UnmappedAddressException, DebuggerException { | |
484 requireAttach(); | |
485 byte[] res = readBytesFromProcess0(address, numBytes); | |
486 if(res != null) | |
487 return new ReadResult(res); | |
488 else | |
489 return new ReadResult(address); | |
490 } | |
491 | |
492 | |
493 private DLL findDLLByName(String fullPathName) { | |
494 for (Iterator iter = loadObjects.iterator(); iter.hasNext(); ) { | |
495 DLL dll = (DLL) iter.next(); | |
496 if (dll.getName().equals(fullPathName)) { | |
497 return dll; | |
498 } | |
499 } | |
500 return null; | |
501 } | |
502 | |
503 public void writeBytesToProcess(long address, long numBytes, byte[] data) | |
504 throws UnmappedAddressException, DebuggerException { | |
505 // FIXME | |
506 throw new DebuggerException("Unimplemented"); | |
507 } | |
508 | |
509 private static String imagePath; | |
510 private static String symbolPath; | |
511 private static boolean useNativeLookup; | |
512 | |
513 static { | |
514 | |
515 /* | |
2072
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
516 * sawindbg.dll depends on dbgeng.dll which itself depends on |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
517 * dbghelp.dll. We have to make sure that the dbgeng.dll and |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
518 * dbghelp.dll that we load are compatible with each other. We |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
519 * load both of those libraries from the same directory based |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
520 * on the theory that co-located libraries are compatible. |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
521 * |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
522 * On Windows 2000 and earlier, dbgeng.dll and dbghelp.dll were |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
523 * not included as part of the standard system directory. On |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
524 * systems newer than Windows 2000, dbgeng.dll and dbghelp.dll |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
525 * are included in the standard system directory. However, the |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
526 * versions included in the standard system directory may not |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
527 * be able to handle symbol information for the newer compilers. |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
528 * |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
529 * We search for and explicitly load the libraries using the |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
530 * following directory search order: |
0 | 531 * |
2072
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
532 * - java.home/bin (same as $JAVA_HOME/jre/bin) |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
533 * - dir named by DEBUGGINGTOOLSFORWINDOWS environment variable |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
534 * - various "Debugging Tools For Windows" program directories |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
535 * - the system directory ($SYSROOT/system32) |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
536 * |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
537 * If SA is invoked with -Dsun.jvm.hotspot.loadLibrary.DEBUG=1, |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
538 * then debug messages about library loading are printed to |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
539 * System.err. |
0 | 540 */ |
541 | |
2072
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
542 String dbgengPath = null; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
543 String dbghelpPath = null; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
544 String sawindbgPath = null; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
545 List searchList = new ArrayList(); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
546 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
547 boolean loadLibraryDEBUG = |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
548 System.getProperty("sun.jvm.hotspot.loadLibrary.DEBUG") != null; |
0 | 549 |
550 { | |
2072
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
551 // First place to search is co-located with sawindbg.dll in |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
552 // $JAVA_HOME/jre/bin (java.home property is set to $JAVA_HOME/jre): |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
553 searchList.add(System.getProperty("java.home") + File.separator + "bin"); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
554 sawindbgPath = (String) searchList.get(0) + File.separator + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
555 "sawindbg.dll"; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
556 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
557 // second place to search is specified by an environment variable: |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
558 String DTFWHome = System.getenv("DEBUGGINGTOOLSFORWINDOWS"); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
559 if (DTFWHome != null) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
560 searchList.add(DTFWHome); |
0 | 561 } |
562 | |
2072
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
563 // The third place to search is the install directory for the |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
564 // "Debugging Tools For Windows" package; so far there are three |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
565 // name variations that we know of: |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
566 String sysRoot = System.getenv("SYSTEMROOT"); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
567 DTFWHome = sysRoot + File.separator + ".." + File.separator + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
568 "Program Files" + File.separator + "Debugging Tools For Windows"; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
569 searchList.add(DTFWHome); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
570 searchList.add(DTFWHome + " (x86)"); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
571 searchList.add(DTFWHome + " (x64)"); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
572 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
573 // The last place to search is the system directory: |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
574 searchList.add(sysRoot + File.separator + "system32"); |
0 | 575 } |
576 | |
2072
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
577 for (int i = 0; i < searchList.size(); i++) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
578 File dir = new File((String) searchList.get(i)); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
579 if (!dir.exists()) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
580 if (loadLibraryDEBUG) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
581 System.err.println("DEBUG: '" + searchList.get(i) + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
582 "': directory does not exist."); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
583 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
584 // this search directory doesn't exist so skip it |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
585 continue; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
586 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
587 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
588 dbgengPath = (String) searchList.get(i) + File.separator + "dbgeng.dll"; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
589 dbghelpPath = (String) searchList.get(i) + File.separator + "dbghelp.dll"; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
590 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
591 File feng = new File(dbgengPath); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
592 File fhelp = new File(dbghelpPath); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
593 if (feng.exists() && fhelp.exists()) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
594 // both files exist so we have a match |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
595 break; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
596 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
597 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
598 // At least one of the files does not exist; no warning if both |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
599 // don't exist. If just one doesn't exist then we don't check |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
600 // loadLibraryDEBUG because we have a mis-configured system. |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
601 if (feng.exists()) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
602 System.err.println("WARNING: found '" + dbgengPath + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
603 "' but did not find '" + dbghelpPath + "'; ignoring '" + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
604 dbgengPath + "'."); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
605 } else if (fhelp.exists()) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
606 System.err.println("WARNING: found '" + dbghelpPath + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
607 "' but did not find '" + dbgengPath + "'; ignoring '" + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
608 dbghelpPath + "'."); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
609 } else if (loadLibraryDEBUG) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
610 System.err.println("DEBUG: searched '" + searchList.get(i) + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
611 "': dbgeng.dll and dbghelp.dll were not found."); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
612 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
613 dbgengPath = null; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
614 dbghelpPath = null; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
615 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
616 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
617 if (dbgengPath == null || dbghelpPath == null) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
618 // at least one of the files wasn't found anywhere we searched |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
619 String mesg = null; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
620 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
621 if (dbgengPath == null && dbghelpPath == null) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
622 mesg = "dbgeng.dll and dbghelp.dll cannot be found. "; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
623 } else if (dbgengPath == null) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
624 mesg = "dbgeng.dll cannot be found (dbghelp.dll was found). "; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
625 } else { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
626 mesg = "dbghelp.dll cannot be found (dbgeng.dll was found). "; |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
627 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
628 throw new UnsatisfiedLinkError(mesg + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
629 "Please search microsoft.com for 'Debugging Tools For Windows', " + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
630 "and either download it to the default location, or download it " + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
631 "to a custom location and set environment variable " + |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
632 "'DEBUGGINGTOOLSFORWINDOWS' to the pathname of that location."); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
633 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
634 |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
635 // NOTE: The order of loads is important! If we load dbgeng.dll |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
636 // first, then the dependency - dbghelp.dll - will be loaded |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
637 // from usual DLL search thereby defeating the purpose! |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
638 if (loadLibraryDEBUG) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
639 System.err.println("DEBUG: loading '" + dbghelpPath + "'."); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
640 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
641 System.load(dbghelpPath); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
642 if (loadLibraryDEBUG) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
643 System.err.println("DEBUG: loading '" + dbgengPath + "'."); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
644 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
645 System.load(dbgengPath); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
646 |
0 | 647 // Now, load sawindbg.dll |
2072
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
648 if (loadLibraryDEBUG) { |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
649 System.err.println("DEBUG: loading '" + sawindbgPath + "'."); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
650 } |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
651 System.load(sawindbgPath); |
d6cd0d55d0b5
6987812: 2/3 SAJDI: "gHotSpotVMTypes was not initialized properly in the remote process"
dcubed
parents:
1552
diff
changeset
|
652 |
0 | 653 // where do I find '.exe', '.dll' files? |
654 imagePath = System.getProperty("sun.jvm.hotspot.debugger.windbg.imagePath"); | |
655 if (imagePath == null) { | |
656 imagePath = System.getenv("PATH"); | |
657 } | |
658 | |
659 // where do I find '.pdb', '.dbg' files? | |
660 symbolPath = System.getProperty("sun.jvm.hotspot.debugger.windbg.symbolPath"); | |
661 | |
662 // mostly, debug files would be find where .dll's, .exe's are found. | |
663 if (symbolPath == null) { | |
664 symbolPath = imagePath; | |
665 } | |
666 | |
667 // should we parse DLL symbol table in Java code or use | |
668 // Windbg's native lookup facility? By default, we use | |
669 // native lookup so that we can take advantage of '.pdb' | |
670 // files, if available. | |
671 useNativeLookup = true; | |
672 String str = System.getProperty("sun.jvm.hotspot.debugger.windbg.disableNativeLookup"); | |
673 if (str != null) { | |
674 useNativeLookup = false; | |
675 } | |
676 | |
677 initIDs(); | |
678 } | |
679 | |
680 // native methods | |
681 private static native void initIDs(); | |
682 private native void attach0(String executableName, String coreFileName); | |
683 private native void attach0(int processID); | |
684 private native void detach0(); | |
685 private native byte[] readBytesFromProcess0(long address, long numBytes) | |
686 throws UnmappedAddressException, DebuggerException; | |
687 private native long getThreadIdFromSysId0(long sysId); | |
688 private native String consoleExecuteCommand0(String cmd); | |
689 private native long lookupByName0(String objName, String symName); | |
690 private native ClosestSymbol lookupByAddress0(long address); | |
691 | |
692 // helper called lookupByAddress0 | |
693 private ClosestSymbol createClosestSymbol(String symbol, long diff) { | |
694 return new ClosestSymbol(symbol, diff); | |
695 } | |
696 } |