home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.debug;
-
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.FilterInputStream;
- import java.io.FilterOutputStream;
- import java.io.IOException;
- import java.io.PipedInputStream;
- import java.io.PipedOutputStream;
- import java.io.PrintStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.tools.java.ClassPath;
- import sun.tools.java.Identifier;
- import sun.tools.java.Package;
-
- class Agent implements Runnable, AgentConstants {
- static Agent the_Agent = null;
- ServerSocket socket;
- boolean useSockets;
- DataOutputStream asyncOutputStream;
- PipedInputStream cmdInputPipe;
- PipedOutputStream cmdOutputPipe;
- PipedOutputStream asyncOutputPipe;
- Hashtable objects;
- private BreakpointHandler bkptHandler;
- static boolean runBegun;
- static Object runBegunLock = new Object();
- private DataOutputStream out;
- private ResponseStream outBuffer;
- private ClassPath sourcePath;
- private Object pipeLock = new Object();
- static boolean verbose;
- private ThreadList lastSuspended;
-
- static String toHex(int var0) {
- char[] var1 = new char[10];
-
- for(int var2 = 0; var2 < 10; ++var2) {
- var1[var2] = '0';
- }
-
- var1[1] = 'x';
-
- for(int var3 = 9; var0 != 0; --var3) {
- int var4 = var0 & 15;
- var1[var3] = (char)(var4 < 10 ? 48 + var4 : 97 + var4 - 10);
- var0 >>>= 4;
- }
-
- return new String(var1);
- }
-
- private void dumpClasses() throws IOException {
- message("dumpClasses()");
- Enumeration var1 = this.objects.elements();
- Vector var2 = new Vector();
- int var3 = 0;
-
- while(var1.hasMoreElements()) {
- try {
- Object var4 = var1.nextElement();
- if (var4 != null && var4 instanceof Class) {
- var2.addElement(var4);
- ++var3;
- }
- } catch (Exception var5) {
- error("dumpClasses() failed: " + ((Throwable)var5).toString());
- }
- }
-
- this.out.writeInt(var3);
- var1 = var2.elements();
-
- while(var1.hasMoreElements()) {
- this.writeObject(var1.nextElement());
- }
-
- }
-
- private String cookieToString(int var1) {
- int var2 = "23456789abcdefghijkmnpqrstuvwxyz".length();
- int var3 = 0;
-
- StringBuffer var4;
- for(var4 = new StringBuffer(32); var1 > 0; ++var3) {
- if (var1 < var2) {
- var4.append("23456789abcdefghijkmnpqrstuvwxyz".charAt(var1));
- var1 = 0;
- } else {
- int var5 = var1 % var2;
- var1 /= var2;
- var4.append("23456789abcdefghijkmnpqrstuvwxyz".charAt(var5));
- }
- }
-
- if (var3 <= 0) {
- return "0";
- } else {
- int var8 = var4.length();
- char[] var6 = new char[var8];
-
- for(int var7 = 0; var8-- > 0; var6[var8] = var4.charAt(var7++)) {
- }
-
- return String.valueOf(var6);
- }
- }
-
- private String makePassword(int var1) {
- if (var1 > 65535) {
- System.err.println("Invalid port number (" + var1 + ")???");
- System.exit(1);
- }
-
- int var2 = (int)(Math.round(Math.random() * (double)2048.0F) % 2048L);
- int var3 = 0;
- int var4 = 3;
-
- for(int var5 = 0; var5 < 8; ++var5) {
- int var6 = (var1 & var4) << var5 + 1;
- int var7 = (var2 & 1 << var5) << var5 * 2;
- var3 |= var6 | var7;
- var4 <<= 2;
- }
-
- var3 |= (var2 & 1792) << 16;
- return this.cookieToString(var3);
- }
-
- Agent() {
- this.useSockets = false;
- the_Agent = this;
- }
-
- Agent(int var1) {
- this.useSockets = true;
- the_Agent = this;
- int var2 = 0;
-
- while(true) {
- try {
- this.socket = new ServerSocket(var1, 10);
- System.out.println("Agent password=" + this.makePassword(this.socket.getLocalPort()));
- return;
- } catch (Exception var4) {
- message("[Waiting to create port]\n");
-
- try {
- Thread.sleep(5000L);
- } catch (InterruptedException var3) {
- Thread.currentThread().interrupt();
- }
-
- if (var2 >= 10) {
- error("**Failed to create port\n");
- return;
- }
-
- ++var2;
- }
- }
- }
-
- static void beginRun() {
- Object var0 = runBegunLock;
- synchronized(var0){}
-
- try {
- runBegun = true;
- runBegunLock.notifyAll();
- } catch (Throwable var2) {
- throw var2;
- }
-
- }
-
- static synchronized void connectToAgent(PipedOutputStream var0, PipedInputStream var1, PipedInputStream var2) throws IOException {
- if (the_Agent != null && !the_Agent.useSockets) {
- the_Agent.cmdInputPipe = new PipedInputStream(var0);
- the_Agent.cmdOutputPipe = new PipedOutputStream(var1);
- the_Agent.asyncOutputPipe = new PipedOutputStream(var2);
- Object var3 = the_Agent.pipeLock;
- synchronized(var3){}
-
- try {
- the_Agent.pipeLock.notifyAll();
- } catch (Throwable var5) {
- throw var5;
- }
-
- } else {
- throw new IllegalAccessError();
- }
- }
-
- static boolean isDebuggable() {
- return the_Agent != null && !the_Agent.useSockets;
- }
-
- public void run() {
- Object var1 = null;
- Object var2 = null;
- Socket var3 = null;
- Socket var4 = null;
- String var5 = System.getProperty("java.class.path");
- if (var5 == null) {
- var5 = ".";
- }
-
- this.sourcePath = new ClassPath(var5);
-
- try {
- this.objects = new Hashtable();
- this.bkptHandler = new BreakpointHandler(this);
- this.bkptHandler.setPriority(9);
- this.bkptHandler.start();
- this.initAgent();
- Class var6 = this.getClass();
- synchronized(var6){}
-
- try {
- var6.notifyAll();
- } catch (Throwable var36) {
- throw var36;
- }
-
- initSystemThreadList();
-
- while(true) {
- DataInputStream var7;
- while(true) {
- var41 = System.out;
- var42 = System.err;
- if (this.useSockets) {
- var3 = this.socket.accept();
- message("cmd socket: " + var3.toString());
- var7 = new DataInputStream(new BufferedInputStream(var3.getInputStream()));
- this.outBuffer = new ResponseStream(var3.getOutputStream(), 8192);
- this.out = new DataOutputStream(this.outBuffer);
- var4 = this.socket.accept();
- this.asyncOutputStream = new DataOutputStream(new BufferedOutputStream(var4.getOutputStream()));
- AgentOutputStream var46 = new AgentOutputStream(this.asyncOutputStream);
- BufferedOutputStream var48 = new BufferedOutputStream(var46, 128);
- PrintStream var10 = new PrintStream(var48, true);
- System.setOut(var10);
- System.setErr(var10);
- break;
- }
-
- try {
- Object var8 = the_Agent.pipeLock;
- synchronized(var8){}
-
- try {
- the_Agent.pipeLock.wait();
- } catch (Throwable var35) {
- throw var35;
- }
- } catch (InterruptedException var37) {
- continue;
- }
-
- var7 = new DataInputStream(this.cmdInputPipe);
- this.outBuffer = new ResponseStream(this.cmdOutputPipe, 8192);
- this.out = new DataOutputStream(this.outBuffer);
- this.asyncOutputStream = new DataOutputStream(this.asyncOutputPipe);
- AgentOutputStream var45 = new AgentOutputStream(this.asyncOutputPipe);
- PrintStream var9 = new PrintStream(var45, true);
- System.setOut(var9);
- System.setErr(var9);
- break;
- }
-
- message("connection accepted");
- this.out.writeInt(3);
-
- try {
- this.writeObject(Class.forName("java.lang.Object"));
- this.writeObject(Class.forName("java.lang.Class"));
- this.writeObject(Class.forName("java.lang.String"));
- } catch (ClassNotFoundException var34) {
- System.exit(1);
- }
-
- this.dumpClasses();
- this.writeObject(Thread.currentThread().getThreadGroup());
- this.out.flush();
-
- try {
- for(int var47 = ((FilterInputStream)var7).read(); var47 != -1; var47 = ((FilterInputStream)var7).read()) {
- try {
- this.handle(var47, var7, this.out);
- } catch (Throwable var33) {
- error(this.exceptionStackTrace(var33));
- this.outBuffer.reset();
- this.out.writeInt(-2);
- this.out.writeUTF(var33.toString());
- }
-
- this.out.flush();
- }
- } catch (Exception var38) {
- System.setOut(var41);
- System.setErr(var42);
- error(this.exceptionStackTrace(var38));
- }
-
- System.setOut(var41);
- System.setErr(var42);
- message("connection closed");
- }
- } catch (ThreadDeath var39) {
- System.setOut((PrintStream)var1);
- System.setErr((PrintStream)var2);
- message("ThreadDeath caught.");
- } catch (IOException var40) {
- System.setOut((PrintStream)var1);
- System.setErr((PrintStream)var2);
- message("IOException caught.");
- }
-
- if (var4 != null) {
- try {
- var4.close();
- } catch (Exception var32) {
- }
- }
-
- if (var3 != null) {
- try {
- var3.close();
- } catch (Exception var31) {
- }
- }
- }
-
- public static synchronized native boolean systemThread(Thread var0);
-
- private static void initSystemThread(String var0) {
- ThreadGroup var1 = Thread.currentThread().getThreadGroup();
- if (!var1.getName().equals("system")) {
- error("findThread called from wrong threadgroup");
- } else {
- Thread[] var2 = new Thread[40];
- int var3 = var1.enumerate(var2, false);
-
- for(int var4 = 0; var4 < var3; ++var4) {
- if (var2[var4].getName().equals(var0)) {
- message("adding " + var0 + " to system thread list");
- addSystemThread(var2[var4]);
- return;
- }
- }
-
- message(var0 + " not found in system threadgroup");
- }
- }
-
- private static void initSystemThreadList() {
- initSystemThread("Idle thread");
- initSystemThread("Clock");
- initSystemThread("Debugger agent");
- initSystemThread("Breakpoint handler");
- }
-
- public static synchronized native void addSystemThread(Thread var0);
-
- public static synchronized native void removeSystemThread(Thread var0);
-
- private void suspendThread(Thread var1) {
- if (!systemThread(var1)) {
- message("suspending " + var1.getName());
-
- try {
- var1.suspend();
- } catch (IllegalThreadStateException var3) {
- error("suspend failed: " + ((Throwable)var3).getMessage());
- }
- }
- }
-
- private void stepThread(Thread var1, boolean var2) {
- if (!systemThread(var1)) {
- message("stepping " + var1.getName());
-
- try {
- if (var2) {
- StackFrame var3 = this.getStackFrame(var1, 0);
- LineNumber var4 = this.lineno2pc(var3.clazz, var3.lineno);
- if (var4 != null) {
- var4.thread = var1;
- this.bkptHandler.addSkipLine(var4);
- }
- }
-
- this.setSingleStep(var1, true);
- this.resumeLastSuspendedThreads();
- } catch (IllegalThreadStateException var5) {
- error("step failed: " + ((Throwable)var5).getMessage());
- }
- }
- }
-
- private void stepNextThread(Thread var1) {
- if (!systemThread(var1)) {
- message("next stepping " + var1.getName());
-
- try {
- int var2 = 0;
-
- StackFrame var3;
- LineNumber var4;
- try {
- do {
- var3 = this.getStackFrame(var1, var2);
- var4 = this.lineno2pc(var3.clazz, var3.lineno);
- ++var2;
- } while(var4 == null);
- } catch (NullPointerException var18) {
- message("no line information available, single-stepping.");
- this.stepThread(var1, false);
- return;
- }
-
- FlowTracer var5 = new FlowTracer(var3.pcAbsolute, this, var3.clazz, var3.lineno);
- int[] var6 = var5.exitPoints();
- if (verbose) {
- message("------------------");
- message("Exit points for class: " + var3.clazz + ", line: " + var3.lineno + ", pc: " + var3.pcAbsolute);
-
- for(int var7 = 0; var7 < var6.length; ++var7) {
- int var8 = var6[var7];
- message(" " + this.pc2lineno(var3.clazz, var8) + ": " + var8);
- }
- }
-
- int[] var20 = var5.returnPoints();
- if (var20.length > 0) {
- StackFrame var21 = this.getStackFrame(var1, var2);
- FlowTracer var9 = new FlowTracer(var21.pcAbsolute, this);
- int[] var10 = var9.exitPoints();
- int[] var11 = new int[var6.length + var10.length];
- int var12 = 0;
-
- for(int var13 = 0; var13 < var6.length; ++var13) {
- var11[var12++] = var6[var13];
- }
-
- for(int var14 = 0; var14 < var10.length; ++var14) {
- var11[var12++] = var10[var14];
- }
-
- var6 = var11;
- if (verbose) {
- message("Caller in class: " + var21.clazz);
- message(" " + this.pc2lineno(var21.clazz, var21.pcAbsolute) + ": " + var21.pcAbsolute);
- message("Return point:");
-
- for(int var15 = 0; var15 < var10.length; ++var15) {
- int var16 = var10[var15];
- message(" " + this.pc2lineno(var21.clazz, var16) + ": " + var16);
- }
- }
- }
-
- try {
- this.bkptHandler.addScattershotBreakpoints(var3.clazz, var6, var1);
- } catch (Exception var17) {
- message("next-step failed: " + ((Throwable)var17).toString() + ", single-stepping.");
- this.stepThread(var1, false);
- return;
- }
-
- this.resumeLastSuspendedThreads();
- } catch (IllegalThreadStateException var19) {
- error("next step failed: " + ((Throwable)var19).getMessage());
- }
- }
- }
-
- void suspendAllThreads() {
- message("suspendAllThreads()");
- ThreadList var1 = new ThreadList();
-
- for(int var2 = 0; var2 < var1.count; ++var2) {
- this.suspendThread(var1.threads[var2]);
- }
-
- this.lastSuspended = var1;
- }
-
- void resumeLastSuspendedThreads() {
- ThreadList var1 = this.lastSuspended;
- this.lastSuspended = null;
- if (var1 == null) {
- message("no last suspended to resume");
- } else {
- message("resumeLastSuspendedThreads()");
-
- for(int var2 = 0; var2 < var1.count; ++var2) {
- this.resumeThread(var1.threads[var2]);
- }
-
- }
- }
-
- private void resumeThread(Thread var1) {
- if (!systemThread(var1)) {
- message("resuming " + var1.getName());
-
- try {
- var1.resume();
- } catch (IllegalThreadStateException var3) {
- error("resume failed: " + ((Throwable)var3).getMessage());
- }
- }
- }
-
- int peekSafely(int var1) {
- int var2 = this.peek(var1);
- if (var2 == 202) {
- var2 = BreakpointHandler.getOpcode(var1);
- }
-
- return var2;
- }
-
- private native int peek(int var1);
-
- native int getThreadStatus(Thread var1);
-
- native StackFrame getStackFrame(Thread var1, int var2);
-
- native Field[] getMethods(Class var1);
-
- native Field[] getFields(Class var1);
-
- native Class[] getClasses();
-
- native Object getSlotObject(Object var1, int var2);
-
- native int[] getSlotSignature(Class var1, int var2);
-
- native boolean getSlotBoolean(Object var1, int var2);
-
- native int getSlotInt(Object var1, int var2);
-
- native long getSlotLong(Object var1, int var2);
-
- native double getSlotDouble(Object var1, int var2);
-
- native Object[] getSlotArray(Object var1, int var2);
-
- native Object getStackObject(Thread var1, int var2, int var3);
-
- native boolean getStackBoolean(Thread var1, int var2, int var3);
-
- native int getStackInt(Thread var1, int var2, int var3);
-
- native long getStackLong(Thread var1, int var2, int var3);
-
- native float getStackFloat(Thread var1, int var2, int var3);
-
- native double getStackDouble(Thread var1, int var2, int var3);
-
- native Object[] getStackArray(Thread var1, int var2, int var3);
-
- native LineNumber lineno2pc(Class var1, int var2);
-
- native int pc2lineno(Class var1, int var2);
-
- native int method2pc(Class var1, int var2);
-
- native String exceptionStackTrace(Throwable var1);
-
- native void setSingleStep(Thread var1, boolean var2);
-
- native void initAgent();
-
- native String getClassSourceName(Class var1);
-
- native int[] getLinenumbers(Class var1);
-
- native int getMethodLinenumber(Class var1, int var2);
-
- native void setSlotBoolean(Object var1, int var2, boolean var3);
-
- native void setSlotInt(Object var1, int var2, int var3);
-
- native void setSlotLong(Object var1, int var2, long var3);
-
- native void setSlotDouble(Object var1, int var2, double var3);
-
- native void setStackBoolean(Thread var1, int var2, int var3, boolean var4);
-
- native void setStackInt(Thread var1, int var2, int var3, int var4);
-
- native void setStackLong(Thread var1, int var2, int var3, long var4);
-
- native void setStackDouble(Thread var1, int var2, int var3, double var4);
-
- synchronized void handle(int var1, DataInputStream var2, DataOutputStream var3) throws IOException {
- var3.writeInt(var1);
- switch (var1) {
- case 20:
- Class var63 = (Class)this.objects.get(new Integer(var2.readInt()));
- var3.writeUTF(var63.getName());
- var3.writeUTF(this.getClassSourceName(var63));
- var3.writeInt(var63.isInterface() ? 1 : 0);
- this.writeObject(var63.getSuperclass());
- this.writeObject(var63.getClassLoader());
- Class[] var89 = var63.getInterfaces();
- var3.writeInt(var89.length);
-
- for(int var110 = 0; var110 < var89.length; ++var110) {
- this.writeObject(var89[var110]);
- }
-
- return;
- case 21:
- var3.writeUTF(((Thread)this.objects.get(new Integer(var2.readInt()))).getName());
- return;
- case 22:
- String var62 = var2.readUTF();
-
- try {
- this.writeObject(Class.forName(var62));
- return;
- } catch (ClassNotFoundException var26) {
- message("no such class: " + var62);
- this.writeObject((Object)null);
- return;
- } catch (NoClassDefFoundError var27) {
- message("no such class: " + var62);
- this.writeObject((Object)null);
- return;
- }
- case 23:
- int var61 = var2.readInt();
- Hashtable var88 = new Hashtable();
-
- for(int var109 = 0; var109 < var61; ++var109) {
- Object var126 = this.objects.get(new Integer(var2.readInt()));
- if (var126 != null) {
- var88.put(new Integer(this.objectId(var126)), var126);
- }
- }
-
- var3.flush();
- var1 = ((FilterInputStream)var2).read();
- var3.writeInt(var1);
- switch (var1) {
- case 24:
- try {
- Hashtable var127 = new Hashtable();
- Enumeration var146 = this.objects.elements();
-
- while(var146.hasMoreElements()) {
- Object var161 = var146.nextElement();
- var127.put(new Integer(this.objectId(var161)), var161);
- }
-
- var146 = this.objects.elements();
-
- while(var146.hasMoreElements()) {
- Object var162 = var146.nextElement();
- if (!(var162 instanceof Class)) {
- Integer var165 = new Integer(this.objectId(var162));
- if (var88.get(var165) == null) {
- message("gc: freeing " + var162);
- var127.remove(var165);
- }
- }
- }
-
- this.objects = var127;
- System.gc();
- var146 = this.objects.elements();
-
- while(var146.hasMoreElements()) {
- Object var163 = var146.nextElement();
- if (var163 != null) {
- this.writeObject(var163);
- }
- }
-
- this.writeObject((Object)null);
- } catch (Exception var30) {
- error("CMD_MARK_OBJECTS failed: " + ((Throwable)var30).toString());
- }
- break;
- default:
- error("mark objects command failed");
- }
-
- var3.flush();
- return;
- case 25:
- Thread[] var60 = new Thread[40];
- ThreadGroup var87 = (ThreadGroup)this.objects.get(new Integer(var2.readInt()));
- boolean var108 = var2.readBoolean();
- message("Getting threads for " + var87.getName());
- int var125 = var87.enumerate(var60, var108);
- var3.writeInt(var125);
-
- for(int var145 = 0; var145 < var125; ++var145) {
- this.writeObject(var60[var145]);
- }
-
- return;
- case 26:
- String[] var59 = new String[((FilterInputStream)var2).read() - 1];
- String var86 = var2.readUTF();
- new String("");
-
- for(int var107 = 0; var107 < var59.length; ++var107) {
- var59[var107] = var2.readUTF();
- }
-
- try {
- Class var124 = Class.forName(var86);
- ThreadGroup var144 = new ThreadGroup(var124.getName() + ".main");
- MainThread var160 = new MainThread(this, var144, var124, var59);
- this.writeObject(((Thread)var160).getThreadGroup());
- beginRun();
- return;
- } catch (Exception var25) {
- message(this.exceptionStackTrace(var25));
- this.writeObject((Object)null);
- return;
- }
- case 27:
- this.suspendThread((Thread)this.objects.get(new Integer(var2.readInt())));
- return;
- case 28:
- this.resumeThread((Thread)this.objects.get(new Integer(var2.readInt())));
- return;
- case 29:
- this.resumeLastSuspendedThreads();
- return;
- case 31:
- var3.writeInt(this.getThreadStatus((Thread)this.objects.get(new Integer(var2.readInt()))));
- return;
- case 32:
- Thread var58 = (Thread)this.objects.get(new Integer(var2.readInt()));
- int var85 = var58.countStackFrames();
- var3.writeInt(var85);
-
- for(int var106 = 0; var106 < var85; ++var106) {
- StackFrame var123 = this.getStackFrame(var58, var106);
- this.writeObject(var123);
- var3.writeUTF(var123.className);
- var3.writeUTF(var123.methodName);
- var3.writeInt(var123.lineno);
- var3.writeInt(var123.pc);
- this.writeObject(var123.clazz);
- var3.writeInt(var123.localVariables.length);
-
- for(int var143 = 0; var143 < var123.localVariables.length; ++var143) {
- message("lvar " + var143 + ": slot=" + var123.localVariables[var143].slot + ", name=" + var123.localVariables[var143].name + ", sig=" + var123.localVariables[var143].signature + ", argument=" + var123.localVariables[var143].methodArgument);
- var3.writeInt(var123.localVariables[var143].slot);
- var3.writeUTF(var123.localVariables[var143].name);
- var3.writeUTF(var123.localVariables[var143].signature);
- var3.writeBoolean(var123.localVariables[var143].methodArgument);
- }
- }
-
- return;
- case 34:
- switch (var2.readInt()) {
- case 1:
- var3.writeInt((int)Runtime.getRuntime().totalMemory());
- return;
- case 2:
- var3.writeInt((int)Runtime.getRuntime().freeMemory());
- return;
- case 3:
- Runtime.getRuntime().traceMethodCalls(var2.readInt() != 0);
- return;
- case 4:
- Runtime.getRuntime().traceInstructions(var2.readInt() != 0);
- return;
- default:
- return;
- }
- case 35:
- Class var57 = (Class)this.objects.get(new Integer(var2.readInt()));
- Field[] var84 = this.getFields(var57);
- var3.writeInt(var84.length);
-
- for(int var105 = 0; var105 < var84.length; ++var105) {
- var3.writeInt(var84[var105].slot);
- var3.writeUTF(var84[var105].name);
- var3.writeUTF(var84[var105].signature);
- var3.writeShort(var84[var105].access);
- this.writeObject(var84[var105].clazz);
- }
-
- return;
- case 36:
- Class var56 = (Class)this.objects.get(new Integer(var2.readInt()));
- Field[] var83 = this.getMethods(var56);
- var3.writeInt(var83.length);
-
- for(int var104 = 0; var104 < var83.length; ++var104) {
- var3.writeInt(var83[var104].slot);
- var3.writeUTF(var83[var104].name);
- var3.writeUTF(var83[var104].signature);
- var3.writeShort(var83[var104].access);
- this.writeObject(var83[var104].clazz);
- }
-
- return;
- case 38:
- Class var55 = (Class)this.objects.get(new Integer(var2.readInt()));
- int var82 = var2.readInt();
- int[] var103 = this.getSlotSignature(var55, var82);
- if (var103 == null) {
- var3.writeInt(0);
- return;
- }
-
- var3.writeInt(var103.length);
-
- for(int var122 = 0; var122 < var103.length; ++var122) {
- var3.writeInt(var103[var122]);
- }
-
- return;
- case 39:
- Object var53 = this.objects.get(new Integer(var2.readInt()));
- int var80 = var2.readInt();
- int[] var101 = this.getSlotSignature(var53 instanceof Class ? (Class)var53 : var53.getClass(), var80);
- if (var101 == null) {
- this.writeObject(new ArrayIndexOutOfBoundsException("invalid slot index " + var80));
- return;
- } else {
- String var141;
- int var159;
- switch (var101[0]) {
- case 0:
- this.write(this.getSlotBoolean(var53, var80));
- return;
- case 1:
- this.write((byte)this.getSlotInt(var53, var80));
- return;
- case 2:
- this.write((char)this.getSlotInt(var53, var80));
- return;
- case 3:
- this.write((short)this.getSlotInt(var53, var80));
- return;
- case 4:
- this.write(this.getSlotInt(var53, var80));
- return;
- case 5:
- this.write(this.getSlotLong(var53, var80));
- return;
- case 6:
- this.write((float)this.getSlotDouble(var53, var80));
- return;
- case 7:
- this.write(this.getSlotDouble(var53, var80));
- return;
- case 9:
- Object[] var121 = this.getSlotArray(var53, var80);
- this.writeArray(var121);
- return;
- case 11:
- this.writeObject((Object)null);
- return;
- case 16:
- case 17:
- Object var120 = this.getSlotObject(var53, var80);
- this.writeObject(var120);
- return;
- default:
- var141 = new String("bogus signature(");
- var159 = 0;
- }
-
- while(var159 < var101.length) {
- var141 = var141.concat(" " + (new Integer(var101[var159])).toString());
- ++var159;
- }
-
- var141 = var141.concat(" )");
- error(var141);
- this.writeObject(var141);
- }
- case 68:
- Object var54 = this.objects.get(new Integer(var2.readInt()));
- int var81 = var2.readInt();
- int var102 = var2.readInt();
- switch (var102) {
- case 0:
- this.setSlotBoolean(var54, var81, var2.readBoolean());
- return;
- case 4:
- this.setSlotInt(var54, var81, var2.readInt());
- return;
- case 5:
- this.setSlotLong(var54, var81, var2.readLong());
- return;
- case 7:
- this.setSlotDouble(var54, var81, var2.readDouble());
- return;
- default:
- error("bogus type(" + var102 + ")");
- return;
- }
- case 40:
- Object var52 = this.objects.get(new Integer(var2.readInt()));
- int var79 = var2.readInt();
- int var100 = var2.readInt();
- int var119 = var2.readInt();
- var3.writeInt(var119 - var100 + 1);
- switch (var79) {
- case 0:
- boolean[] var139 = (boolean[])var52;
-
- for(int var158 = var100; var158 <= var119; ++var158) {
- this.write(var139[var158]);
- }
-
- return;
- case 1:
- byte[] var138 = (byte[])var52;
-
- for(int var157 = var100; var157 <= var119; ++var157) {
- this.write(var138[var157]);
- }
-
- return;
- case 2:
- char[] var137 = (char[])var52;
-
- for(int var156 = var100; var156 <= var119; ++var156) {
- this.write(var137[var156]);
- }
-
- return;
- case 3:
- short[] var136 = (short[])var52;
-
- for(int var155 = var100; var155 <= var119; ++var155) {
- this.write(var136[var155]);
- }
-
- return;
- case 4:
- int[] var135 = (int[])var52;
-
- for(int var154 = var100; var154 <= var119; ++var154) {
- this.write(var135[var154]);
- }
-
- return;
- case 5:
- long[] var134 = (long[])var52;
-
- for(int var153 = var100; var153 <= var119; ++var153) {
- this.write(var134[var153]);
- }
-
- return;
- case 6:
- float[] var133 = (float[])var52;
-
- for(int var152 = var100; var152 <= var119; ++var152) {
- this.write(var133[var152]);
- }
-
- return;
- case 7:
- double[] var132 = (double[])var52;
-
- for(int var151 = var100; var151 <= var119; ++var151) {
- this.write(var132[var151]);
- }
-
- return;
- case 10:
- case 17:
- Object[] var131 = var52;
-
- for(int var150 = var100; var150 <= var119; ++var150) {
- this.writeObject(var131[var150]);
- }
-
- return;
- case 11:
- default:
- for(int var140 = var100; var140 <= var119; ++var140) {
- this.writeObject((Object)null);
- }
-
- return;
- }
- case 41:
- Class var51 = (Class)this.objects.get(new Integer(var2.readInt()));
- int var78 = var2.readInt();
- LineNumber var99 = this.lineno2pc(var51, var78);
- String var118 = "";
- if (var99 == null) {
- var118 = "No code at line " + var78 + ", or class is optimized.";
- } else {
- try {
- this.bkptHandler.addBreakpoint(var51, var99.startPC, 1, (byte[])null);
- } catch (Exception var24) {
- message(this.exceptionStackTrace(var24));
- var118 = ((Throwable)var24).toString();
- }
- }
-
- var3.writeUTF(var118);
- return;
- case 42:
- Class var50 = (Class)this.objects.get(new Integer(var2.readInt()));
- int var77 = var2.readInt();
- int var98 = this.method2pc(var50, var77);
- message("method2pc(" + var50.getName() + "," + var77 + ") = " + var98);
- String var117 = "";
- if (var98 == -1) {
- var117 = "Not a Java method";
- } else {
- try {
- this.bkptHandler.addBreakpoint(var50, var98, 1, (byte[])null);
- } catch (Exception var23) {
- message(this.exceptionStackTrace(var23));
- var117 = ((Throwable)var23).toString();
- }
- }
-
- var3.writeUTF(var117);
- return;
- case 43:
- Class var49 = (Class)this.objects.get(new Integer(var2.readInt()));
- int var76 = var2.readInt();
- message("clearing bkpt at " + var49.getName() + ":" + var76);
- String var97 = "";
- if (var76 == -1) {
- var97 = "No code at pc " + var76;
- } else {
- try {
- this.bkptHandler.deleteBreakpoint(var49, var76);
- } catch (Exception var22) {
- message(this.exceptionStackTrace(var22));
- var97 = ((Throwable)var22).toString();
- }
- }
-
- var3.writeUTF(var97);
- return;
- case 44:
- Class var48 = (Class)this.objects.get(new Integer(var2.readInt()));
- int var75 = var2.readInt();
- message("clearing bkpt at " + var48.getName() + ":" + var75);
- LineNumber var96 = this.lineno2pc(var48, var75);
- String var116 = "";
- if (var96 == null) {
- var116 = "No code at line " + var75 + ", or class is optimized.";
- } else {
- try {
- this.bkptHandler.deleteBreakpoint(var48, var96.startPC);
- } catch (Exception var21) {
- message(this.exceptionStackTrace(var21));
- var116 = ((Throwable)var21).toString();
- }
- }
-
- var3.writeUTF(var116);
- return;
- case 45:
- Class var47 = (Class)this.objects.get(new Integer(var2.readInt()));
- int var74 = var2.readInt();
- message("clearing bkpt at " + var47.getName());
- int var95 = this.method2pc(var47, var74);
- String var115 = "";
- if (var95 == -1) {
- var115 = "Not a Java method";
- } else {
- try {
- this.bkptHandler.deleteBreakpoint(var47, var95);
- } catch (Exception var20) {
- message(this.exceptionStackTrace(var20));
- var115 = ((Throwable)var20).toString();
- }
- }
-
- var3.writeUTF(var115);
- return;
- case 47:
- ThreadGroup[] var46 = new ThreadGroup[20];
- ThreadGroup var72 = (ThreadGroup)this.objects.get(new Integer(var2.readInt()));
- int var93 = 0;
- if (var72 == null) {
- message("Getting all threadgroups");
- var72 = Thread.currentThread().getThreadGroup();
- var93 = var72.enumerate(var46);
- var3.writeInt(var93 + 1);
- this.writeObject(var72);
- } else {
- message("Getting threadgroups for " + var72.getName());
- var93 = var72.enumerate(var46);
- var3.writeInt(var93);
- }
-
- for(int var114 = 0; var114 < var93; ++var114) {
- this.writeObject(var46[var114]);
- }
-
- return;
- case 48:
- ThreadGroup var45 = (ThreadGroup)this.objects.get(new Integer(var2.readInt()));
- this.writeObject(var45.getParent());
- var3.writeUTF(var45.getName());
- var3.writeInt(var45.getMaxPriority());
- var3.writeBoolean(var45.isDaemon());
- return;
- case 49:
- Class[] var44 = this.getClasses();
- var3.writeInt(var44.length);
-
- for(int var71 = 0; var71 < var44.length; ++var71) {
- this.writeObject(var44[var71]);
- }
-
- return;
- case 50:
- Thread var43 = (Thread)this.objects.get(new Integer(var2.readInt()));
- int var70 = var2.readInt();
- int var92 = var2.readInt();
- char var113 = var2.readChar();
- switch (var113) {
- case 'B':
- this.write((byte)this.getStackInt(var43, var70, var92));
- return;
- case 'C':
- this.write((char)this.getStackInt(var43, var70, var92));
- return;
- case 'D':
- this.write(this.getStackDouble(var43, var70, var92));
- return;
- case 'F':
- this.write(this.getStackFloat(var43, var70, var92));
- return;
- case 'I':
- this.write(this.getStackInt(var43, var70, var92));
- return;
- case 'J':
- this.write(this.getStackLong(var43, var70, var92));
- return;
- case 'L':
- this.writeObject(this.getStackObject(var43, var70, var92));
- return;
- case 'S':
- this.write((short)this.getStackInt(var43, var70, var92));
- return;
- case 'V':
- this.writeObject((Object)null);
- return;
- case 'Z':
- this.write(this.getStackBoolean(var43, var70, var92));
- return;
- case '[':
- Object[] var129 = this.getStackArray(var43, var70, var92);
- this.writeArray(var129);
- return;
- default:
- String var130 = new String("bogus signature(" + var113 + ")");
- error(var130);
- this.writeObject(var130);
- return;
- }
- case 51:
- verbose = var2.readBoolean();
- return;
- case 53:
- try {
- Class var42 = (Class)this.objects.get(new Integer(var2.readInt()));
- this.bkptHandler.catchExceptionClass(var42);
- return;
- } catch (Exception var19) {
- error("catchExceptionClass failed: " + var19);
- return;
- }
- case 54:
- try {
- Class var41 = (Class)this.objects.get(new Integer(var2.readInt()));
- this.bkptHandler.ignoreExceptionClass(var41);
- return;
- } catch (Exception var18) {
- error("ignoreExceptionClass failed: " + var18);
- return;
- }
- case 55:
- Class[] var40 = this.bkptHandler.getCatchList();
- var3.writeInt(var40.length);
-
- for(int var69 = 0; var69 < var40.length; ++var69) {
- this.writeObject(var40[var69]);
- }
-
- return;
- case 56:
- Thread var39 = (Thread)this.objects.get(new Integer(var2.readInt()));
- var39.stop();
- message(var39.getName() + " stopped.");
- return;
- case 57:
- ThreadGroup var38 = (ThreadGroup)this.objects.get(new Integer(var2.readInt()));
- var38.stop();
- message(var38.getName() + " stopped.");
- return;
- case 58:
- System.exit(0);
- case 24:
- case 30:
- case 33:
- case 37:
- case 46:
- case 52:
- case 66:
- case 67:
- default:
- error("command not understood: " + var1);
- return;
- case 59:
- String var37 = var2.readUTF();
- String var68 = var2.readUTF();
- int var91 = var68.lastIndexOf(46);
- String var112 = var91 >= 0 ? var68.substring(0, var91) : "";
- Object var8 = null;
-
- try {
- var128 = new Package(this.sourcePath, Identifier.lookup(var112));
- } catch (Exception var17) {
- message("cannot create a Package for " + var112);
- var3.writeInt(-1);
- return;
- }
-
- Object var9 = null;
- Object var10 = null;
-
- try {
- var149 = var128.getSourceFile(var37);
- if (var149 == null) {
- message("no source " + var37);
- var3.writeInt(-1);
- return;
- }
-
- var164 = var149.getInputStream();
- } catch (Exception var29) {
- message("cannot find " + var37);
- var3.writeInt(-1);
- return;
- }
-
- int var11 = (int)var149.length();
- var3.writeInt(var11);
- byte[] var12 = new byte[var11];
-
- try {
- int var13 = 0;
-
- int var15;
- for(int var14 = var12.length; var14 > 0; var14 -= var15) {
- var15 = var164.read(var12, var13, var14);
- if (var15 == -1) {
- throw new IOException();
- }
-
- var13 += var15;
- }
-
- ((FilterOutputStream)var3).write(var12);
- } catch (IOException var28) {
- error("unable to read " + var37);
- return;
- }
-
- var164.close();
- return;
- case 60:
- Object var36 = this.objects.get(new Integer(var2.readInt()));
- String var67 = "";
-
- try {
- var67 = var36.toString();
- } catch (Exception var16) {
- }
-
- var3.writeUTF(var67);
- return;
- case 61:
- var3.writeUTF(this.sourcePath.toString());
- return;
- case 62:
- String var35 = var2.readUTF();
- if (var35 == null) {
- var35 = ".";
- }
-
- this.sourcePath = new ClassPath(var35);
- return;
- case 63:
- this.stepThread((Thread)this.objects.get(new Integer(var2.readInt())), var2.readBoolean());
- return;
- case 64:
- this.stepNextThread((Thread)this.objects.get(new Integer(var2.readInt())));
- return;
- case 65:
- BreakpointSet[] var34 = this.bkptHandler.listBreakpoints();
- var3.writeInt(var34.length);
-
- for(int var66 = 0; var66 < var34.length; ++var66) {
- var3.writeUTF(var34[var66].clazz.getName() + ":" + this.pc2lineno(var34[var66].clazz, var34[var66].pc));
- }
-
- return;
- case 69:
- Thread var33 = (Thread)this.objects.get(new Integer(var2.readInt()));
- int var65 = var2.readInt();
- int var90 = var2.readInt();
- int var111 = var2.readInt();
- switch (var111) {
- case 0:
- this.setStackBoolean(var33, var65, var90, var2.readBoolean());
- return;
- case 4:
- this.setStackInt(var33, var65, var90, var2.readInt());
- return;
- case 5:
- this.setStackLong(var33, var65, var90, var2.readLong());
- return;
- case 7:
- this.setStackDouble(var33, var65, var90, var2.readDouble());
- return;
- default:
- error("bogus type(" + var111 + ")");
- return;
- }
- case 70:
- this.objects.remove(new Integer(var2.readInt()));
- return;
- case 71:
- Class var32 = (Class)this.objects.get(new Integer(var2.readInt()));
- int[] var64 = this.getLinenumbers(var32);
- int var6 = var64.length;
- var3.writeInt(var6);
-
- for(int var7 = 0; var7 < var6; ++var7) {
- var3.writeInt(var64[var7]);
- }
-
- return;
- case 72:
- Class var4 = (Class)this.objects.get(new Integer(var2.readInt()));
- int var5 = var2.readInt();
- var3.writeInt(this.getMethodLinenumber(var4, var5));
- }
- }
-
- native int objectId(Object var1);
-
- native void runMain(Class var1, String[] var2);
-
- void writeObject(Object var1, DataOutputStream var2) throws IOException {
- int var3 = 0;
- if (var1 == null) {
- var2.writeInt(17);
- } else if (var1 instanceof Class) {
- var2.writeInt(16);
- this.objects.put(new Integer(var3 = this.objectId(var1)), var1);
- } else if (var1 instanceof String) {
- var2.writeInt(18);
- this.objects.put(new Integer(var3 = this.objectId(var1)), var1);
- } else {
- if (var1 instanceof Thread) {
- var2.writeInt(19);
- } else if (var1 instanceof ThreadGroup) {
- var2.writeInt(15);
- } else {
- var2.writeInt(17);
- }
-
- Class var4 = var1.getClass();
- int var5;
- this.objects.put(new Integer(var5 = this.objectId(var4)), var4);
- var2.writeInt(var5);
- this.objects.put(new Integer(var3 = this.objectId(var1)), var1);
- }
-
- var2.writeInt(var3);
- }
-
- void writeObject(Object var1) throws IOException {
- this.writeObject(var1, this.out);
- }
-
- void writeArray(Object[] var1) throws IOException {
- int var2 = 0;
- this.out.writeInt(9);
- if (var1 == null) {
- this.out.writeInt(0);
- } else {
- Class var3 = var1.getClass();
- this.objects.put(new Integer(var2 = this.objectId(var3)), var3);
- this.out.writeInt(var2);
- this.objects.put(new Integer(var2 = this.objectId(var1)), var1);
- this.out.writeInt(var2);
- this.out.writeInt(var1.length);
- }
- }
-
- void write(boolean var1) throws IOException {
- this.out.writeInt(0);
- this.out.writeBoolean(var1);
- }
-
- void write(byte var1) throws IOException {
- this.out.writeInt(1);
- this.out.writeByte(var1);
- }
-
- void write(char var1) throws IOException {
- this.out.writeInt(2);
- this.out.writeChar(var1);
- }
-
- void write(short var1) throws IOException {
- this.out.writeInt(3);
- this.out.writeShort(var1);
- }
-
- void write(int var1) throws IOException {
- this.out.writeInt(4);
- this.out.writeInt(var1);
- }
-
- void write(long var1) throws IOException {
- this.out.writeInt(5);
- this.out.writeLong(var1);
- }
-
- void write(float var1) throws IOException {
- this.out.writeInt(6);
- this.out.writeFloat(var1);
- }
-
- void write(double var1) throws IOException {
- this.out.writeInt(7);
- this.out.writeDouble(var1);
- }
-
- void reportAppExit() throws IOException {
- message("report application exit");
- DataOutputStream var1 = this.asyncOutputStream;
- synchronized(var1){}
-
- try {
- this.asyncOutputStream.write(67);
- this.asyncOutputStream.flush();
- } catch (Throwable var3) {
- throw var3;
- }
-
- }
-
- static void error(String var0) {
- System.out.println("[Internal debug-agent error: " + var0 + "]");
- }
-
- static void message(String var0) {
- if (verbose) {
- System.out.println("[debug agent: " + var0 + "]");
- }
-
- }
-
- public static void boot(int var0) {
- Agent var1 = new Agent(var0);
- Thread var2 = new Thread(var1);
- var2.setDaemon(true);
- var2.setName("Debugger agent");
- var2.setPriority(10);
- var2.start();
- }
-
- public static void debuggable_boot() {
- Agent var0 = new Agent();
- Thread var1 = new Thread(var0);
- var1.setDaemon(true);
- var1.setName("Debugger agent");
- var1.setPriority(10);
- var1.start();
- }
-
- static {
- System.loadLibrary("agent");
- }
- }
-