1 /* 2 * Copyright 2002-2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 20 * CA 95054 USA or visit www.sun.com if you need additional information or 21 * have any 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 */ 41 public RemoteDebuggerServer() throws RemoteException { 42 super(); 43 } 44 45 /** This is the constructor used on the machine where the debuggee 46 process lies */ 47 public RemoteDebuggerServer(Debugger debugger) throws RemoteException { 48 super(); 49 this.debugger = debugger; 50 } 51 52 public String getOS() throws RemoteException { 53 return debugger.getOS(); 54 } 55 56 public String getCPU() throws RemoteException { 57 return debugger.getCPU(); 58 } 59 60 public MachineDescription getMachineDescription() throws RemoteException { 61 return debugger.getMachineDescription(); 62 } 63 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 69 public ReadResult readBytesFromProcess(long address, long numBytes) throws RemoteException { 70 return debugger.readBytesFromProcess(address, numBytes); 71 } 72 73 public boolean hasConsole() throws RemoteException { 74 return debugger.hasConsole(); 75 } 76 77 public String getConsolePrompt() throws RemoteException { 78 return debugger.getConsolePrompt(); 79 } 80 81 public String consoleExecuteCommand(String cmd) throws RemoteException { 82 return debugger.consoleExecuteCommand(cmd); 83 } 84 85 public long getJBooleanSize() throws RemoteException { 86 return debugger.getJBooleanSize(); 87 } 88 89 public long getJByteSize() throws RemoteException { 90 return debugger.getJByteSize(); 91 } 92 93 public long getJCharSize() throws RemoteException { 94 return debugger.getJCharSize(); 95 } 96 97 public long getJDoubleSize() throws RemoteException { 98 return debugger.getJDoubleSize(); 99 } 100 101 public long getJFloatSize() throws RemoteException { 102 return debugger.getJFloatSize(); 103 } 104 105 public long getJIntSize() throws RemoteException { 106 return debugger.getJIntSize(); 107 } 108 109 public long getJLongSize() throws RemoteException { 110 return debugger.getJLongSize(); 111 } 112 113 public long getJShortSize() throws RemoteException { 114 return debugger.getJShortSize(); 115 } 116 117 public long getHeapOopSize() throws RemoteException { 118 return debugger.getHeapOopSize(); 119 } 120 121 public long getNarrowOopBase() throws RemoteException { 122 return debugger.getNarrowOopBase(); 123 } 124 125 public int getNarrowOopShift() throws RemoteException { 126 return debugger.getNarrowOopShift(); 127 } 128 129 public boolean areThreadsEqual(long addrOrId1, boolean isAddress1, 130 long addrOrId2, boolean isAddress2) throws RemoteException { 131 ThreadProxy t1 = getThreadProxy(addrOrId1, isAddress1); 132 ThreadProxy t2 = getThreadProxy(addrOrId2, isAddress2); 133 return t1.equals(t2); 134 } 135 136 137 public int getThreadHashCode(long addrOrId, boolean isAddress) throws RemoteException { 138 ThreadProxy t = getThreadProxy(addrOrId, isAddress); 139 return t.hashCode(); 140 } 141 142 public long[] getThreadIntegerRegisterSet(long addrOrId, boolean isAddress) throws RemoteException { 143 ThreadProxy t = getThreadProxy(addrOrId, isAddress); 144 ThreadContext tc = t.getContext(); 145 long[] regs = new long[tc.getNumRegisters()]; 146 for (int r = 0; r < regs.length; r++) { 147 regs[r] = tc.getRegister(r); 148 } 149 return regs; 150 } 151 152 private ThreadProxy getThreadProxy(long addrOrId, boolean isAddress) throws DebuggerException { 153 if (isAddress) { 154 Address addr = debugger.parseAddress("0x" + Long.toHexString(addrOrId)); 155 return debugger.getThreadForIdentifierAddress(addr); 156 } else { 157 return debugger.getThreadForThreadId(addrOrId); 158 } 159 } 160 }