mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 11:04:34 +02:00
8010278: SA: provide mechanism for using an alternative SA debugger back-end
Reviewed-by: sla, dsamersoff
This commit is contained in:
parent
7b2e1c47f4
commit
08377de5ab
25 changed files with 340 additions and 73 deletions
|
@ -31,13 +31,19 @@ import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class CLHSDB {
|
public class CLHSDB {
|
||||||
|
|
||||||
|
public CLHSDB(JVMDebugger d) {
|
||||||
|
jvmDebugger = d;
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
new CLHSDB(args).run();
|
new CLHSDB(args).run();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void run() {
|
public void run() {
|
||||||
// At this point, if pidText != null we are supposed to attach to it.
|
// If jvmDebugger is already set, we have been given a JVMDebugger.
|
||||||
// Else, if execPath != null, it is the path of a jdk/bin/java
|
// Otherwise, if pidText != null we are supposed to attach to it.
|
||||||
|
// Finally, if execPath != null, it is the path of a jdk/bin/java
|
||||||
// and coreFilename is the pathname of a core file we are
|
// and coreFilename is the pathname of a core file we are
|
||||||
// supposed to attach to.
|
// supposed to attach to.
|
||||||
|
|
||||||
|
@ -49,7 +55,9 @@ public class CLHSDB {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (pidText != null) {
|
if (jvmDebugger != null) {
|
||||||
|
attachDebugger(jvmDebugger);
|
||||||
|
} else if (pidText != null) {
|
||||||
attachDebugger(pidText);
|
attachDebugger(pidText);
|
||||||
} else if (execPath != null) {
|
} else if (execPath != null) {
|
||||||
attachDebugger(execPath, coreFilename);
|
attachDebugger(execPath, coreFilename);
|
||||||
|
@ -96,6 +104,7 @@ public class CLHSDB {
|
||||||
// Internals only below this point
|
// Internals only below this point
|
||||||
//
|
//
|
||||||
private HotSpotAgent agent;
|
private HotSpotAgent agent;
|
||||||
|
private JVMDebugger jvmDebugger;
|
||||||
private boolean attached;
|
private boolean attached;
|
||||||
// These had to be made data members because they are referenced in inner classes.
|
// These had to be made data members because they are referenced in inner classes.
|
||||||
private String pidText;
|
private String pidText;
|
||||||
|
@ -120,7 +129,7 @@ public class CLHSDB {
|
||||||
case (1):
|
case (1):
|
||||||
if (args[0].equals("help") || args[0].equals("-help")) {
|
if (args[0].equals("help") || args[0].equals("-help")) {
|
||||||
doUsage();
|
doUsage();
|
||||||
System.exit(0);
|
return;
|
||||||
}
|
}
|
||||||
// If all numbers, it is a PID to attach to
|
// If all numbers, it is a PID to attach to
|
||||||
// Else, it is a pathname to a .../bin/java for a core file.
|
// Else, it is a pathname to a .../bin/java for a core file.
|
||||||
|
@ -142,10 +151,15 @@ public class CLHSDB {
|
||||||
default:
|
default:
|
||||||
System.out.println("HSDB Error: Too many options specified");
|
System.out.println("HSDB Error: Too many options specified");
|
||||||
doUsage();
|
doUsage();
|
||||||
System.exit(1);
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void attachDebugger(JVMDebugger d) {
|
||||||
|
agent.attach(d);
|
||||||
|
attached = true;
|
||||||
|
}
|
||||||
|
|
||||||
/** NOTE we are in a different thread here than either the main
|
/** NOTE we are in a different thread here than either the main
|
||||||
thread or the Swing/AWT event handler thread, so we must be very
|
thread or the Swing/AWT event handler thread, so we must be very
|
||||||
careful when creating or removing widgets */
|
careful when creating or removing widgets */
|
||||||
|
|
|
@ -101,6 +101,9 @@ import sun.jvm.hotspot.utilities.soql.JSJavaFactoryImpl;
|
||||||
import sun.jvm.hotspot.utilities.soql.JSJavaScriptEngine;
|
import sun.jvm.hotspot.utilities.soql.JSJavaScriptEngine;
|
||||||
|
|
||||||
public class CommandProcessor {
|
public class CommandProcessor {
|
||||||
|
|
||||||
|
volatile boolean quit;
|
||||||
|
|
||||||
public abstract static class DebuggerInterface {
|
public abstract static class DebuggerInterface {
|
||||||
public abstract HotSpotAgent getAgent();
|
public abstract HotSpotAgent getAgent();
|
||||||
public abstract boolean isAttached();
|
public abstract boolean isAttached();
|
||||||
|
@ -1135,7 +1138,7 @@ public class CommandProcessor {
|
||||||
usage();
|
usage();
|
||||||
} else {
|
} else {
|
||||||
debugger.detach();
|
debugger.detach();
|
||||||
System.exit(0);
|
quit = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1714,7 +1717,7 @@ public class CommandProcessor {
|
||||||
}
|
}
|
||||||
protected void quit() {
|
protected void quit() {
|
||||||
debugger.detach();
|
debugger.detach();
|
||||||
System.exit(0);
|
quit = true;
|
||||||
}
|
}
|
||||||
protected BufferedReader getInputReader() {
|
protected BufferedReader getInputReader() {
|
||||||
return in;
|
return in;
|
||||||
|
@ -1781,7 +1784,7 @@ public class CommandProcessor {
|
||||||
|
|
||||||
public void run(boolean prompt) {
|
public void run(boolean prompt) {
|
||||||
// Process interactive commands.
|
// Process interactive commands.
|
||||||
while (true) {
|
while (!quit) {
|
||||||
if (prompt) printPrompt();
|
if (prompt) printPrompt();
|
||||||
String ln = null;
|
String ln = null;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -59,8 +59,11 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
||||||
// Internals only below this point
|
// Internals only below this point
|
||||||
//
|
//
|
||||||
private HotSpotAgent agent;
|
private HotSpotAgent agent;
|
||||||
|
private JVMDebugger jvmDebugger;
|
||||||
private JDesktopPane desktop;
|
private JDesktopPane desktop;
|
||||||
private boolean attached;
|
private boolean attached;
|
||||||
|
private boolean argError;
|
||||||
|
private JFrame frame;
|
||||||
/** List <JMenuItem> */
|
/** List <JMenuItem> */
|
||||||
private java.util.List attachMenuItems;
|
private java.util.List attachMenuItems;
|
||||||
/** List <JMenuItem> */
|
/** List <JMenuItem> */
|
||||||
|
@ -85,6 +88,11 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
||||||
System.out.println(" path-to-corefile: Debug this corefile. The default is 'core'");
|
System.out.println(" path-to-corefile: Debug this corefile. The default is 'core'");
|
||||||
System.out.println(" If no arguments are specified, you can select what to do from the GUI.\n");
|
System.out.println(" If no arguments are specified, you can select what to do from the GUI.\n");
|
||||||
HotSpotAgent.showUsage();
|
HotSpotAgent.showUsage();
|
||||||
|
argError = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HSDB(JVMDebugger d) {
|
||||||
|
jvmDebugger = d;
|
||||||
}
|
}
|
||||||
|
|
||||||
private HSDB(String[] args) {
|
private HSDB(String[] args) {
|
||||||
|
@ -95,7 +103,6 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
||||||
case (1):
|
case (1):
|
||||||
if (args[0].equals("help") || args[0].equals("-help")) {
|
if (args[0].equals("help") || args[0].equals("-help")) {
|
||||||
doUsage();
|
doUsage();
|
||||||
System.exit(0);
|
|
||||||
}
|
}
|
||||||
// If all numbers, it is a PID to attach to
|
// If all numbers, it is a PID to attach to
|
||||||
// Else, it is a pathname to a .../bin/java for a core file.
|
// Else, it is a pathname to a .../bin/java for a core file.
|
||||||
|
@ -117,24 +124,29 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
||||||
default:
|
default:
|
||||||
System.out.println("HSDB Error: Too many options specified");
|
System.out.println("HSDB Error: Too many options specified");
|
||||||
doUsage();
|
doUsage();
|
||||||
System.exit(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void run() {
|
// close this tool without calling System.exit
|
||||||
// At this point, if pidText != null we are supposed to attach to it.
|
protected void closeUI() {
|
||||||
// Else, if execPath != null, it is the path of a jdk/bin/java
|
workerThread.shutdown();
|
||||||
// and coreFilename is the pathname of a core file we are
|
frame.dispose();
|
||||||
// supposed to attach to.
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
// Don't start the UI if there were bad arguments.
|
||||||
|
if (argError) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
agent = new HotSpotAgent();
|
agent = new HotSpotAgent();
|
||||||
workerThread = new WorkerThread();
|
workerThread = new WorkerThread();
|
||||||
attachMenuItems = new java.util.ArrayList();
|
attachMenuItems = new java.util.ArrayList();
|
||||||
detachMenuItems = new java.util.ArrayList();
|
detachMenuItems = new java.util.ArrayList();
|
||||||
|
|
||||||
JFrame frame = new JFrame("HSDB - HotSpot Debugger");
|
frame = new JFrame("HSDB - HotSpot Debugger");
|
||||||
frame.setSize(800, 600);
|
frame.setSize(800, 600);
|
||||||
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
|
||||||
JMenuBar menuBar = new JMenuBar();
|
JMenuBar menuBar = new JMenuBar();
|
||||||
|
|
||||||
|
@ -197,7 +209,7 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
||||||
item = createMenuItem("Exit",
|
item = createMenuItem("Exit",
|
||||||
new ActionListener() {
|
new ActionListener() {
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
System.exit(0);
|
closeUI();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
|
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
|
||||||
|
@ -406,7 +418,15 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (pidText != null) {
|
// If jvmDebugger is already set, we have been given a JVMDebugger.
|
||||||
|
// Otherwise, if pidText != null we are supposed to attach to it.
|
||||||
|
// Finally, if execPath != null, it is the path of a jdk/bin/java
|
||||||
|
// and coreFilename is the pathname of a core file we are
|
||||||
|
// supposed to attach to.
|
||||||
|
|
||||||
|
if (jvmDebugger != null) {
|
||||||
|
attach(jvmDebugger);
|
||||||
|
} else if (pidText != null) {
|
||||||
attach(pidText);
|
attach(pidText);
|
||||||
} else if (execPath != null) {
|
} else if (execPath != null) {
|
||||||
attach(execPath, coreFilename);
|
attach(execPath, coreFilename);
|
||||||
|
@ -1113,6 +1133,12 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attach to existing JVMDebugger, which should be already attached to a core/process.
|
||||||
|
private void attach(JVMDebugger d) {
|
||||||
|
attached = true;
|
||||||
|
showThreadsDialog();
|
||||||
|
}
|
||||||
|
|
||||||
/** NOTE we are in a different thread here than either the main
|
/** NOTE we are in a different thread here than either the main
|
||||||
thread or the Swing/AWT event handler thread, so we must be very
|
thread or the Swing/AWT event handler thread, so we must be very
|
||||||
careful when creating or removing widgets */
|
careful when creating or removing widgets */
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
package sun.jvm.hotspot;
|
package sun.jvm.hotspot;
|
||||||
|
|
||||||
import java.rmi.RemoteException;
|
import java.rmi.RemoteException;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
import sun.jvm.hotspot.debugger.Debugger;
|
import sun.jvm.hotspot.debugger.Debugger;
|
||||||
import sun.jvm.hotspot.debugger.DebuggerException;
|
import sun.jvm.hotspot.debugger.DebuggerException;
|
||||||
|
@ -63,7 +65,6 @@ public class HotSpotAgent {
|
||||||
|
|
||||||
private String os;
|
private String os;
|
||||||
private String cpu;
|
private String cpu;
|
||||||
private String fileSep;
|
|
||||||
|
|
||||||
// The system can work in several ways:
|
// The system can work in several ways:
|
||||||
// - Attaching to local process
|
// - Attaching to local process
|
||||||
|
@ -155,6 +156,14 @@ public class HotSpotAgent {
|
||||||
go();
|
go();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** This uses a JVMDebugger that is already attached to the core or process */
|
||||||
|
public synchronized void attach(JVMDebugger d)
|
||||||
|
throws DebuggerException {
|
||||||
|
debugger = d;
|
||||||
|
isServer = false;
|
||||||
|
go();
|
||||||
|
}
|
||||||
|
|
||||||
/** This attaches to a "debug server" on a remote machine; this
|
/** This attaches to a "debug server" on a remote machine; this
|
||||||
remote server has already attached to a process or opened a
|
remote server has already attached to a process or opened a
|
||||||
core file and is waiting for RMI calls on the Debugger object to
|
core file and is waiting for RMI calls on the Debugger object to
|
||||||
|
@ -303,28 +312,37 @@ public class HotSpotAgent {
|
||||||
// server, but not client attaching to server)
|
// server, but not client attaching to server)
|
||||||
//
|
//
|
||||||
|
|
||||||
try {
|
// Handle existing or alternate JVMDebugger:
|
||||||
os = PlatformInfo.getOS();
|
// these will set os, cpu independently of our PlatformInfo implementation.
|
||||||
cpu = PlatformInfo.getCPU();
|
String alternateDebugger = System.getProperty("sa.altDebugger");
|
||||||
}
|
if (debugger != null) {
|
||||||
catch (UnsupportedPlatformException e) {
|
setupDebuggerExisting();
|
||||||
throw new DebuggerException(e);
|
|
||||||
}
|
} else if (alternateDebugger != null) {
|
||||||
fileSep = System.getProperty("file.separator");
|
setupDebuggerAlternate(alternateDebugger);
|
||||||
|
|
||||||
if (os.equals("solaris")) {
|
|
||||||
setupDebuggerSolaris();
|
|
||||||
} else if (os.equals("win32")) {
|
|
||||||
setupDebuggerWin32();
|
|
||||||
} else if (os.equals("linux")) {
|
|
||||||
setupDebuggerLinux();
|
|
||||||
} else if (os.equals("bsd")) {
|
|
||||||
setupDebuggerBsd();
|
|
||||||
} else if (os.equals("darwin")) {
|
|
||||||
setupDebuggerDarwin();
|
|
||||||
} else {
|
} else {
|
||||||
// Add support for more operating systems here
|
// Otherwise, os, cpu are those of our current platform:
|
||||||
throw new DebuggerException("Operating system " + os + " not yet supported");
|
try {
|
||||||
|
os = PlatformInfo.getOS();
|
||||||
|
cpu = PlatformInfo.getCPU();
|
||||||
|
} catch (UnsupportedPlatformException e) {
|
||||||
|
throw new DebuggerException(e);
|
||||||
|
}
|
||||||
|
if (os.equals("solaris")) {
|
||||||
|
setupDebuggerSolaris();
|
||||||
|
} else if (os.equals("win32")) {
|
||||||
|
setupDebuggerWin32();
|
||||||
|
} else if (os.equals("linux")) {
|
||||||
|
setupDebuggerLinux();
|
||||||
|
} else if (os.equals("bsd")) {
|
||||||
|
setupDebuggerBsd();
|
||||||
|
} else if (os.equals("darwin")) {
|
||||||
|
setupDebuggerDarwin();
|
||||||
|
} else {
|
||||||
|
// Add support for more operating systems here
|
||||||
|
throw new DebuggerException("Operating system " + os + " not yet supported");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isServer) {
|
if (isServer) {
|
||||||
|
@ -423,6 +441,41 @@ public class HotSpotAgent {
|
||||||
// OS-specific debugger setup/connect routines
|
// OS-specific debugger setup/connect routines
|
||||||
//
|
//
|
||||||
|
|
||||||
|
// Use the existing JVMDebugger, as passed to our constructor.
|
||||||
|
// Retrieve os and cpu from that debugger, not the current platform.
|
||||||
|
private void setupDebuggerExisting() {
|
||||||
|
|
||||||
|
os = debugger.getOS();
|
||||||
|
cpu = debugger.getCPU();
|
||||||
|
setupJVMLibNames(os);
|
||||||
|
machDesc = debugger.getMachineDescription();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Given a classname, load an alternate implementation of JVMDebugger.
|
||||||
|
private void setupDebuggerAlternate(String alternateName) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
Class c = Class.forName(alternateName);
|
||||||
|
Constructor cons = c.getConstructor();
|
||||||
|
debugger = (JVMDebugger) cons.newInstance();
|
||||||
|
attachDebugger();
|
||||||
|
setupDebuggerExisting();
|
||||||
|
|
||||||
|
} catch (ClassNotFoundException cnfe) {
|
||||||
|
throw new DebuggerException("Cannot find alternate SA Debugger: '" + alternateName + "'");
|
||||||
|
} catch (NoSuchMethodException nsme) {
|
||||||
|
throw new DebuggerException("Alternate SA Debugger: '" + alternateName + "' has missing constructor.");
|
||||||
|
} catch (InstantiationException ie) {
|
||||||
|
throw new DebuggerException("Alternate SA Debugger: '" + alternateName + "' fails to initialise: ", ie);
|
||||||
|
} catch (IllegalAccessException iae) {
|
||||||
|
throw new DebuggerException("Alternate SA Debugger: '" + alternateName + "' fails to initialise: ", iae);
|
||||||
|
} catch (InvocationTargetException iae) {
|
||||||
|
throw new DebuggerException("Alternate SA Debugger: '" + alternateName + "' fails to initialise: ", iae);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.err.println("Loaded alternate HotSpot SA Debugger: " + alternateName);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Solaris
|
// Solaris
|
||||||
//
|
//
|
||||||
|
@ -466,6 +519,11 @@ public class HotSpotAgent {
|
||||||
debugger = new RemoteDebuggerClient(remote);
|
debugger = new RemoteDebuggerClient(remote);
|
||||||
machDesc = ((RemoteDebuggerClient) debugger).getMachineDescription();
|
machDesc = ((RemoteDebuggerClient) debugger).getMachineDescription();
|
||||||
os = debugger.getOS();
|
os = debugger.getOS();
|
||||||
|
setupJVMLibNames(os);
|
||||||
|
cpu = debugger.getCPU();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupJVMLibNames(String os) {
|
||||||
if (os.equals("solaris")) {
|
if (os.equals("solaris")) {
|
||||||
setupJVMLibNamesSolaris();
|
setupJVMLibNamesSolaris();
|
||||||
} else if (os.equals("win32")) {
|
} else if (os.equals("win32")) {
|
||||||
|
@ -479,8 +537,6 @@ public class HotSpotAgent {
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException("Unknown OS type");
|
throw new RuntimeException("Unknown OS type");
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu = debugger.getCPU();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupJVMLibNamesSolaris() {
|
private void setupJVMLibNamesSolaris() {
|
||||||
|
|
|
@ -26,11 +26,11 @@ package sun.jvm.hotspot.debugger.linux;
|
||||||
|
|
||||||
import sun.jvm.hotspot.debugger.*;
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
|
||||||
class LinuxAddress implements Address {
|
public class LinuxAddress implements Address {
|
||||||
protected LinuxDebugger debugger;
|
protected LinuxDebugger debugger;
|
||||||
protected long addr;
|
protected long addr;
|
||||||
|
|
||||||
LinuxAddress(LinuxDebugger debugger, long addr) {
|
public LinuxAddress(LinuxDebugger debugger, long addr) {
|
||||||
this.debugger = debugger;
|
this.debugger = debugger;
|
||||||
this.addr = addr;
|
this.addr = addr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ package sun.jvm.hotspot.debugger.linux;
|
||||||
|
|
||||||
import sun.jvm.hotspot.debugger.*;
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
|
||||||
class LinuxOopHandle extends LinuxAddress implements OopHandle {
|
public class LinuxOopHandle extends LinuxAddress implements OopHandle {
|
||||||
LinuxOopHandle(LinuxDebugger debugger, long addr) {
|
public LinuxOopHandle(LinuxDebugger debugger, long addr) {
|
||||||
super(debugger, addr);
|
super(debugger, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -246,7 +246,7 @@ public class VM {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final boolean disableDerivedPrinterTableCheck;
|
private static final boolean disableDerivedPointerTableCheck;
|
||||||
private static final Properties saProps;
|
private static final Properties saProps;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
@ -256,12 +256,12 @@ public class VM {
|
||||||
url = VM.class.getClassLoader().getResource("sa.properties");
|
url = VM.class.getClassLoader().getResource("sa.properties");
|
||||||
saProps.load(new BufferedInputStream(url.openStream()));
|
saProps.load(new BufferedInputStream(url.openStream()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("Unable to load properties " +
|
System.err.println("Unable to load properties " +
|
||||||
(url == null ? "null" : url.toString()) +
|
(url == null ? "null" : url.toString()) +
|
||||||
": " + e.getMessage());
|
": " + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
disableDerivedPrinterTableCheck = System.getProperty("sun.jvm.hotspot.runtime.VM.disableDerivedPointerTableCheck") != null;
|
disableDerivedPointerTableCheck = System.getProperty("sun.jvm.hotspot.runtime.VM.disableDerivedPointerTableCheck") != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private VM(TypeDataBase db, JVMDebugger debugger, boolean isBigEndian) {
|
private VM(TypeDataBase db, JVMDebugger debugger, boolean isBigEndian) {
|
||||||
|
@ -371,7 +371,8 @@ public class VM {
|
||||||
/** This is used by the debugging system */
|
/** This is used by the debugging system */
|
||||||
public static void initialize(TypeDataBase db, JVMDebugger debugger) {
|
public static void initialize(TypeDataBase db, JVMDebugger debugger) {
|
||||||
if (soleInstance != null) {
|
if (soleInstance != null) {
|
||||||
throw new RuntimeException("Attempt to initialize VM twice");
|
// Using multiple SA Tool classes in the same process creates a call here.
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
soleInstance = new VM(db, debugger, debugger.getMachineDescription().isBigEndian());
|
soleInstance = new VM(db, debugger, debugger.getMachineDescription().isBigEndian());
|
||||||
|
|
||||||
|
@ -683,7 +684,7 @@ public class VM {
|
||||||
|
|
||||||
/** Returns true if C2 derived pointer table should be used, false otherwise */
|
/** Returns true if C2 derived pointer table should be used, false otherwise */
|
||||||
public boolean useDerivedPointerTable() {
|
public boolean useDerivedPointerTable() {
|
||||||
return !disableDerivedPrinterTableCheck;
|
return !disableDerivedPointerTableCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the code cache; should not be used if is core build */
|
/** Returns the code cache; should not be used if is core build */
|
||||||
|
|
|
@ -41,6 +41,14 @@ import sun.jvm.hotspot.utilities.*;
|
||||||
public class ClassLoaderStats extends Tool {
|
public class ClassLoaderStats extends Tool {
|
||||||
boolean verbose = true;
|
boolean verbose = true;
|
||||||
|
|
||||||
|
public ClassLoaderStats() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ClassLoaderStats(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
ClassLoaderStats cls = new ClassLoaderStats();
|
ClassLoaderStats cls = new ClassLoaderStats();
|
||||||
cls.start(args);
|
cls.start(args);
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
package sun.jvm.hotspot.tools;
|
package sun.jvm.hotspot.tools;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
import sun.jvm.hotspot.tools.*;
|
import sun.jvm.hotspot.tools.*;
|
||||||
|
|
||||||
import sun.jvm.hotspot.oops.*;
|
import sun.jvm.hotspot.oops.*;
|
||||||
|
@ -42,6 +43,15 @@ import java.util.Comparator;
|
||||||
* summary of these objects in the form of a histogram.
|
* summary of these objects in the form of a histogram.
|
||||||
*/
|
*/
|
||||||
public class FinalizerInfo extends Tool {
|
public class FinalizerInfo extends Tool {
|
||||||
|
|
||||||
|
public FinalizerInfo() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public FinalizerInfo(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
FinalizerInfo finfo = new FinalizerInfo();
|
FinalizerInfo finfo = new FinalizerInfo();
|
||||||
finfo.start(args);
|
finfo.start(args);
|
||||||
|
|
|
@ -25,10 +25,19 @@
|
||||||
package sun.jvm.hotspot.tools;
|
package sun.jvm.hotspot.tools;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
import sun.jvm.hotspot.runtime.*;
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
|
||||||
public class FlagDumper extends Tool {
|
public class FlagDumper extends Tool {
|
||||||
|
|
||||||
|
public FlagDumper() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public FlagDumper(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
VM.Flag[] flags = VM.getVM().getCommandLineFlags();
|
VM.Flag[] flags = VM.getVM().getCommandLineFlags();
|
||||||
PrintStream out = System.out;
|
PrintStream out = System.out;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
package sun.jvm.hotspot.tools;
|
package sun.jvm.hotspot.tools;
|
||||||
|
|
||||||
import sun.jvm.hotspot.utilities.HeapHprofBinWriter;
|
import sun.jvm.hotspot.utilities.HeapHprofBinWriter;
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -42,6 +43,11 @@ public class HeapDumper extends Tool {
|
||||||
this.dumpFile = dumpFile;
|
this.dumpFile = dumpFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HeapDumper(String dumpFile, JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
this.dumpFile = dumpFile;
|
||||||
|
}
|
||||||
|
|
||||||
protected void printFlagsUsage() {
|
protected void printFlagsUsage() {
|
||||||
System.out.println(" <no option>\tto dump heap to " +
|
System.out.println(" <no option>\tto dump heap to " +
|
||||||
DEFAULT_DUMP_FILE);
|
DEFAULT_DUMP_FILE);
|
||||||
|
|
|
@ -29,12 +29,21 @@ import sun.jvm.hotspot.gc_interface.*;
|
||||||
import sun.jvm.hotspot.gc_implementation.g1.*;
|
import sun.jvm.hotspot.gc_implementation.g1.*;
|
||||||
import sun.jvm.hotspot.gc_implementation.parallelScavenge.*;
|
import sun.jvm.hotspot.gc_implementation.parallelScavenge.*;
|
||||||
import sun.jvm.hotspot.gc_implementation.shared.*;
|
import sun.jvm.hotspot.gc_implementation.shared.*;
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
import sun.jvm.hotspot.memory.*;
|
import sun.jvm.hotspot.memory.*;
|
||||||
import sun.jvm.hotspot.oops.*;
|
import sun.jvm.hotspot.oops.*;
|
||||||
import sun.jvm.hotspot.runtime.*;
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
|
||||||
public class HeapSummary extends Tool {
|
public class HeapSummary extends Tool {
|
||||||
|
|
||||||
|
public HeapSummary() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public HeapSummary(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
HeapSummary hs = new HeapSummary();
|
HeapSummary hs = new HeapSummary();
|
||||||
hs.start(args);
|
hs.start(args);
|
||||||
|
|
|
@ -25,12 +25,21 @@
|
||||||
package sun.jvm.hotspot.tools;
|
package sun.jvm.hotspot.tools;
|
||||||
|
|
||||||
import sun.jvm.hotspot.runtime.*;
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
|
|
||||||
public class JInfo extends Tool {
|
public class JInfo extends Tool {
|
||||||
|
public JInfo() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
public JInfo(int m) {
|
public JInfo(int m) {
|
||||||
mode = m;
|
mode = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JInfo(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
protected boolean needsJavaPrefix() {
|
protected boolean needsJavaPrefix() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
package sun.jvm.hotspot.tools;
|
package sun.jvm.hotspot.tools;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
import sun.jvm.hotspot.utilities.*;
|
import sun.jvm.hotspot.utilities.*;
|
||||||
|
|
||||||
public class JMap extends Tool {
|
public class JMap extends Tool {
|
||||||
|
@ -36,6 +37,10 @@ public class JMap extends Tool {
|
||||||
this(MODE_PMAP);
|
this(MODE_PMAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JMap(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
protected boolean needsJavaPrefix() {
|
protected boolean needsJavaPrefix() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,9 +25,19 @@
|
||||||
package sun.jvm.hotspot.tools;
|
package sun.jvm.hotspot.tools;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
import sun.jvm.hotspot.runtime.*;
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
|
||||||
public class JSnap extends Tool {
|
public class JSnap extends Tool {
|
||||||
|
|
||||||
|
public JSnap() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSnap(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
final PrintStream out = System.out;
|
final PrintStream out = System.out;
|
||||||
if (PerfMemory.initialized()) {
|
if (PerfMemory.initialized()) {
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
package sun.jvm.hotspot.tools;
|
package sun.jvm.hotspot.tools;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
|
|
||||||
public class JStack extends Tool {
|
public class JStack extends Tool {
|
||||||
public JStack(boolean mixedMode, boolean concurrentLocks) {
|
public JStack(boolean mixedMode, boolean concurrentLocks) {
|
||||||
this.mixedMode = mixedMode;
|
this.mixedMode = mixedMode;
|
||||||
|
@ -34,6 +36,10 @@ public class JStack extends Tool {
|
||||||
this(true, true);
|
this(true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JStack(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
protected boolean needsJavaPrefix() {
|
protected boolean needsJavaPrefix() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,14 @@ import java.io.PrintStream;
|
||||||
an object histogram from a remote or crashed VM. */
|
an object histogram from a remote or crashed VM. */
|
||||||
public class ObjectHistogram extends Tool {
|
public class ObjectHistogram extends Tool {
|
||||||
|
|
||||||
|
public ObjectHistogram() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObjectHistogram(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
run(System.out, System.err);
|
run(System.out, System.err);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,15 @@ import sun.jvm.hotspot.debugger.cdbg.*;
|
||||||
import sun.jvm.hotspot.runtime.*;
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
|
||||||
public class PMap extends Tool {
|
public class PMap extends Tool {
|
||||||
|
|
||||||
|
public PMap() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PMap(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
run(System.out);
|
run(System.out);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,10 @@ public class PStack extends Tool {
|
||||||
this(true, true);
|
this(true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PStack(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
run(System.out);
|
run(System.out);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,16 @@ public class StackTrace extends Tool {
|
||||||
run(System.out);
|
run(System.out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StackTrace(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StackTrace(JVMDebugger d, boolean v, boolean concurrentLocks) {
|
||||||
|
super(d);
|
||||||
|
this.verbose = v;
|
||||||
|
this.concurrentLocks = concurrentLocks;
|
||||||
|
}
|
||||||
|
|
||||||
public void run(java.io.PrintStream tty) {
|
public void run(java.io.PrintStream tty) {
|
||||||
// Ready to go with the database...
|
// Ready to go with the database...
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -27,10 +27,19 @@ package sun.jvm.hotspot.tools;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
import sun.jvm.hotspot.runtime.*;
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
|
||||||
public class SysPropsDumper extends Tool {
|
public class SysPropsDumper extends Tool {
|
||||||
|
|
||||||
|
public SysPropsDumper() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SysPropsDumper(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
Properties sysProps = VM.getVM().getSystemProperties();
|
Properties sysProps = VM.getVM().getSystemProperties();
|
||||||
PrintStream out = System.out;
|
PrintStream out = System.out;
|
||||||
|
|
|
@ -35,6 +35,7 @@ import sun.jvm.hotspot.debugger.*;
|
||||||
|
|
||||||
public abstract class Tool implements Runnable {
|
public abstract class Tool implements Runnable {
|
||||||
private HotSpotAgent agent;
|
private HotSpotAgent agent;
|
||||||
|
private JVMDebugger jvmDebugger;
|
||||||
private int debugeeType;
|
private int debugeeType;
|
||||||
|
|
||||||
// debugeeType is one of constants below
|
// debugeeType is one of constants below
|
||||||
|
@ -42,6 +43,13 @@ public abstract class Tool implements Runnable {
|
||||||
protected static final int DEBUGEE_CORE = 1;
|
protected static final int DEBUGEE_CORE = 1;
|
||||||
protected static final int DEBUGEE_REMOTE = 2;
|
protected static final int DEBUGEE_REMOTE = 2;
|
||||||
|
|
||||||
|
public Tool() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tool(JVMDebugger d) {
|
||||||
|
jvmDebugger = d;
|
||||||
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return getClass().getName();
|
return getClass().getName();
|
||||||
}
|
}
|
||||||
|
@ -90,7 +98,6 @@ public abstract class Tool implements Runnable {
|
||||||
|
|
||||||
protected void usage() {
|
protected void usage() {
|
||||||
printUsage();
|
printUsage();
|
||||||
System.exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -106,13 +113,13 @@ public abstract class Tool implements Runnable {
|
||||||
protected void stop() {
|
protected void stop() {
|
||||||
if (agent != null) {
|
if (agent != null) {
|
||||||
agent.detach();
|
agent.detach();
|
||||||
System.exit(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void start(String[] args) {
|
protected void start(String[] args) {
|
||||||
if ((args.length < 1) || (args.length > 2)) {
|
if ((args.length < 1) || (args.length > 2)) {
|
||||||
usage();
|
usage();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to handle -h or -help or some invalid flag
|
// Attempt to handle -h or -help or some invalid flag
|
||||||
|
@ -185,13 +192,31 @@ public abstract class Tool implements Runnable {
|
||||||
}
|
}
|
||||||
if (e.getMessage() != null) {
|
if (e.getMessage() != null) {
|
||||||
err.print(e.getMessage());
|
err.print(e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
err.println();
|
err.println();
|
||||||
System.exit(1);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
err.println("Debugger attached successfully.");
|
err.println("Debugger attached successfully.");
|
||||||
|
startInternal();
|
||||||
|
}
|
||||||
|
|
||||||
|
// When using an existing JVMDebugger.
|
||||||
|
public void start() {
|
||||||
|
|
||||||
|
if (jvmDebugger == null) {
|
||||||
|
throw new RuntimeException("Tool.start() called with no JVMDebugger set.");
|
||||||
|
}
|
||||||
|
agent = new HotSpotAgent();
|
||||||
|
agent.attach(jvmDebugger);
|
||||||
|
startInternal();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remains of the start mechanism, common to both start methods.
|
||||||
|
private void startInternal() {
|
||||||
|
|
||||||
|
PrintStream err = System.err;
|
||||||
VM vm = VM.getVM();
|
VM vm = VM.getVM();
|
||||||
if (vm.isCore()) {
|
if (vm.isCore()) {
|
||||||
err.println("Core build detected.");
|
err.println("Core build detected.");
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
package sun.jvm.hotspot.tools.jcore;
|
package sun.jvm.hotspot.tools.jcore;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
import java.util.jar.JarOutputStream;
|
import java.util.jar.JarOutputStream;
|
||||||
import java.util.jar.JarEntry;
|
import java.util.jar.JarEntry;
|
||||||
import java.util.jar.Manifest;
|
import java.util.jar.Manifest;
|
||||||
|
@ -38,6 +39,16 @@ public class ClassDump extends Tool {
|
||||||
private ClassFilter classFilter;
|
private ClassFilter classFilter;
|
||||||
private String outputDirectory;
|
private String outputDirectory;
|
||||||
private JarOutputStream jarStream;
|
private JarOutputStream jarStream;
|
||||||
|
private String pkgList;
|
||||||
|
|
||||||
|
public ClassDump() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ClassDump(JVMDebugger d, String pkgList) {
|
||||||
|
super(d);
|
||||||
|
this.pkgList = pkgList;
|
||||||
|
}
|
||||||
|
|
||||||
public void setClassFilter(ClassFilter cf) {
|
public void setClassFilter(ClassFilter cf) {
|
||||||
classFilter = cf;
|
classFilter = cf;
|
||||||
|
@ -63,6 +74,25 @@ public class ClassDump extends Tool {
|
||||||
public void run() {
|
public void run() {
|
||||||
// Ready to go with the database...
|
// Ready to go with the database...
|
||||||
try {
|
try {
|
||||||
|
// The name of the filter always comes from a System property.
|
||||||
|
// If we have a pkgList, pass it, otherwise let the filter read
|
||||||
|
// its own System property for the list of classes.
|
||||||
|
String filterClassName = System.getProperty("sun.jvm.hotspot.tools.jcore.filter",
|
||||||
|
"sun.jvm.hotspot.tools.jcore.PackageNameFilter");
|
||||||
|
try {
|
||||||
|
Class filterClass = Class.forName(filterClassName);
|
||||||
|
if (pkgList == null) {
|
||||||
|
classFilter = (ClassFilter) filterClass.newInstance();
|
||||||
|
} else {
|
||||||
|
Constructor con = filterClass.getConstructor(String.class);
|
||||||
|
classFilter = (ClassFilter) con.newInstance(pkgList);
|
||||||
|
}
|
||||||
|
} catch(Exception exp) {
|
||||||
|
System.err.println("Warning: Can not create class filter!");
|
||||||
|
}
|
||||||
|
|
||||||
|
String outputDirectory = System.getProperty("sun.jvm.hotspot.tools.jcore.outputDir", ".");
|
||||||
|
setOutputDirectory(outputDirectory);
|
||||||
|
|
||||||
// walk through the system dictionary
|
// walk through the system dictionary
|
||||||
SystemDictionary dict = VM.getVM().getSystemDictionary();
|
SystemDictionary dict = VM.getVM().getSystemDictionary();
|
||||||
|
@ -139,26 +169,8 @@ public class ClassDump extends Tool {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// load class filters
|
|
||||||
ClassFilter classFilter = null;
|
|
||||||
String filterClassName = System.getProperty("sun.jvm.hotspot.tools.jcore.filter");
|
|
||||||
if (filterClassName != null) {
|
|
||||||
try {
|
|
||||||
Class filterClass = Class.forName(filterClassName);
|
|
||||||
classFilter = (ClassFilter) filterClass.newInstance();
|
|
||||||
} catch(Exception exp) {
|
|
||||||
System.err.println("Warning: Can not create class filter!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String outputDirectory = System.getProperty("sun.jvm.hotspot.tools.jcore.outputDir");
|
|
||||||
if (outputDirectory == null)
|
|
||||||
outputDirectory = ".";
|
|
||||||
|
|
||||||
|
|
||||||
ClassDump cd = new ClassDump();
|
ClassDump cd = new ClassDump();
|
||||||
cd.setClassFilter(classFilter);
|
|
||||||
cd.setOutputDirectory(outputDirectory);
|
|
||||||
cd.start(args);
|
cd.start(args);
|
||||||
cd.stop();
|
cd.stop();
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,12 +24,22 @@
|
||||||
|
|
||||||
package sun.jvm.hotspot.tools.soql;
|
package sun.jvm.hotspot.tools.soql;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.JVMDebugger;
|
||||||
import sun.jvm.hotspot.tools.*;
|
import sun.jvm.hotspot.tools.*;
|
||||||
import sun.jvm.hotspot.utilities.*;
|
import sun.jvm.hotspot.utilities.*;
|
||||||
import sun.jvm.hotspot.utilities.soql.*;
|
import sun.jvm.hotspot.utilities.soql.*;
|
||||||
|
|
||||||
/** This is command line JavaScript debugger console */
|
/** This is command line JavaScript debugger console */
|
||||||
public class JSDB extends Tool {
|
public class JSDB extends Tool {
|
||||||
|
|
||||||
|
public JSDB() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSDB(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
JSDB jsdb = new JSDB();
|
JSDB jsdb = new JSDB();
|
||||||
jsdb.start(args);
|
jsdb.start(args);
|
||||||
|
|
|
@ -44,6 +44,14 @@ public class SOQL extends Tool {
|
||||||
soql.stop();
|
soql.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SOQL() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SOQL(JVMDebugger d) {
|
||||||
|
super(d);
|
||||||
|
}
|
||||||
|
|
||||||
protected SOQLEngine soqlEngine;
|
protected SOQLEngine soqlEngine;
|
||||||
protected BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
|
protected BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
|
||||||
protected PrintStream out = System.out;
|
protected PrintStream out = System.out;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue