1 /*
2  * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
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  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 package sun.jvm.hotspot.debugger.remote;
26 
27 import java.rmi.*;
28 import java.rmi.server.*;
29 
30 import sun.jvm.hotspot.debugger.*;
31 
32 /** The implementation of the RemoteDebugger interface. This
33     delegates to a local debugger */
34 
35 public class RemoteDebuggerServer extends UnicastRemoteObject
36   implements RemoteDebugger {
37 
38   private transient Debugger debugger;
39 
40   /** This is the required no-arg constructor */
RemoteDebuggerServer()41   public RemoteDebuggerServer() throws RemoteException {
42     super();
43   }
44 
45   /** This is the constructor used on the machine where the debuggee
46       process lies */
RemoteDebuggerServer(Debugger debugger)47   public RemoteDebuggerServer(Debugger debugger) throws RemoteException {
48     super();
49     this.debugger = debugger;
50   }
51 
getOS()52   public String getOS() throws RemoteException {
53     return debugger.getOS();
54   }
55 
getCPU()56   public String getCPU() throws RemoteException {
57     return debugger.getCPU();
58   }
59 
getMachineDescription()60   public MachineDescription getMachineDescription() throws RemoteException {
61     return debugger.getMachineDescription();
62   }
63 
lookupInProcess(String objectName, String symbol)64   public long lookupInProcess(String objectName, String symbol) throws RemoteException {
65     Address addr = debugger.lookup(objectName, symbol);
66     return addr == null? 0L : debugger.getAddressValue(addr);
67   }
68 
readBytesFromProcess(long address, long numBytes)69   public ReadResult readBytesFromProcess(long address, long numBytes) throws RemoteException {
70     return debugger.readBytesFromProcess(address, numBytes);
71   }
72 
hasConsole()73   public boolean hasConsole() throws RemoteException {
74     return debugger.hasConsole();
75   }
76 
getConsolePrompt()77   public String getConsolePrompt() throws RemoteException {
78     return debugger.getConsolePrompt();
79   }
80 
consoleExecuteCommand(String cmd)81   public String consoleExecuteCommand(String cmd) throws RemoteException {
82     return debugger.consoleExecuteCommand(cmd);
83   }
84 
getJBooleanSize()85   public long getJBooleanSize() throws RemoteException {
86     return debugger.getJBooleanSize();
87   }
88 
getJByteSize()89   public long getJByteSize() throws RemoteException {
90     return debugger.getJByteSize();
91   }
92 
getJCharSize()93   public long getJCharSize() throws RemoteException {
94     return debugger.getJCharSize();
95   }
96 
getJDoubleSize()97   public long getJDoubleSize() throws RemoteException {
98     return debugger.getJDoubleSize();
99   }
100 
getJFloatSize()101   public long getJFloatSize() throws RemoteException {
102     return debugger.getJFloatSize();
103   }
104 
getJIntSize()105   public long getJIntSize() throws RemoteException {
106     return debugger.getJIntSize();
107   }
108 
getJLongSize()109   public long getJLongSize() throws RemoteException {
110     return debugger.getJLongSize();
111   }
112 
getJShortSize()113   public long getJShortSize() throws RemoteException {
114     return debugger.getJShortSize();
115   }
116 
getHeapOopSize()117   public long getHeapOopSize() throws RemoteException {
118     return debugger.getHeapOopSize();
119   }
120 
getNarrowOopBase()121   public long getNarrowOopBase() throws RemoteException {
122     return debugger.getNarrowOopBase();
123   }
124 
getNarrowOopShift()125   public int  getNarrowOopShift() throws RemoteException {
126     return debugger.getNarrowOopShift();
127   }
128 
getKlassPtrSize()129   public long getKlassPtrSize() throws RemoteException {
130     return debugger.getHeapOopSize();
131   }
132 
getNarrowKlassBase()133   public long getNarrowKlassBase() throws RemoteException {
134     return debugger.getNarrowKlassBase();
135   }
136 
getNarrowKlassShift()137   public int  getNarrowKlassShift() throws RemoteException {
138     return debugger.getNarrowKlassShift();
139   }
140 
areThreadsEqual(long addrOrId1, boolean isAddress1, long addrOrId2, boolean isAddress2)141   public boolean   areThreadsEqual(long addrOrId1, boolean isAddress1,
142                                    long addrOrId2, boolean isAddress2) throws RemoteException {
143     ThreadProxy t1 = getThreadProxy(addrOrId1, isAddress1);
144     ThreadProxy t2 = getThreadProxy(addrOrId2, isAddress2);
145     return t1.equals(t2);
146   }
147 
148 
getThreadHashCode(long addrOrId, boolean isAddress)149   public int       getThreadHashCode(long addrOrId, boolean isAddress) throws RemoteException {
150     ThreadProxy t = getThreadProxy(addrOrId, isAddress);
151     return t.hashCode();
152   }
153 
getThreadIntegerRegisterSet(long addrOrId, boolean isAddress)154   public long[]    getThreadIntegerRegisterSet(long addrOrId, boolean isAddress) throws RemoteException {
155     ThreadProxy t = getThreadProxy(addrOrId, isAddress);
156     ThreadContext tc = t.getContext();
157     long[] regs = new long[tc.getNumRegisters()];
158     for (int r = 0; r < regs.length; r++) {
159        regs[r] = tc.getRegister(r);
160     }
161     return regs;
162   }
163 
getThreadProxy(long addrOrId, boolean isAddress)164   private ThreadProxy getThreadProxy(long addrOrId, boolean isAddress) throws DebuggerException {
165      if (isAddress) {
166         Address addr = debugger.parseAddress("0x" + Long.toHexString(addrOrId));
167         return debugger.getThreadForIdentifierAddress(addr);
168      } else {
169         return debugger.getThreadForThreadId(addrOrId);
170      }
171   }
172 }
173