提交 813c300a 编写于 作者: T twisti

6944503: Improved Zero crash dump

Summary: With Zero on a GC crash the stack was dumped differently to other crashes.
Reviewed-by: twisti
Contributed-by: NGary Benson <gbenson@redhat.com>
上级 b4838e8b
/* /*
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2003-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -212,6 +212,51 @@ char* VMError::error_string(char* buf, int buflen) { ...@@ -212,6 +212,51 @@ char* VMError::error_string(char* buf, int buflen) {
return buf; return buf;
} }
void VMError::print_stack_trace(outputStream* st, JavaThread* jt,
char* buf, int buflen, bool verbose) {
#ifdef ZERO
if (jt->zero_stack()->sp() && jt->top_zero_frame()) {
// StackFrameStream uses the frame anchor, which may not have
// been set up. This can be done at any time in Zero, however,
// so if it hasn't been set up then we just set it up now and
// clear it again when we're done.
bool has_last_Java_frame = jt->has_last_Java_frame();
if (!has_last_Java_frame)
jt->set_last_Java_frame();
st->print("Java frames:");
// If the top frame is a Shark frame and the frame anchor isn't
// set up then it's possible that the information in the frame
// is garbage: it could be from a previous decache, or it could
// simply have never been written. So we print a warning...
StackFrameStream sfs(jt);
if (!has_last_Java_frame && !sfs.is_done()) {
if (sfs.current()->zeroframe()->is_shark_frame()) {
st->print(" (TOP FRAME MAY BE JUNK)");
}
}
st->cr();
// Print the frames
for(int i = 0; !sfs.is_done(); sfs.next(), i++) {
sfs.current()->zero_print_on_error(i, st, buf, buflen);
st->cr();
}
// Reset the frame anchor if necessary
if (!has_last_Java_frame)
jt->reset_last_Java_frame();
}
#else
if (jt->has_last_Java_frame()) {
st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
sfs.current()->print_on_error(st, buf, buflen, verbose);
st->cr();
}
}
#endif // ZERO
}
// This is the main function to report a fatal error. Only one thread can // This is the main function to report a fatal error. Only one thread can
// call this function, so we don't need to worry about MT-safety. But it's // call this function, so we don't need to worry about MT-safety. But it's
...@@ -457,49 +502,7 @@ void VMError::report(outputStream* st) { ...@@ -457,49 +502,7 @@ void VMError::report(outputStream* st) {
STEP(130, "(printing Java stack)" ) STEP(130, "(printing Java stack)" )
if (_verbose && _thread && _thread->is_Java_thread()) { if (_verbose && _thread && _thread->is_Java_thread()) {
JavaThread* jt = (JavaThread*)_thread; print_stack_trace(st, (JavaThread*)_thread, buf, sizeof(buf));
#ifdef ZERO
if (jt->zero_stack()->sp() && jt->top_zero_frame()) {
// StackFrameStream uses the frame anchor, which may not have
// been set up. This can be done at any time in Zero, however,
// so if it hasn't been set up then we just set it up now and
// clear it again when we're done.
bool has_last_Java_frame = jt->has_last_Java_frame();
if (!has_last_Java_frame)
jt->set_last_Java_frame();
st->print("Java frames:");
// If the top frame is a Shark frame and the frame anchor isn't
// set up then it's possible that the information in the frame
// is garbage: it could be from a previous decache, or it could
// simply have never been written. So we print a warning...
StackFrameStream sfs(jt);
if (!has_last_Java_frame && !sfs.is_done()) {
if (sfs.current()->zeroframe()->is_shark_frame()) {
st->print(" (TOP FRAME MAY BE JUNK)");
}
}
st->cr();
// Print the frames
for(int i = 0; !sfs.is_done(); sfs.next(), i++) {
sfs.current()->zero_print_on_error(i, st, buf, sizeof(buf));
st->cr();
}
// Reset the frame anchor if necessary
if (!has_last_Java_frame)
jt->reset_last_Java_frame();
}
#else
if (jt->has_last_Java_frame()) {
st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
sfs.current()->print_on_error(st, buf, sizeof(buf));
st->cr();
}
}
#endif // ZERO
} }
STEP(135, "(printing target Java thread stack)" ) STEP(135, "(printing target Java thread stack)" )
...@@ -509,13 +512,7 @@ void VMError::report(outputStream* st) { ...@@ -509,13 +512,7 @@ void VMError::report(outputStream* st) {
JavaThread* jt = ((NamedThread *)_thread)->processed_thread(); JavaThread* jt = ((NamedThread *)_thread)->processed_thread();
if (jt != NULL) { if (jt != NULL) {
st->print_cr("JavaThread " PTR_FORMAT " (nid = " UINTX_FORMAT ") was being processed", jt, jt->osthread()->thread_id()); st->print_cr("JavaThread " PTR_FORMAT " (nid = " UINTX_FORMAT ") was being processed", jt, jt->osthread()->thread_id());
if (jt->has_last_Java_frame()) { print_stack_trace(st, jt, buf, sizeof(buf), true);
st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
sfs.current()->print_on_error(st, buf, sizeof(buf), true);
st->cr();
}
}
} }
} }
......
/* /*
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2003-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -70,6 +70,10 @@ class VMError : public StackObj { ...@@ -70,6 +70,10 @@ class VMError : public StackObj {
// generate an error report // generate an error report
void report(outputStream* st); void report(outputStream* st);
// generate a stack trace
static void print_stack_trace(outputStream* st, JavaThread* jt,
char* buf, int buflen, bool verbose = false);
// accessor // accessor
const char* message() { return _message; } const char* message() { return _message; }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册