提交 03940e3f 编写于 作者: D dcubed

Merge

...@@ -31,13 +31,19 @@ import java.io.*; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 @@ ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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; ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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.*; ...@@ -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 @@ ...@@ -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; ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 { ...@@ -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.*; ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 { ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 { ...@@ -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; ...@@ -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.*; ...@@ -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 { ...@@ -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 { ...@@ -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; ...@@ -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.*; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 @@ ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 @@ ...@@ -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 { ...@@ -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;
......
...@@ -549,3 +549,13 @@ bool FileMapInfo::is_in_shared_space(const void* p) { ...@@ -549,3 +549,13 @@ bool FileMapInfo::is_in_shared_space(const void* p) {
return false; return false;
} }
void FileMapInfo::print_shared_spaces() {
gclog_or_tty->print_cr("Shared Spaces:");
for (int i = 0; i < MetaspaceShared::n_regions; i++) {
struct FileMapInfo::FileMapHeader::space_info* si = &_header._space[i];
gclog_or_tty->print(" %s " INTPTR_FORMAT "-" INTPTR_FORMAT,
shared_region_name[i],
si->_base, si->_base + si->_used);
}
}
...@@ -149,6 +149,7 @@ public: ...@@ -149,6 +149,7 @@ public:
// Return true if given address is in the mapped shared space. // Return true if given address is in the mapped shared space.
bool is_in_shared_space(const void* p) NOT_CDS_RETURN_(false); bool is_in_shared_space(const void* p) NOT_CDS_RETURN_(false);
void print_shared_spaces() NOT_CDS_RETURN;
}; };
#endif // SHARE_VM_MEMORY_FILEMAP_HPP #endif // SHARE_VM_MEMORY_FILEMAP_HPP
...@@ -826,35 +826,15 @@ public: ...@@ -826,35 +826,15 @@ public:
bool reading() const { return true; } bool reading() const { return true; }
}; };
// Save bounds of shared spaces mapped in.
static char* _ro_base = NULL;
static char* _rw_base = NULL;
static char* _md_base = NULL;
static char* _mc_base = NULL;
// Return true if given address is in the mapped shared space. // Return true if given address is in the mapped shared space.
bool MetaspaceShared::is_in_shared_space(const void* p) { bool MetaspaceShared::is_in_shared_space(const void* p) {
if (_ro_base == NULL || _rw_base == NULL) { return UseSharedSpaces && FileMapInfo::current_info()->is_in_shared_space(p);
return false;
} else {
return ((p >= _ro_base && p < (_ro_base + SharedReadOnlySize)) ||
(p >= _rw_base && p < (_rw_base + SharedReadWriteSize)));
}
} }
void MetaspaceShared::print_shared_spaces() { void MetaspaceShared::print_shared_spaces() {
gclog_or_tty->print_cr("Shared Spaces:"); if (UseSharedSpaces) {
gclog_or_tty->print(" read-only " INTPTR_FORMAT "-" INTPTR_FORMAT, FileMapInfo::current_info()->print_shared_spaces();
_ro_base, _ro_base + SharedReadOnlySize); }
gclog_or_tty->print(" read-write " INTPTR_FORMAT "-" INTPTR_FORMAT,
_rw_base, _rw_base + SharedReadWriteSize);
gclog_or_tty->cr();
gclog_or_tty->print(" misc-data " INTPTR_FORMAT "-" INTPTR_FORMAT,
_md_base, _md_base + SharedMiscDataSize);
gclog_or_tty->print(" misc-code " INTPTR_FORMAT "-" INTPTR_FORMAT,
_mc_base, _mc_base + SharedMiscCodeSize);
gclog_or_tty->cr();
} }
...@@ -874,6 +854,11 @@ bool MetaspaceShared::map_shared_spaces(FileMapInfo* mapinfo) { ...@@ -874,6 +854,11 @@ bool MetaspaceShared::map_shared_spaces(FileMapInfo* mapinfo) {
assert(!DumpSharedSpaces, "Should not be called with DumpSharedSpaces"); assert(!DumpSharedSpaces, "Should not be called with DumpSharedSpaces");
char* _ro_base = NULL;
char* _rw_base = NULL;
char* _md_base = NULL;
char* _mc_base = NULL;
// Map each shared region // Map each shared region
if ((_ro_base = mapinfo->map_region(ro)) != NULL && if ((_ro_base = mapinfo->map_region(ro)) != NULL &&
(_rw_base = mapinfo->map_region(rw)) != NULL && (_rw_base = mapinfo->map_region(rw)) != NULL &&
......
...@@ -188,8 +188,8 @@ void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline& ...@@ -188,8 +188,8 @@ void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline&
(MallocCallsitePointer*)prev_malloc_itr.current(); (MallocCallsitePointer*)prev_malloc_itr.current();
while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) { while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) {
if (prev_malloc_callsite == NULL || if (prev_malloc_callsite == NULL) {
cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { assert(cur_malloc_callsite != NULL, "sanity check");
// this is a new callsite // this is a new callsite
_outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
amount_in_current_scale(cur_malloc_callsite->amount()), amount_in_current_scale(cur_malloc_callsite->amount()),
...@@ -197,22 +197,42 @@ void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline& ...@@ -197,22 +197,42 @@ void BaselineReporter::diff_callsites(const MemBaseline& cur, const MemBaseline&
diff_in_current_scale(cur_malloc_callsite->amount(), 0), diff_in_current_scale(cur_malloc_callsite->amount(), 0),
diff(cur_malloc_callsite->count(), 0)); diff(cur_malloc_callsite->count(), 0));
cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
} else if (cur_malloc_callsite == NULL || } else if (cur_malloc_callsite == NULL) {
cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { assert(prev_malloc_callsite != NULL, "Sanity check");
// this callsite is already gone // this callsite is already gone
_outputer.diff_malloc_callsite(prev_malloc_callsite->addr(), _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(),
amount_in_current_scale(0), 0, 0, 0,
diff_in_current_scale(0, prev_malloc_callsite->amount()), diff_in_current_scale(0, prev_malloc_callsite->amount()),
diff(0, prev_malloc_callsite->count())); diff(0, prev_malloc_callsite->count()));
prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
} else { // the same callsite } else {
_outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), assert(cur_malloc_callsite != NULL, "Sanity check");
amount_in_current_scale(cur_malloc_callsite->amount()), assert(prev_malloc_callsite != NULL, "Sanity check");
cur_malloc_callsite->count(), if (cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) {
diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()), // this is a new callsite
diff(cur_malloc_callsite->count(), prev_malloc_callsite->count())); _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); amount_in_current_scale(cur_malloc_callsite->amount()),
prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); cur_malloc_callsite->count(),
diff_in_current_scale(cur_malloc_callsite->amount(), 0),
diff(cur_malloc_callsite->count(), 0));
cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
} else if (cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) {
// this callsite is already gone
_outputer.diff_malloc_callsite(prev_malloc_callsite->addr(),
0, 0,
diff_in_current_scale(0, prev_malloc_callsite->amount()),
diff(0, prev_malloc_callsite->count()));
prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
} else {
// the same callsite
_outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
amount_in_current_scale(cur_malloc_callsite->amount()),
cur_malloc_callsite->count(),
diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()),
diff(cur_malloc_callsite->count(), prev_malloc_callsite->count()));
cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册