8156133: FindCrashesAction in HSDB does not work except Solaris platform

Reviewed-by: dsamersoff
This commit is contained in:
Yasumasa Suenaga 2016-05-06 09:13:31 +09:00
parent c052a98d6f
commit 05e186869f
3 changed files with 33 additions and 16 deletions

View File

@ -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() {

View File

@ -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 */ \
/***************/ \

View File

@ -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