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