annotate agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java @ 0:a61af66fc99e jdk7-b24

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