Mercurial > hg > truffle
diff agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | c18cbe5936b8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,230 @@ +/* + * Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package sun.jvm.hotspot.tools; + +import java.io.PrintStream; +import java.util.Hashtable; +import sun.jvm.hotspot.*; +import sun.jvm.hotspot.bugspot.*; +import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.debugger.*; + +// generic command line or GUI tool. +// override run & code main as shown below. + +public abstract class Tool implements Runnable { + private BugSpotAgent agent; + private int debugeeType; + + // debugeeType is one of constants below + protected static final int DEBUGEE_PID = 0; + protected static final int DEBUGEE_CORE = 1; + protected static final int DEBUGEE_REMOTE = 2; + + public String getName() { + return getClass().getName(); + } + + protected boolean needsJavaPrefix() { + return true; + } + + // whether this tool requires debuggee to be java process or core? + protected boolean requiresVM() { + return true; + } + + protected void setAgent(BugSpotAgent a) { + agent = a; + } + + protected void setDebugeeType(int dt) { + debugeeType = dt; + } + + protected BugSpotAgent getAgent() { + return agent; + } + + protected int getDebugeeType() { + return debugeeType; + } + + protected void printUsage() { + String name = null; + if (needsJavaPrefix()) { + name = "java " + getName(); + } else { + name = getName(); + } + System.out.println("Usage: " + name + " [option] <pid>"); + System.out.println("\t\t(to connect to a live java process)"); + System.out.println(" or " + name + " [option] <executable> <core>"); + System.out.println("\t\t(to connect to a core file)"); + System.out.println(" or " + name + " [option] [server_id@]<remote server IP or hostname>"); + System.out.println("\t\t(to connect to a remote debug server)"); + System.out.println(); + System.out.println("where option must be one of:"); + printFlagsUsage(); + } + + protected void printFlagsUsage() { + System.out.println(" -h | -help\tto print this help message"); + } + + protected void usage() { + printUsage(); + System.exit(1); + } + + /* + Derived class main should be of the following form: + + public static void main(String[] args) { + <derived class> obj = new <derived class>; + obj.start(args); + } + + */ + + protected void stop() { + if (agent != null) { + agent.detach(); + System.exit(0); + } + } + + protected void start(String[] args) { + if ((args.length < 1) || (args.length > 2)) { + usage(); + } + + // Attempt to handle -h or -help or some invalid flag + if (args[0].startsWith("-")) { + usage(); + } + + PrintStream err = System.err; + + int pid = 0; + String coreFileName = null; + String executableName = null; + String remoteServer = null; + + switch (args.length) { + case 1: + try { + pid = Integer.parseInt(args[0]); + debugeeType = DEBUGEE_PID; + } catch (NumberFormatException e) { + // try remote server + remoteServer = args[0]; + debugeeType = DEBUGEE_REMOTE; + } + break; + + case 2: + executableName = args[0]; + coreFileName = args[1]; + debugeeType = DEBUGEE_CORE; + break; + + default: + usage(); + } + + agent = new BugSpotAgent(); + try { + switch (debugeeType) { + case DEBUGEE_PID: + err.println("Attaching to process ID " + pid + ", please wait..."); + agent.attach(pid); + break; + + case DEBUGEE_CORE: + err.println("Attaching to core " + coreFileName + + " from executable " + executableName + ", please wait..."); + agent.attach(executableName, coreFileName); + break; + + case DEBUGEE_REMOTE: + err.println("Attaching to remote server " + remoteServer + ", please wait..."); + agent.attach(remoteServer); + break; + } + } + catch (DebuggerException e) { + switch (debugeeType) { + case DEBUGEE_PID: + err.print("Error attaching to process: "); + break; + + case DEBUGEE_CORE: + err.print("Error attaching to core file: "); + break; + + case DEBUGEE_REMOTE: + err.print("Error attaching to remote server: "); + break; + } + if (e.getMessage() != null) { + err.print(e.getMessage()); + } + err.println(); + System.exit(1); + } + + err.println("Debugger attached successfully."); + + boolean isJava = agent.isJavaMode(); + if (isJava) { + VM vm = VM.getVM(); + if (vm.isCore()) { + err.println("Core build detected."); + } else if (vm.isClientCompiler()) { + err.println("Client compiler detected."); + } else if (vm.isServerCompiler()) { + err.println("Server compiler detected."); + } else { + throw new RuntimeException("Fatal error: " + + "should have been able to detect core/C1/C2 build"); + } + + String version = vm.getVMRelease(); + if (version != null) { + err.print("JVM version is "); + err.println(version); + } + + run(); + } else { // not a java process or core + if (requiresVM()) { + err.println(getName() + " requires a java VM process/core!"); + } else { + run(); + } + } + } +}