8156133: FindCrashesAction in HSDB does not work except Solaris platform
Reviewed-by: dsamersoff
This commit is contained in:
parent
c052a98d6f
commit
05e186869f
@ -39,6 +39,7 @@ import javax.swing.table.*;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.runtime.*;
|
||||
import sun.jvm.hotspot.types.*;
|
||||
|
||||
import sun.jvm.hotspot.ui.action.*;
|
||||
|
||||
@ -55,9 +56,19 @@ public class JavaThreadsPanel extends SAPanel implements ActionListener {
|
||||
private JavaThreadsTableModel dataModel;
|
||||
private StatusBar statusBar;
|
||||
private JTable threadTable;
|
||||
private java.util.List cachedThreads = new ArrayList();
|
||||
private java.util.List<CachedThread> cachedThreads = new ArrayList();
|
||||
private static AddressField crashThread;
|
||||
|
||||
|
||||
static {
|
||||
VM.registerVMInitializedObserver(
|
||||
(o, a) -> initialize(VM.getVM().getTypeDataBase()));
|
||||
}
|
||||
|
||||
private static void initialize(TypeDataBase db) {
|
||||
crashThread = db.lookupType("VMError").getAddressField("_thread");
|
||||
}
|
||||
|
||||
/** Constructor assumes the threads panel is created while the VM is
|
||||
suspended. Subsequent resume and suspend operations of the VM
|
||||
will cause the threads panel to clear and fill itself back in,
|
||||
@ -437,21 +448,14 @@ public class JavaThreadsPanel extends SAPanel implements ActionListener {
|
||||
* @return a flag which indicates if crashes were encountered.
|
||||
*/
|
||||
private boolean fireShowThreadCrashes() {
|
||||
boolean crash = false;
|
||||
for (Iterator iter = cachedThreads.iterator(); iter.hasNext(); ) {
|
||||
JavaThread t = (JavaThread) ((CachedThread) iter.next()).getThread();
|
||||
sun.jvm.hotspot.runtime.Frame tmpFrame = t.getCurrentFrameGuess();
|
||||
RegisterMap tmpMap = t.newRegisterMap(false);
|
||||
while ((tmpFrame != null) && (!tmpFrame.isFirstFrame())) {
|
||||
if (tmpFrame.isSignalHandlerFrameDbg()) {
|
||||
showThreadStackMemory(t);
|
||||
crash = true;
|
||||
break;
|
||||
}
|
||||
tmpFrame = tmpFrame.sender(tmpMap);
|
||||
}
|
||||
}
|
||||
return crash;
|
||||
Optional<JavaThread> crashed =
|
||||
cachedThreads.stream()
|
||||
.map(t -> t.getThread())
|
||||
.filter(t -> t.getAddress().equals(
|
||||
crashThread.getValue()))
|
||||
.findAny();
|
||||
crashed.ifPresent(this::showThreadStackMemory);
|
||||
return crashed.isPresent();
|
||||
}
|
||||
|
||||
private void cache() {
|
||||
|
@ -1365,6 +1365,12 @@ typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
|
||||
static_field(java_lang_Class, _oop_size_offset, int) \
|
||||
static_field(java_lang_Class, _static_oop_field_count_offset, int) \
|
||||
\
|
||||
/******************/ \
|
||||
/* VMError fields */ \
|
||||
/******************/ \
|
||||
\
|
||||
static_field(VMError, _thread, Thread*) \
|
||||
\
|
||||
/************************/ \
|
||||
/* Miscellaneous fields */ \
|
||||
/************************/ \
|
||||
@ -2215,6 +2221,12 @@ typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
|
||||
\
|
||||
declare_toplevel_type(Arguments) \
|
||||
\
|
||||
/***********/ \
|
||||
/* VMError */ \
|
||||
/***********/ \
|
||||
\
|
||||
declare_toplevel_type(VMError) \
|
||||
\
|
||||
/***************/ \
|
||||
/* Other types */ \
|
||||
/***************/ \
|
||||
|
@ -33,6 +33,7 @@ class VM_ReportJavaOutOfMemory;
|
||||
class VMError : public AllStatic {
|
||||
friend class VM_ReportJavaOutOfMemory;
|
||||
friend class Decoder;
|
||||
friend class VMStructs;
|
||||
|
||||
static int _id; // Solaris/Linux signals: 0 - SIGRTMAX
|
||||
// Windows exceptions: 0xCxxxxxxx system errors
|
||||
|
Loading…
x
Reference in New Issue
Block a user