提交 69967288 编写于 作者: S sla

7165259: Remove BugSpot

Reviewed-by: coleenp, mgronlun
上级 99d41163
......@@ -19,7 +19,7 @@
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
#
# This guards against adding broken .java files to the directory
......@@ -42,8 +42,6 @@ PKGLIST = \
sun.jvm.hotspot \
sun.jvm.hotspot.asm \
sun.jvm.hotspot.asm.sparc \
sun.jvm.hotspot.bugspot \
sun.jvm.hotspot.bugspot.tree \
sun.jvm.hotspot.c1 \
sun.jvm.hotspot.ci \
sun.jvm.hotspot.code \
......@@ -84,7 +82,6 @@ sun.jvm.hotspot.gc_implementation.shared \
sun.jvm.hotspot.gc_interface \
sun.jvm.hotspot.interpreter \
sun.jvm.hotspot.jdi \
sun.jvm.hotspot.livejvm \
sun.jvm.hotspot.memory \
sun.jvm.hotspot.opto \
sun.jvm.hotspot.oops \
......@@ -130,8 +127,6 @@ FILELIST = \
sun/jvm/hotspot/*.java \
sun/jvm/hotspot/asm/*.java \
sun/jvm/hotspot/asm/sparc/*.java \
sun/jvm/hotspot/bugspot/*.java \
sun/jvm/hotspot/bugspot/tree/*.java \
sun/jvm/hotspot/c1/*.java \
sun/jvm/hotspot/ci/*.java \
sun/jvm/hotspot/code/*.java \
......@@ -168,7 +163,6 @@ sun/jvm/hotspot/gc_implementation/parallelScavenge/*.java \
sun/jvm/hotspot/gc_implementation/shared/*.java \
sun/jvm/hotspot/interpreter/*.java \
sun/jvm/hotspot/jdi/*.java \
sun/jvm/hotspot/livejvm/*.java \
sun/jvm/hotspot/memory/*.java \
sun/jvm/hotspot/oops/*.java \
sun/jvm/hotspot/opto/*.java \
......@@ -205,7 +199,7 @@ sun/jvm/hotspot/utilities/*.java \
sun/jvm/hotspot/utilities/memo/*.java \
sun/jvm/hotspot/utilities/soql/*.java \
com/sun/java/swing/action/*.java \
com/sun/java/swing/ui/*.java
com/sun/java/swing/ui/*.java
#END FILELIST
ifneq "x$(ALT_BOOTDIR)" "x"
......@@ -231,7 +225,7 @@ BUILD_DIR = ../build
OUTPUT_DIR = $(BUILD_DIR)/classes
DOC_DIR = $(BUILD_DIR)/doc
# gnumake 3.78.1 does not accept the *s,
# gnumake 3.78.1 does not accept the *s,
# so use the shell to expand them
ALLFILES := $(patsubst %,$(SRC_DIR)/%,$(FILELIST))
ALLFILES := $(shell /bin/ls $(ALLFILES))
......@@ -303,7 +297,7 @@ sizes: $(ALLFILES)
cscope: $(ALLFILES)
rm -f java.files
echo $(ALLFILES) > java.files
cscope -b -i java.files -f java.out
cscope -b -i java.files -f java.out
rm -f java.files
.PHONY: sa.jar
......
REM
REM Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
REM
REM This code is free software; you can redistribute it and/or modify it
REM under the terms of the GNU General Public License version 2 only, as
REM published by the Free Software Foundation.
REM
REM This code is distributed in the hope that it will be useful, but WITHOUT
REM ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
REM FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
REM version 2 for more details (a copy is included in the LICENSE file that
REM accompanied this code).
REM
REM You should have received a copy of the GNU General Public License version
REM 2 along with this work; if not, write to the Free Software Foundation,
REM Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
REM
REM Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
REM or visit www.oracle.com if you need additional information or have any
REM questions.
REM
REM
java -showversion -cp ..\build\classes;..\src\share\lib\js.jar;.\sa.jar;lib\js.jar sun.jvm.hotspot.bugspot.Main
......@@ -26,14 +26,12 @@
<ul>
<li><code>java -cp classes sun.jvm.hotspot.HSDB</code>
<li><code>java -cp classes sun.jvm.hotspot.bugspot.Main</code>
</ul>
<h2>Feedback</h2>
<p>
Refactoring of package hierarchy. All user interface components should be in
the ui package. Perhaps: sun.jvm.hotspot.ui.hsdb.Main for the HSDB and
sun.jvm.hotspot.ui.bugspot.Main for BugSpot.
the ui package. Perhaps: sun.jvm.hotspot.ui.hsdb.Main for the HSDB.
<p>
The src\share\vm\agent area seems like a workspace so it should be organized like
one. In particular, I'd like to suggest the following directory layout:<br>
......@@ -47,7 +45,7 @@
</ul>
<p>
Seems like there is a lot of redundant functionality. Between the HSDB and BugSpot. Perhaps
Seems like there is a lot of redundant functionality. Perhaps
this can be consolidated with a <code>javax.swing.Actions</code> architecture.
<h2>Tasklist</h2>
......@@ -55,11 +53,7 @@
<p>
<b>Stack memory pane</b>:
It's one of the more useful JVM debugging tools in the SA. However, it
doesn't support any interaction with the text; the Memory Panel in BugSpot
was written afterward (with help from Shannon) and implements proper
selection, scrolling, and drag-and-drop, but no annotations. I'm not sure how
to integrate the annotations with the JTable that's being used for the memory
view; if you have suggestions here please let me know.
doesn't support any interaction with the text.
<p>
<b>Integrations with the NetBeans architecture (plug in).</b> See the
<a href="http://openide.netbeans.org">Netbeans Open APIs homepage</a>
......
......@@ -372,8 +372,7 @@ static bool attachToProcess(JNIEnv* env, jobject obj, jint pid) {
We are attaching to a process in 'read-only' mode. i.e., we do not want to
put breakpoints, suspend/resume threads etc. For read-only JDI and HSDB kind of
usage this should suffice. We are not intending to use this for full-fledged
ProcessControl implementation to be used with BugSpotAgent.
usage this should suffice.
Please refer to DEBUG_ATTACH_NONINVASIVE mode source comments from dbgeng.h.
In this mode, debug engine does not call DebugActiveProrcess. i.e., we are not
......
/*
* Copyright (c) 2003, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.asm.amd64;
import sun.jvm.hotspot.asm.Register;
import sun.jvm.hotspot.utilities.Assert;
public class AMD64FloatRegister extends Register {
public AMD64FloatRegister(int number) {
super(number);
}
public int getNumber() {
return number;
}
public int getNumberOfRegisters() {
return AMD64FloatRegisters.getNumRegisters();
}
public boolean isFloat() {
return true;
}
public boolean isFramePointer() {
return false;
}
public boolean isStackPointer() {
return false;
}
public boolean isValid() {
return number >= 0 && number < AMD64FloatRegisters.getNumRegisters();
}
public String toString() {
return AMD64FloatRegisters.getRegisterName(number);
}
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import sun.jvm.hotspot.oops.*;
/** Wrapper class which describes line number information for Java
class files. The line number table is converted into this
representation on demand. These objects are then sorted by line
number for fast lookup when setting breakpoints in a particular
source file. */
public class JavaLineNumberInfo {
private InstanceKlass klass;
private Method method;
private int startBCI;
private int lineNumber;
public JavaLineNumberInfo(InstanceKlass klass,
Method method,
int startBCI,
int lineNumber) {
this.klass = klass;
this.method = method;
this.startBCI = startBCI;
this.lineNumber = lineNumber;
}
public InstanceKlass getKlass() { return klass; }
public Method getMethod() { return method; }
public int getStartBCI() { return startBCI; }
public int getLineNumber() { return lineNumber; }
}
/*
* Copyright (c) 2001, 2008, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import sun.jvm.hotspot.ui.*;
/** The main class for the BugSpot debugger. */
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("BugSpot");
frame.setSize(800, 600);
BugSpot db = new BugSpot();
db.setMDIMode(true);
db.build();
frame.setJMenuBar(db.getMenuBar());
frame.getContentPane().add(db);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
GraphicsUtilities.reshapeToAspectRatio(frame,
4.0f/3.0f, 0.85f, Toolkit.getDefaultToolkit().getScreenSize());
GraphicsUtilities.centerInContainer(frame,
Toolkit.getDefaultToolkit().getScreenSize());
frame.setVisible(true);
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.cdbg.*;
/** Helper class for locating a program counter. Indicates the
confidence of the find. */
public class PCFinder {
public static final int LOW_CONFIDENCE = 1;
public static final int HIGH_CONFIDENCE = 2;
public static class Info {
private String name;
private long offset;
private int confidence;
public Info(String name, long offset, int confidence) {
this.name = name;
this.offset = offset;
this.confidence = confidence;
}
/** May be null */
public String getName() { return name; }
/** If this is -1, a symbol could not be found, and the offset
should not be shown */
public long getOffset() { return offset; }
/** PCFinder.LOW_CONFIDENCE or PCFinder.HIGH_CONFIDENCE */
public int getConfidence() { return confidence; }
}
/** Passed loadobject may be null in which case the returned Info
object has low confidence */
public static Info findPC(Address pc, LoadObject lo, CDebugger dbg) {
if (lo == null) {
return new Info(null, -1, LOW_CONFIDENCE);
}
// First try debug info
BlockSym sym = lo.debugInfoForPC(pc);
while (sym != null) {
if (sym.isFunction()) {
// Highest confidence
return new Info(sym.toString(), pc.minus(sym.getAddress()), HIGH_CONFIDENCE);
}
}
// Now try looking up symbol in loadobject
// FIXME: must add support for mapfiles on Win32 and try looking
// up there first if possible. Should we hide that behind
// LoadObject.closestSymbolToPC and have the ClosestSymbol return
// confidence? I think so. On Solaris there is no notion of a
// mapfile, and the confidence for closestSymbolToPC will be high
// instead of low.
int confidence = HIGH_CONFIDENCE;
ClosestSymbol cs = lo.closestSymbolToPC(pc);
if (cs != null) {
// FIXME: currently low confidence (only on Win32)
return new Info(cs.getName() + "()", cs.getOffset(), LOW_CONFIDENCE);
}
// Unknown location
return new Info(dbg.getNameOfFile(lo.getName()).toUpperCase() +
"! " + pc + "()", -1, HIGH_CONFIDENCE);
}
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import java.io.*;
/** Scans a .java file for the package that it is in. */
public class PackageScanner {
public PackageScanner() {
}
public String scan(String filename) {
return scan(new File(filename));
}
/** Returns the String comprising the package name of the classes in
this .java file. Returns the (non-null) empty string if any
error occurs or if the classes are in the unnamed package. */
public String scan(File file) {
BufferedReader buf = null;
String res = "";
try {
buf = new BufferedReader(new FileReader(file));
StreamTokenizer tok = new StreamTokenizer(buf);
tok.slashStarComments(true);
tok.slashSlashComments(true);
if (tok.nextToken() != StreamTokenizer.TT_WORD) {
return res;
}
if (!tok.sval.equals("package")) {
return res;
}
if (tok.nextToken() != StreamTokenizer.TT_WORD) {
return res;
}
res = tok.sval;
return res;
} catch (FileNotFoundException e) {
return res;
} catch (IOException e) {
return res;
} finally {
try {
if (buf != null) {
buf.close();
}
} catch (IOException e) {
}
}
}
public static void main(String[] args) {
if (args.length != 1) {
usage();
}
System.out.println(new PackageScanner().scan(args[0]));
}
private static void usage() {
System.err.println("Usage: java PackageScanner <.java file name>");
System.err.println("Prints package the .java file is in to stdout.");
System.exit(1);
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import sun.jvm.hotspot.debugger.*;
/** Displays registers in a window. FIXME: this will need more work to
understand and handle register windows. */
public class RegisterPanel extends JPanel {
private java.util.List/*<RegisterInfo>*/ registers;
private AbstractTableModel dataModel;
private boolean valid;
private boolean editable;
private String nullAddressString;
private ThreadProxy curThread;
private JTable table;
static class RegisterInfo {
private String name;
private Address value;
RegisterInfo(String name, Address value) {
this.name = name;
this.value = value;
}
String getName() { return name; }
Address getValue() { return value; }
}
public RegisterPanel() {
super();
registers = new ArrayList();
dataModel = new AbstractTableModel() {
public int getColumnCount() { return 2; }
public int getRowCount() { return registers.size(); }
public String getColumnName(int col) {
switch (col) {
case 0:
return "Register Name";
case 1:
return "Register Value";
default:
throw new RuntimeException("Index " + col + " out of bounds");
}
}
public Object getValueAt(int row, int col) {
RegisterInfo info = (RegisterInfo) registers.get(row);
switch (col) {
case 0:
return info.getName();
case 1:
if (valid) {
Address val = info.getValue();
if (val != null) {
return val;
} else {
return nullAddressString;
}
} else {
return "-";
}
default:
throw new RuntimeException("Index (" + col + ", " + row + ") out of bounds");
}
}
public boolean isCellEditable(int row, int col) {
if (col == 0) return false;
if (!valid) return false;
if (curThread == null) return false;
if (!curThread.canSetContext()) return false;
// FIXME: add listener to watch for register changes
// return true;
return false;
}
};
// Build user interface
setLayout(new BorderLayout());
table = new JTable(dataModel);
table.setCellSelectionEnabled(true);
table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
table.setDragEnabled(true);
JTableHeader header = table.getTableHeader();
header.setReorderingAllowed(false);
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
}
/** Updates the register panel with the register set from the
specified thread. Call this when the process has been suspended
and the current thread has been set. FIXME: this interface will
need to change to support register windows. */
public void update(ThreadProxy curThread) {
this.curThread = curThread;
ThreadContext context = curThread.getContext();
editable = curThread.canSetContext();
registers.clear();
for (int i = 0; i < context.getNumRegisters(); i++) {
String name = context.getRegisterName(i);
Address addr = context.getRegisterAsAddress(i);
if ((nullAddressString == null) && (addr != null)) {
String addrStr = addr.toString();
StringBuffer buf = new StringBuffer();
buf.append("0x");
int len = addrStr.length() - 2;
for (int j = 0; j < len; j++) {
buf.append("0");
}
nullAddressString = buf.toString();
}
registers.add(new RegisterInfo(name, addr));
}
valid = true;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
dataModel.fireTableDataChanged();
}
});
}
/** Clears the registers' values. Call this when the processs has
been resumed. */
public void clear() {
valid = false;
nullAddressString = null;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
dataModel.fireTableDataChanged();
}
});
}
public void setFont(Font font) {
super.setFont(font);
if (table != null) {
table.setFont(font);
}
}
}
/*
* Copyright (c) 2001, 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
/** This class describes a frame in a stack trace. It abstracts over
C/C++ and Java frames. */
public class StackTraceEntry {
private CFrame cFrame;
private CDebugger dbg;
private JavaVFrame javaFrame;
private String value; // What is displayed in a stack trace
// For merging C and Java stack traces.
// For more precise stack traces, should probably have a way to
// convert a CFrame to a sun.jvm.hotspot.runtime.Frame. For now,
// doing similar algorithm to jdbx (which does not have intimate
// knowledge of the VM).
private boolean isUnknownCFrame;
public StackTraceEntry(CFrame cFrame, CDebugger dbg) {
this.cFrame = cFrame;
this.dbg = dbg;
computeValue();
}
public StackTraceEntry(JavaVFrame javaFrame) {
this.javaFrame = javaFrame;
computeValue();
}
public boolean isCFrame() { return (cFrame != null); }
public boolean isJavaFrame() { return (javaFrame != null); }
public CFrame getCFrame() { return cFrame; }
public JavaVFrame getJavaFrame() { return javaFrame; }
public boolean isUnknownCFrame() { return isUnknownCFrame; }
public String toString() {
return value;
}
private void computeValue() {
isUnknownCFrame = true;
value = "<unknown>";
if (cFrame != null) {
PCFinder.Info info = PCFinder.findPC(cFrame.pc(), cFrame.loadObjectForPC(), dbg);
if (info.getName() != null) {
value = "(C) " + info.getName();
isUnknownCFrame = false;
if (info.getConfidence() == PCFinder.LOW_CONFIDENCE) {
value = value + " (?)";
}
if (info.getOffset() >= 0) {
value = value + " + 0x" + Long.toHexString(info.getOffset());
}
}
} else if (javaFrame != null) {
isUnknownCFrame = false;
Method m = javaFrame.getMethod();
value = "(J) " + m.externalNameAndSignature();
}
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.ui.*;
/** This panel contains a ListBox with all of the stack frames in a
given thread. When a given entry is selected, an event is
fired. */
public class StackTracePanel extends JPanel {
public interface Listener {
public void frameChanged(CFrame fr, JavaVFrame jfr);
}
class Model extends AbstractListModel implements ComboBoxModel {
private Object selectedItem;
public Object getElementAt(int index) {
if (trace == null) return null;
return trace.get(index);
}
public int getSize() {
if (trace == null) return 0;
return trace.size();
}
public Object getSelectedItem() {
return selectedItem;
}
public void setSelectedItem(Object item) {
selectedItem = item;
}
public void dataChanged() {
fireContentsChanged(this, 0, trace.size());
}
}
private java.util.List trace;
private Model model;
private JComboBox list;
private java.util.List listeners;
public StackTracePanel() {
super();
model = new Model();
// Build user interface
setLayout(new BorderLayout());
setBorder(GraphicsUtilities.newBorder(5));
list = new JComboBox(model);
list.setPrototypeDisplayValue("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ");
add(list, BorderLayout.CENTER);
// Add selection listener
list.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
fireFrameChanged();
}
}
});
}
/** Takes a List of StackTraceEntry objects */
public void setTrace(java.util.List trace) {
this.trace = trace;
model.dataChanged();
list.setSelectedIndex(0);
fireFrameChanged();
}
public void addListener(Listener listener) {
if (listeners == null) {
listeners = new ArrayList();
}
listeners.add(listener);
}
protected void fireFrameChanged() {
if (listeners != null) {
StackTraceEntry entry = (StackTraceEntry) trace.get(list.getSelectedIndex());
for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
((Listener) iter.next()).frameChanged(entry.getCFrame(), entry.getJavaFrame());
}
}
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.ui.*;
// NOTE: this class was not placed in sun.jvm.hotspot.ui to prevent
// mixing components designed for C and C++ debugging with the ones
// that work with the core serviceability agent functionality (which
// does not require that the CDebugger interface be implemented).
/** The ThreadListPanel is used for C and C++ debugging and can
visualize all threads in the target process. The caller passes in
a CDebugger attached to the target process and can request that
JavaThreads' associations with these underlying threads be
displayed; this option is only valid when attached to a HotSpot
JVM and when the {@link sun.jvm.hotspot.runtime.VM} has been
initialized. */
public class ThreadListPanel extends JPanel {
/** Listener which can be added to receive "Set Focus" events */
public static interface Listener {
/** ThreadProxy will always be provided; JavaThread will only be
present if displayJavaThreads was specified in the constructor
for the panel and the thread was a JavaThread. */
public void setFocus(ThreadProxy thread, JavaThread jthread);
}
static class ThreadInfo {
private ThreadProxy thread;
// Distinguish between PC == null and no top frame
private boolean gotPC;
private Address pc;
private String location;
private JavaThread javaThread;
private String javaThreadName;
public ThreadInfo(ThreadProxy thread, CDebugger dbg, JavaThread jthread) {
this.thread = thread;
this.location = "<unknown>";
CFrame fr = dbg.topFrameForThread(thread);
if (fr != null) {
gotPC = true;
pc = fr.pc();
PCFinder.Info info = PCFinder.findPC(pc, fr.loadObjectForPC(), dbg);
if (info.getName() != null) {
location = info.getName();
if (info.getConfidence() == PCFinder.LOW_CONFIDENCE) {
location = location + " (?)";
}
if (info.getOffset() < 0) {
location = location + " + 0x" + Long.toHexString(info.getOffset());
}
}
}
if (jthread != null) {
javaThread = jthread;
javaThreadName = jthread.getThreadName();
}
}
public ThreadProxy getThread() { return thread; }
public boolean hasPC() { return gotPC; }
public Address getPC() { return pc; }
public String getLocation() { return location; }
public boolean isJavaThread() { return (javaThread != null); }
public JavaThread getJavaThread() { return javaThread; }
public String getJavaThreadName() { return javaThreadName; }
}
// List<ThreadInfo>
private java.util.List threadList;
private JTable table;
private AbstractTableModel dataModel;
// List<Listener>
private java.util.List listeners;
/** Takes a CDebugger from which the thread list is queried.
displayJavaThreads must only be set to true if the debugger is
attached to a HotSpot JVM and if the VM has already been
initialized. */
public ThreadListPanel(CDebugger dbg, final boolean displayJavaThreads) {
super();
Map threadToJavaThreadMap = null;
if (displayJavaThreads) {
// Collect Java threads from virtual machine and insert them in
// table for later querying
threadToJavaThreadMap = new HashMap();
Threads threads = VM.getVM().getThreads();
for (JavaThread thr = threads.first(); thr != null; thr = thr.next()) {
threadToJavaThreadMap.put(thr.getThreadProxy(), thr);
}
}
java.util.List/*<ThreadProxy>*/ threads = dbg.getThreadList();
threadList = new ArrayList(threads.size());
for (Iterator iter = threads.iterator(); iter.hasNext(); ) {
ThreadProxy thr = (ThreadProxy) iter.next();
JavaThread jthr = null;
if (displayJavaThreads) {
jthr = (JavaThread) threadToJavaThreadMap.get(thr);
}
threadList.add(new ThreadInfo(thr, dbg, jthr));
}
// Thread ID, current PC, current symbol, Java Thread, [Java thread name]
dataModel = new AbstractTableModel() {
public int getColumnCount() { return (displayJavaThreads ? 5 : 3); }
public int getRowCount() { return threadList.size(); }
public String getColumnName(int col) {
switch (col) {
case 0:
return "Thread ID";
case 1:
return "PC";
case 2:
return "Location";
case 3:
return "Java?";
case 4:
return "Java Thread Name";
default:
throw new RuntimeException("Index " + col + " out of bounds");
}
}
public Object getValueAt(int row, int col) {
ThreadInfo info = (ThreadInfo) threadList.get(row);
switch (col) {
case 0:
return info.getThread();
case 1:
{
if (info.hasPC()) {
return info.getPC();
}
return "<no frames on stack>";
}
case 2:
return info.getLocation();
case 3:
if (info.isJavaThread()) {
return "Yes";
} else {
return "";
}
case 4:
if (info.isJavaThread()) {
return info.getJavaThreadName();
} else {
return "";
}
default:
throw new RuntimeException("Index (" + col + ", " + row + ") out of bounds");
}
}
};
// Build user interface
setLayout(new BorderLayout());
table = new JTable(dataModel);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JTableHeader header = table.getTableHeader();
header.setReorderingAllowed(false);
table.setRowSelectionAllowed(true);
table.setColumnSelectionAllowed(false);
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
if (threadList.size() > 0) {
table.setRowSelectionInterval(0, 0);
}
JButton button = new JButton("Set Focus");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int i = table.getSelectedRow();
if (i < 0) {
return;
}
ThreadInfo info = (ThreadInfo) threadList.get(i);
for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
((Listener) iter.next()).setFocus(info.getThread(), info.getJavaThread());
}
}
});
JPanel focusPanel = new JPanel();
focusPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
focusPanel.setLayout(new BoxLayout(focusPanel, BoxLayout.Y_AXIS));
focusPanel.add(Box.createGlue());
focusPanel.add(button);
focusPanel.add(Box.createGlue());
add(focusPanel, BorderLayout.EAST);
// FIXME: make listener model for the debugger so if the user
// specifies a mapfile for or path to a given DSO later we can
// update our state
}
public void addListener(Listener l) {
if (listeners == null) {
listeners = new ArrayList();
}
listeners.add(l);
}
}
/*
* Copyright (c) 2001, 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.bugspot.tree.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.ui.tree.*;
import sun.jvm.hotspot.ui.treetable.*;
/** Manages display of a set of local variables in a frame, or the
contents of the "this" pointer */
public class VariablePanel extends JPanel {
private JTreeTable treeTable;
private SimpleTreeTableModel model;
private SimpleTreeGroupNode root;
public VariablePanel() {
super();
model = new SimpleTreeTableModel();
model.setValuesEditable(false);
root = new SimpleTreeGroupNode();
model.setRoot(root);
treeTable = new JTreeTable(model);
treeTable.setRootVisible(false);
treeTable.setShowsRootHandles(true);
treeTable.setShowsIcons(false);
treeTable.setTreeEditable(false);
treeTable.getTableHeader().setReorderingAllowed(false);
treeTable.setCellSelectionEnabled(true);
treeTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
treeTable.setDragEnabled(true);
JScrollPane sp = new JScrollPane(treeTable);
sp.getViewport().setBackground(Color.white);
setLayout(new BorderLayout());
add(sp, BorderLayout.CENTER);
}
/** Clear the contents of this VariablePanel */
public void clear() {
root.removeAllChildren();
model.fireTreeStructureChanged();
}
/** Update the contents of this VariablePanel from the given CFrame */
public void update(CFrame fr) {
// Collect locals
CCollector coll = new CCollector();
fr.iterateLocals(coll);
update(coll);
}
/** Update the contents of this VariablePanel from the given JavaVFrame */
public void update(JavaVFrame jfr) {
Method m = jfr.getMethod();
if (!m.hasLocalVariableTable()) {
return;
}
int bci = jfr.getBCI();
// Get local variable table
LocalVariableTableElement[] locals = m.getLocalVariableTable();
// Get locals as StackValueCollection
StackValueCollection coll = jfr.getLocals();
root.removeAllChildren();
// See which locals are live
for (int i = 0; i < locals.length; i++) {
LocalVariableTableElement local = locals[i];
if (local.getStartBCI() <= bci && bci < local.getStartBCI() + local.getLength()) {
// Valid; add it
SimpleTreeNode node = null;
Symbol name = null;
try {
name = m.getConstants().getSymbolAt(local.getNameCPIndex());
if (name == null) {
System.err.println("Null name at slot " +
local.getNameCPIndex() +
" for local variable at slot " +
local.getSlot());
continue;
}
} catch (Exception e) {
System.err.println("Unable to fetch name at slot " +
local.getNameCPIndex() +
" for local variable at slot " +
local.getSlot());
e.printStackTrace();
continue;
}
sun.jvm.hotspot.oops.NamedFieldIdentifier f =
new sun.jvm.hotspot.oops.NamedFieldIdentifier(name.asString());
Symbol descriptor = null;
try {
descriptor = m.getConstants().getSymbolAt(local.getDescriptorCPIndex());
} catch (Exception e) {
System.err.println("Unable to fetch descriptor at slot " +
local.getDescriptorCPIndex() +
" for local variable " + f.getName() +
" at slot " + local.getSlot());
e.printStackTrace();
continue;
}
if (descriptor != null) {
switch (descriptor.getByteAt(0)) {
case 'F': {
node = new sun.jvm.hotspot.ui.tree.FloatTreeNodeAdapter(coll.floatAt(local.getSlot()), f, true);
break;
}
case 'D': {
node = new sun.jvm.hotspot.ui.tree.DoubleTreeNodeAdapter(coll.doubleAt(local.getSlot()), f, true);
break;
}
case 'C': {
node = new sun.jvm.hotspot.ui.tree.CharTreeNodeAdapter((char) coll.intAt(local.getSlot()), f, true);
break;
}
case 'B':
case 'S':
case 'I': {
node = new sun.jvm.hotspot.ui.tree.LongTreeNodeAdapter(coll.intAt(local.getSlot()), f, true);
break;
}
case 'Z': {
node = new sun.jvm.hotspot.ui.tree.BooleanTreeNodeAdapter(
((coll.intAt(local.getSlot()) != 0) ? true : false), f, true
);
break;
}
case 'J': {
node = new sun.jvm.hotspot.ui.tree.LongTreeNodeAdapter(coll.longAt(local.getSlot()), f, true);
break;
}
default: {
try {
node = new sun.jvm.hotspot.ui.tree.OopTreeNodeAdapter(
VM.getVM().getObjectHeap().newOop(coll.oopHandleAt(local.getSlot())), f, true
);
} catch (AddressException e) {
node = new sun.jvm.hotspot.ui.tree.FieldTreeNodeAdapter(f, true) {
public int getChildCount() { return 0; }
public SimpleTreeNode getChild(int i) { return null; }
public boolean isLeaf() { return false; }
public int getIndexOfChild(SimpleTreeNode child) { return 0; }
public String getValue() {
return "<Bad oop>";
}
};
}
break;
}
}
if (node != null) {
root.addChild(node);
}
}
}
}
model.fireTreeStructureChanged();
}
/** Update the contents of this VariablePanel from the given "this"
pointer of the given type */
public void update(Address thisAddr, Type type) {
// Collect fields
CCollector coll = new CCollector();
type.iterateObject(thisAddr, coll);
update(coll);
}
private void update(CCollector coll) {
root.removeAllChildren();
for (int i = 0; i < coll.getNumChildren(); i++) {
root.addChild(coll.getChild(i));
}
model.fireTreeStructureChanged();
}
static class CCollector extends DefaultObjectVisitor {
private java.util.List children;
public CCollector() {
children = new ArrayList();
}
public int getNumChildren() {
return children.size();
}
public SimpleTreeNode getChild(int i) {
return (SimpleTreeNode) children.get(i);
}
public void doBit(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, long val) {
children.add(new sun.jvm.hotspot.bugspot.tree.LongTreeNodeAdapter(val, f, true));
}
public void doInt(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, long val) {
children.add(new sun.jvm.hotspot.bugspot.tree.LongTreeNodeAdapter(val, f, true));
}
public void doEnum(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, long val, String enumName) {
children.add(new sun.jvm.hotspot.bugspot.tree.EnumTreeNodeAdapter(enumName, val, f, true));
}
public void doFloat(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, float val) {
children.add(new sun.jvm.hotspot.bugspot.tree.FloatTreeNodeAdapter(val, f, true));
}
public void doDouble(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, double val) {
children.add(new sun.jvm.hotspot.bugspot.tree.DoubleTreeNodeAdapter(val, f, true));
}
public void doPointer(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, Address val) {
children.add(new sun.jvm.hotspot.bugspot.tree.AddressTreeNodeAdapter(val, f, true));
}
public void doArray(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, Address val) {
children.add(new sun.jvm.hotspot.bugspot.tree.AddressTreeNodeAdapter(val, f, true));
}
public void doRef(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, Address val) {
children.add(new sun.jvm.hotspot.bugspot.tree.AddressTreeNodeAdapter(val, f, true));
}
public void doCompound(sun.jvm.hotspot.debugger.cdbg.FieldIdentifier f, Address val) {
children.add(new sun.jvm.hotspot.bugspot.tree.ObjectTreeNodeAdapter(val, f, true));
}
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot.tree;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
/** Encapsulates a float value in a tree handled by SimpleTreeModel */
public class AddressTreeNodeAdapter extends FieldTreeNodeAdapter {
private Address val;
public AddressTreeNodeAdapter(Address val, FieldIdentifier id) {
this(val, id, false);
}
public AddressTreeNodeAdapter(Address val, FieldIdentifier id, boolean treeTableMode) {
super(id, treeTableMode);
this.val = val;
}
public int getChildCount() {
return 0;
}
public SimpleTreeNode getChild(int index) {
return null;
}
public boolean isLeaf() {
return true;
}
public int getIndexOfChild(SimpleTreeNode child) {
return 0;
}
public String getValue() {
if (val != null) {
return val.toString();
}
return "NULL";
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot.tree;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
/** Encapsulates a double value in a tree handled by SimpleTreeModel */
public class DoubleTreeNodeAdapter extends FieldTreeNodeAdapter {
private double val;
public DoubleTreeNodeAdapter(double val, FieldIdentifier id) {
this(val, id, false);
}
public DoubleTreeNodeAdapter(double val, FieldIdentifier id, boolean treeTableMode) {
super(id, treeTableMode);
this.val = val;
}
public int getChildCount() {
return 0;
}
public SimpleTreeNode getChild(int index) {
return null;
}
public boolean isLeaf() {
return true;
}
public int getIndexOfChild(SimpleTreeNode child) {
return 0;
}
public String getValue() {
return Double.toString(val);
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot.tree;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
/** Encapsulates an enumerated value in a tree handled by SimpleTreeModel */
public class EnumTreeNodeAdapter extends FieldTreeNodeAdapter {
private long val;
private String enumName;
public EnumTreeNodeAdapter(String enumName, long val, FieldIdentifier id) {
this(enumName, val, id, false);
}
public EnumTreeNodeAdapter(String enumName, long val, FieldIdentifier id, boolean treeTableMode) {
super(id, treeTableMode);
this.enumName = enumName;
this.val = val;
}
public int getChildCount() {
return 0;
}
public SimpleTreeNode getChild(int index) {
return null;
}
public boolean isLeaf() {
return true;
}
public int getIndexOfChild(SimpleTreeNode child) {
return 0;
}
public String getValue() {
if (enumName != null) {
return enumName;
} else {
return Long.toString(val);
}
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot.tree;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
/** Abstract base class for all adapters for fields of C/C++ objects */
public abstract class FieldTreeNodeAdapter implements SimpleTreeNode {
private FieldIdentifier id;
private boolean treeTableMode;
/** The identifier may be null, i.e., for the root of the tree */
public FieldTreeNodeAdapter(FieldIdentifier id, boolean treeTableMode) {
this.id = id;
this.treeTableMode = treeTableMode;
}
public FieldIdentifier getID() {
return id;
}
/** Defaults to false in subclasses */
public boolean getTreeTableMode() {
return treeTableMode;
}
public Type getType() {
return getID().getType();
}
public String getName() {
if (getID() != null) {
return getID().toString();
}
return "";
}
public String toString() {
if (treeTableMode) {
return getName();
} else {
if (getID() != null) {
return getName() + ": " + getValue();
} else {
return getValue();
}
}
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot.tree;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
/** Encapsulates a float value in a tree handled by SimpleTreeModel */
public class FloatTreeNodeAdapter extends FieldTreeNodeAdapter {
private float val;
public FloatTreeNodeAdapter(float val, FieldIdentifier id) {
this(val, id, false);
}
public FloatTreeNodeAdapter(float val, FieldIdentifier id, boolean treeTableMode) {
super(id, treeTableMode);
this.val = val;
}
public int getChildCount() {
return 0;
}
public SimpleTreeNode getChild(int index) {
return null;
}
public boolean isLeaf() {
return true;
}
public int getIndexOfChild(SimpleTreeNode child) {
return 0;
}
public String getValue() {
return Float.toString(val);
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot.tree;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
/** Encapsulates a long value in a tree handled by SimpleTreeModel */
public class LongTreeNodeAdapter extends FieldTreeNodeAdapter {
private long val;
public LongTreeNodeAdapter(long val, FieldIdentifier id) {
this(val, id, false);
}
public LongTreeNodeAdapter(long val, FieldIdentifier id, boolean treeTableMode) {
super(id, treeTableMode);
this.val = val;
}
public int getChildCount() {
return 0;
}
public SimpleTreeNode getChild(int index) {
return null;
}
public boolean isLeaf() {
return true;
}
public int getIndexOfChild(SimpleTreeNode child) {
return 0;
}
public String getValue() {
return Long.toString(val);
}
}
/*
* Copyright (c) 2001, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.bugspot.tree;
import java.io.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.cdbg.*;
import sun.jvm.hotspot.ui.tree.SimpleTreeNode;
/** An adapter class which allows C/C++ objects to be displayed in a
tree via the SimpleTreeNode interface. */
public class ObjectTreeNodeAdapter extends FieldTreeNodeAdapter {
// Address of object
private Address addr;
/** The address may be null (for object fields of objcets which are
null). The FieldIdentifier should not be null. treeTableMode
defaults to false. */
public ObjectTreeNodeAdapter(Address addr, FieldIdentifier id) {
this(addr, id, false);
}
/** The address may be null (for object fields of objcets which are
null). The FieldIdentifier should not be null. */
public ObjectTreeNodeAdapter(Address addr, FieldIdentifier id, boolean treeTableMode) {
super(id, treeTableMode);
this.addr = addr;
}
public int getChildCount() {
if (addr == null) {
return 0;
}
Counter c = new Counter();
getType().iterateObject(addr, c);
return c.getNumFields();
}
public SimpleTreeNode getChild(int index) {
if (addr == null) {
return null;
}
Fetcher f = new Fetcher(index);
getType().iterateObject(addr, f);
return f.getChild();
}
public boolean isLeaf() {
return (addr == null);
}
public int getIndexOfChild(SimpleTreeNode child) {
FieldIdentifier id = ((FieldTreeNodeAdapter) child).getID();
Finder f = new Finder(id);
getType().iterateObject(addr, f);
return f.getIndex();
}
public String getValue() {
if (addr != null) {
return addr.toString();
}
return "NULL";
}
/** Should be used only once, then have the number of fields
fetched. */
static class Counter extends DefaultObjectVisitor {
private int numFields;
public int getNumFields() {
return numFields;
}
public void doBit(FieldIdentifier f, long val) { ++numFields; }
public void doInt(FieldIdentifier f, long val) { ++numFields; }
public void doEnum(FieldIdentifier f, long val, String enumName) { ++numFields; }
public void doFloat(FieldIdentifier f, float val) { ++numFields; }
public void doDouble(FieldIdentifier f, double val) { ++numFields; }
public void doPointer(FieldIdentifier f, Address val) { ++numFields; }
public void doArray(FieldIdentifier f, Address val) { ++numFields; }
public void doRef(FieldIdentifier f, Address val) { ++numFields; }
public void doCompound(FieldIdentifier f, Address addr) { ++numFields; }
}
/** Creates a new SimpleTreeNode for the given field. */
class Fetcher extends DefaultObjectVisitor {
private int index;
private int curField;
private SimpleTreeNode child;
public Fetcher(int index) {
this.index = index;
}
public SimpleTreeNode getChild() {
return child;
}
public void doBit(FieldIdentifier f, long val) {
if (curField == index) {
child = new LongTreeNodeAdapter(val, f, getTreeTableMode());
}
++curField;
}
public void doInt(FieldIdentifier f, long val) {
if (curField == index) {
child = new LongTreeNodeAdapter(val, f, getTreeTableMode());
}
++curField;
}
public void doEnum(FieldIdentifier f, long val, String enumName) {
if (curField == index) {
child = new EnumTreeNodeAdapter(enumName, val, f, getTreeTableMode());
}
++curField;
}
public void doFloat(FieldIdentifier f, float val) {
if (curField == index) {
child = new FloatTreeNodeAdapter(val, f, getTreeTableMode());
}
++curField;
}
public void doDouble(FieldIdentifier f, double val) {
if (curField == index) {
child = new DoubleTreeNodeAdapter(val, f, getTreeTableMode());
}
++curField;
}
public void doPointer(FieldIdentifier f, Address val) {
if (curField == index) {
child = new AddressTreeNodeAdapter(val, f, getTreeTableMode());
}
++curField;
}
public void doArray(FieldIdentifier f, Address val) {
if (curField == index) {
child = new AddressTreeNodeAdapter(val, f, getTreeTableMode());
}
++curField;
}
public void doRef(FieldIdentifier f, Address val) {
if (curField == index) {
child = new AddressTreeNodeAdapter(val, f, getTreeTableMode());
}
++curField;
}
public void doCompound(FieldIdentifier f, Address val) {
if (curField == index) {
child = new ObjectTreeNodeAdapter(val, f, getTreeTableMode());
}
++curField;
}
}
/** Finds the index of the given FieldIdentifier. */
static class Finder extends DefaultObjectVisitor {
private FieldIdentifier id;
private int curField;
private int index = -1;
public Finder(FieldIdentifier id) {
this.id = id;
}
/** Returns -1 if not found */
public int getIndex() {
return index;
}
public void doBit(FieldIdentifier f, long val) { if (f.equals(id)) { index = curField; } ++curField; }
public void doInt(FieldIdentifier f, long val) { if (f.equals(id)) { index = curField; } ++curField; }
public void doEnum(FieldIdentifier f, long val,
String enumName) { if (f.equals(id)) { index = curField; } ++curField; }
public void doFloat(FieldIdentifier f, float val) { if (f.equals(id)) { index = curField; } ++curField; }
public void doDouble(FieldIdentifier f, double val) { if (f.equals(id)) { index = curField; } ++curField; }
public void doPointer(FieldIdentifier f, Address val) { if (f.equals(id)) { index = curField; } ++curField; }
public void doArray(FieldIdentifier f, Address val) { if (f.equals(id)) { index = curField; } ++curField; }
public void doRef(FieldIdentifier f, Address val) { if (f.equals(id)) { index = curField; } ++curField; }
public void doCompound(FieldIdentifier f,
Address val) { if (f.equals(id)) { index = curField; } ++curField; }
}
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.livejvm;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
public class BreakpointEvent extends Event {
private Oop thread;
private Oop clazz;
private JNIid method;
private int location;
public BreakpointEvent(Oop thread,
Oop clazz,
JNIid method,
int location) {
super(Event.Type.BREAKPOINT);
this.thread = thread;
this.clazz = clazz;
this.method = method;
this.location = location;
}
public Oop thread() { return thread; }
public Oop clazz() { return clazz; }
public JNIid methodID() { return method; }
public int location() { return location; }
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.livejvm;
import sun.jvm.hotspot.debugger.*;
class CIntegerAccessor {
private Address addr;
private long numBytes;
private boolean isUnsigned;
CIntegerAccessor(Address addr, long numBytes, boolean isUnsigned) {
this.addr = addr;
this.numBytes = numBytes;
this.isUnsigned = isUnsigned;
}
long getValue() {
return addr.getCIntegerAt(0, numBytes, isUnsigned);
}
void setValue(long value) {
addr.setCIntegerAt(0, numBytes, value);
}
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.livejvm;
import java.io.UnsupportedEncodingException;
import sun.jvm.hotspot.debugger.*;
class CStringAccessor {
private Address addr;
private int bufLen;
CStringAccessor(Address addr, int bufLen) {
this.addr = addr;
this.bufLen = bufLen;
}
String getValue() throws DebuggerException {
int len = 0;
while ((addr.getCIntegerAt(len, 1, true) != 0) && (len < bufLen)) {
++len;
}
byte[] res = new byte[len];
for (int i = 0; i < len; i++) {
res[i] = (byte) addr.getCIntegerAt(i, 1, true);
}
try {
return new String(res, "US-ASCII");
} catch (UnsupportedEncodingException e) {
throw new DebuggerException("Unable to use US-ASCII encoding");
}
}
void setValue(String value) throws DebuggerException {
try {
byte[] data = value.getBytes("US-ASCII");
if (data.length >= bufLen) {
throw new DebuggerException("String too long");
}
for (int i = 0; i < data.length; i++) {
addr.setCIntegerAt(i, 1, data[i]);
}
addr.setCIntegerAt(data.length, 1, 0);
} catch (UnsupportedEncodingException e) {
throw new DebuggerException("Unable to use US-ASCII encoding");
}
}
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.livejvm;
public class Event {
public static class Type {
private Type() {}
public static final Type BREAKPOINT = new Type();
public static final Type EXCEPTION = new Type();
}
private Type type;
public Event(Type type) {
this.type = type;
}
public Type getType() { return type; }
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.livejvm;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
public class ExceptionEvent extends Event {
private Oop thread;
private Oop clazz;
private JNIid method;
private int location;
private Oop exception;
private Oop catchClass;
private JNIid catchMethod;
private int catchLocation;
public ExceptionEvent(Oop thread,
Oop clazz,
JNIid method,
int location,
Oop exception,
Oop catchClass,
JNIid catchMethod,
int catchLocation) {
super(Event.Type.EXCEPTION);
this.thread = thread;
this.clazz = clazz;
this.method = method;
this.location = location;
this.exception = exception;
this.catchClass = catchClass;
this.catchMethod = catchMethod;
this.catchLocation = catchLocation;
}
public Oop thread() { return thread; }
public Oop clazz() { return clazz; }
public JNIid methodID() { return method; }
public int location() { return location; }
public Oop exception() { return exception; }
public Oop catchClass() { return catchClass; }
public JNIid catchMethodID() { return catchMethod; }
public int catchLocation() { return catchLocation; }
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot.livejvm;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.utilities.*;
class JNIHandleAccessor {
private Address addr;
private ObjectHeap heap;
JNIHandleAccessor(Address addr, ObjectHeap heap) {
this.addr = addr;
this.heap = heap;
}
Oop getValue() {
// Accessing the contents of the JNIHandle is a double dereference
Address handle = addr.getAddressAt(0);
if (handle == null) return null;
return heap.newOop(handle.getOopHandleAt(0));
}
void setValue(Oop value) {
Address handle = addr.getAddressAt(0);
if (Assert.ASSERTS_ENABLED) {
Assert.that(handle != null, "Must have valid global JNI handle for setting");
}
handle.setOopHandleAt(0, value.getHandle());
}
}
......@@ -58,10 +58,6 @@ public class PMap extends Tool {
}
}
protected boolean requiresVM() {
return false;
}
public static void main(String[] args) throws Exception {
PMap t = new PMap();
t.start(args);
......
......@@ -50,29 +50,23 @@ public class PStack extends Tool {
public void run(PrintStream out) {
Debugger dbg = getAgent().getDebugger();
run(out, dbg, getAgent().isJavaMode());
run(out, dbg);
}
public void run(PrintStream out, Debugger dbg) {
run(out, dbg, true);
}
private void run(PrintStream out, Debugger dbg, final boolean isJava) {
CDebugger cdbg = dbg.getCDebugger();
if (cdbg != null) {
ConcurrentLocksPrinter concLocksPrinter = null;
if (isJava) {
// compute and cache java Vframes.
initJFrameCache();
if (concurrentLocks) {
concLocksPrinter = new ConcurrentLocksPrinter();
}
// print Java level deadlocks
try {
DeadlockDetector.print(out);
} catch (Exception exp) {
out.println("can't print deadlock information: " + exp.getMessage());
}
// compute and cache java Vframes.
initJFrameCache();
if (concurrentLocks) {
concLocksPrinter = new ConcurrentLocksPrinter();
}
// print Java level deadlocks
try {
DeadlockDetector.print(out);
} catch (Exception exp) {
out.println("can't print deadlock information: " + exp.getMessage());
}
List l = cdbg.getThreadList();
......@@ -100,63 +94,59 @@ public class PStack extends Tool {
}
out.println();
} else {
if (isJava) {
// look for one or more java frames
String[] names = null;
// check interpreter frame
Interpreter interp = VM.getVM().getInterpreter();
if (interp.contains(pc)) {
names = getJavaNames(th, f.localVariableBase());
// print codelet name if we can't determine method
if (names == null || names.length == 0) {
out.print("<interpreter> ");
InterpreterCodelet ic = interp.getCodeletContaining(pc);
if (ic != null) {
String desc = ic.getDescription();
if (desc != null) out.print(desc);
}
out.println();
}
} else {
// look for known code blobs
CodeCache c = VM.getVM().getCodeCache();
if (c.contains(pc)) {
CodeBlob cb = c.findBlobUnsafe(pc);
if (cb.isNMethod()) {
names = getJavaNames(th, f.localVariableBase());
// just print compiled code, if can't determine method
if (names == null || names.length == 0) {
out.println("<Unknown compiled code>");
}
} else if (cb.isBufferBlob()) {
out.println("<StubRoutines>");
} else if (cb.isRuntimeStub()) {
out.println("<RuntimeStub>");
} else if (cb.isDeoptimizationStub()) {
out.println("<DeoptimizationStub>");
} else if (cb.isUncommonTrapStub()) {
out.println("<UncommonTrap>");
} else if (cb.isExceptionStub()) {
out.println("<ExceptionStub>");
} else if (cb.isSafepointStub()) {
out.println("<SafepointStub>");
} else {
out.println("<Unknown code blob>");
}
} else {
printUnknown(out);
}
}
// print java frames, if any
if (names != null && names.length != 0) {
// print java frame(s)
for (int i = 0; i < names.length; i++) {
out.println(names[i]);
}
}
} else {
printUnknown(out);
}
// look for one or more java frames
String[] names = null;
// check interpreter frame
Interpreter interp = VM.getVM().getInterpreter();
if (interp.contains(pc)) {
names = getJavaNames(th, f.localVariableBase());
// print codelet name if we can't determine method
if (names == null || names.length == 0) {
out.print("<interpreter> ");
InterpreterCodelet ic = interp.getCodeletContaining(pc);
if (ic != null) {
String desc = ic.getDescription();
if (desc != null) out.print(desc);
}
out.println();
}
} else {
// look for known code blobs
CodeCache c = VM.getVM().getCodeCache();
if (c.contains(pc)) {
CodeBlob cb = c.findBlobUnsafe(pc);
if (cb.isNMethod()) {
names = getJavaNames(th, f.localVariableBase());
// just print compiled code, if can't determine method
if (names == null || names.length == 0) {
out.println("<Unknown compiled code>");
}
} else if (cb.isBufferBlob()) {
out.println("<StubRoutines>");
} else if (cb.isRuntimeStub()) {
out.println("<RuntimeStub>");
} else if (cb.isDeoptimizationStub()) {
out.println("<DeoptimizationStub>");
} else if (cb.isUncommonTrapStub()) {
out.println("<UncommonTrap>");
} else if (cb.isExceptionStub()) {
out.println("<ExceptionStub>");
} else if (cb.isSafepointStub()) {
out.println("<SafepointStub>");
} else {
out.println("<Unknown code blob>");
}
} else {
printUnknown(out);
}
}
// print java frames, if any
if (names != null && names.length != 0) {
// print java frame(s)
for (int i = 0; i < names.length; i++) {
out.println(names[i]);
}
}
}
f = f.sender(th);
}
......@@ -164,7 +154,7 @@ public class PStack extends Tool {
exp.printStackTrace();
// continue, may be we can do a better job for other threads
}
if (isJava && concurrentLocks) {
if (concurrentLocks) {
JavaThread jthread = (JavaThread) proxyToThread.get(th);
if (jthread != null) {
concLocksPrinter.print(jthread, out);
......@@ -180,10 +170,6 @@ public class PStack extends Tool {
}
}
protected boolean requiresVM() {
return false;
}
public static void main(String[] args) throws Exception {
PStack t = new PStack();
t.start(args);
......
......@@ -27,7 +27,6 @@ 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.*;
......@@ -35,7 +34,7 @@ import sun.jvm.hotspot.debugger.*;
// override run & code main as shown below.
public abstract class Tool implements Runnable {
private BugSpotAgent agent;
private HotSpotAgent agent;
private int debugeeType;
// debugeeType is one of constants below
......@@ -51,12 +50,7 @@ public abstract class Tool implements Runnable {
return true;
}
// whether this tool requires debuggee to be java process or core?
protected boolean requiresVM() {
return true;
}
protected void setAgent(BugSpotAgent a) {
protected void setAgent(HotSpotAgent a) {
agent = a;
}
......@@ -64,7 +58,7 @@ public abstract class Tool implements Runnable {
debugeeType = dt;
}
protected BugSpotAgent getAgent() {
protected HotSpotAgent getAgent() {
return agent;
}
......@@ -155,7 +149,7 @@ public abstract class Tool implements Runnable {
usage();
}
agent = new BugSpotAgent();
agent = new HotSpotAgent();
try {
switch (debugeeType) {
case DEBUGEE_PID:
......@@ -198,33 +192,24 @@ public abstract class Tool implements Runnable {
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();
}
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();
}
}
......@@ -50,7 +50,7 @@ import com.sun.java.swing.action.*;
/**
* This base class encapsulates many of the events that are fired from
* the various panels in this directory so they can easily be plugged
* in to different containing frameworks (HSDB, BugSpot).
* in to different containing frameworks (HSDB).
*/
public class SAPanel extends JPanel {
protected List listeners = new ArrayList();
......
......@@ -31,7 +31,6 @@ var sapkg = new Object();
sapkg.hotspot = Packages.sun.jvm.hotspot;
sapkg.asm = sapkg.hotspot.asm;
sapkg.bugspot = sapkg.hotspot.bugspot;
sapkg.c1 = sapkg.hotspot.c1;
sapkg.code = sapkg.hotspot.code;
sapkg.compiler = sapkg.hotspot.compiler;
......@@ -40,7 +39,6 @@ sapkg.compiler = sapkg.hotspot.compiler;
// sapkg.debugger = sapkg.hotspot.debugger;
sapkg.interpreter = sapkg.hotspot.interpreter;
sapkg.livejvm = sapkg.hotspot.livejvm;
sapkg.jdi = sapkg.hotspot.jdi;
sapkg.memory = sapkg.hotspot.memory;
sapkg.oops = sapkg.hotspot.oops;
......
此差异已折叠。
此差异已折叠。
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "sa"=.\sa.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################
/*
* Copyright (c) 2002, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#include "jni.h"
extern "C" {
JNIEXPORT jint JNICALL
JVM_OnLoad(JavaVM *vm, char *options, void *reserved);
}
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册