< prev index next >
src/hotspot/share/runtime/os.cpp
Print this page
rev 51897 : 8210754: print_location is not reliable enough (printing register info)
Reviewed-by:
@@ -64,10 +64,11 @@
#include "services/nmtCommon.hpp"
#include "services/threadService.hpp"
#include "utilities/align.hpp"
#include "utilities/defaultStream.hpp"
#include "utilities/events.hpp"
+#include "utilities/vmErrorHelper.hpp"
# include <signal.h>
# include <errno.h>
OSThread* os::_starting_thread = NULL;
@@ -1018,103 +1019,52 @@
// Handle NULL first, so later checks don't need to protect against it.
if (addr == NULL) {
st->print_cr("0x0 is NULL");
return;
}
+
+ // Check if addr points into a code blob.
CodeBlob* b = CodeCache::find_blob_unsafe(addr);
if (b != NULL) {
- if (b->is_buffer_blob()) {
- // the interpreter is generated into a buffer blob
- InterpreterCodelet* i = Interpreter::codelet_containing(addr);
- if (i != NULL) {
- st->print_cr(INTPTR_FORMAT " is at code_begin+%d in an Interpreter codelet", p2i(addr), (int)(addr - i->code_begin()));
- i->print_on(st);
- return;
- }
- if (Interpreter::contains(addr)) {
- st->print_cr(INTPTR_FORMAT " is pointing into interpreter code"
- " (not bytecode specific)", p2i(addr));
- return;
- }
- //
- if (AdapterHandlerLibrary::contains(b)) {
- st->print_cr(INTPTR_FORMAT " is at code_begin+%d in an AdapterHandler", p2i(addr), (int)(addr - b->code_begin()));
- AdapterHandlerLibrary::print_handler_on(st, b);
- }
- // the stubroutines are generated into a buffer blob
- StubCodeDesc* d = StubCodeDesc::desc_for(addr);
- if (d != NULL) {
- st->print_cr(INTPTR_FORMAT " is at begin+%d in a stub", p2i(addr), (int)(addr - d->begin()));
- d->print_on(st);
- st->cr();
- return;
- }
- if (StubRoutines::contains(addr)) {
- st->print_cr(INTPTR_FORMAT " is pointing to an (unnamed) stub routine", p2i(addr));
- return;
- }
- // the InlineCacheBuffer is using stubs generated into a buffer blob
- if (InlineCacheBuffer::contains(addr)) {
- st->print_cr(INTPTR_FORMAT " is pointing into InlineCacheBuffer", p2i(addr));
- return;
- }
- VtableStub* v = VtableStubs::stub_containing(addr);
- if (v != NULL) {
- st->print_cr(INTPTR_FORMAT " is at entry_point+%d in a vtable stub", p2i(addr), (int)(addr - v->entry_point()));
- v->print_on(st);
- st->cr();
- return;
- }
- }
- nmethod* nm = b->as_nmethod_or_null();
- if (nm != NULL) {
- ResourceMark rm;
- st->print(INTPTR_FORMAT " is at entry_point+%d in (nmethod*)" INTPTR_FORMAT,
- p2i(addr), (int)(addr - nm->entry_point()), p2i(nm));
- if (verbose) {
- st->print(" for ");
- nm->method()->print_value_on(st);
- }
- st->cr();
- nm->print_nmethod(verbose);
- return;
- }
- st->print_cr(INTPTR_FORMAT " is at code_begin+%d in ", p2i(addr), (int)(addr - b->code_begin()));
- b->print_on(st);
+ vmErrorHelper::dump_code_blob(addr, b, st, verbose);
return;
}
+ // Check if addr points into Java heap.
if (Universe::heap()->is_in(addr)) {
- HeapWord* p = Universe::heap()->block_start(addr);
- bool print = false;
- // If we couldn't find it it just may mean that heap wasn't parsable
- // See if we were just given an oop directly
- if (p != NULL && Universe::heap()->block_is_obj(p)) {
- print = true;
- } else if (p == NULL && oopDesc::is_oop(oop(addr))) {
- p = (HeapWord*) addr;
- print = true;
- }
- if (print) {
- if (p == (HeapWord*) addr) {
- st->print_cr(INTPTR_FORMAT " is an oop", p2i(addr));
+ oop o = vmErrorHelper::oop_or_null(addr);
+ if (o != NULL) {
+ if ((HeapWord*)o == (HeapWord*)addr) {
+ st->print(INTPTR_FORMAT " is an oop: ", p2i(addr));
} else {
- st->print_cr(INTPTR_FORMAT " is pointing into object: " INTPTR_FORMAT, p2i(addr), p2i(p));
+ st->print(INTPTR_FORMAT " is pointing into object: " , p2i(addr));
}
- oop(p)->print_on(st);
+ o->print_on(st);
return;
}
- } else {
- if (Universe::heap()->is_in_reserved(addr)) {
- st->print_cr(INTPTR_FORMAT " is an unallocated location "
- "in the heap", p2i(addr));
+ } else if (Universe::heap()->is_in_reserved(addr)) {
+ st->print_cr(INTPTR_FORMAT " is an unallocated location in the heap", p2i(addr));
+ return;
+ }
+
+ // Compressed oop needs to be decoded first.
+#ifdef _LP64
+ if (UseCompressedOops && ((uintptr_t)addr &~ (uintptr_t)max_juint) == 0) {
+ narrowOop narrow_oop = (narrowOop)(uintptr_t)addr;
+ oop o = vmErrorHelper::decode_oop_raw(narrow_oop);
+
+ if (vmErrorHelper::is_valid_oop(o)) {
+ st->print(UINT32_FORMAT " is a compressed pointer to object: ", narrow_oop);
+ o->print_on(st);
return;
}
}
+#endif
bool accessible = is_readable_pointer(addr);
+ // Check if addr is a JNI handle.
if (align_down((intptr_t)addr, sizeof(intptr_t)) != 0 && accessible) {
if (JNIHandles::is_global_handle((jobject) addr)) {
st->print_cr(INTPTR_FORMAT " is a global jni handle", p2i(addr));
return;
}
@@ -1129,10 +1079,11 @@
return;
}
#endif
}
+ // Check if addr belongs to a Java thread.
for (JavaThreadIteratorWithHandle jtiwh; JavaThread *thread = jtiwh.next(); ) {
// Check for privilege stack
if (thread->privileged_stack_top() != NULL &&
thread->privileged_stack_top()->contains(addr)) {
st->print_cr(INTPTR_FORMAT " is pointing into the privilege stack "
@@ -1159,20 +1110,37 @@
}
}
// Check if in metaspace and print types that have vptrs (only method now)
if (Metaspace::contains(addr)) {
- if (Method::has_method_vptr((const void*)addr)) {
+ if (vmErrorHelper::is_valid_klass((Klass*)addr)) {
+ st->print_cr(INTPTR_FORMAT " is a pointer to class: ", p2i(addr));
+ ((Klass*)addr)->print_on(st);
+ } else if (Method::is_valid_method((const Method*)addr)) {
((Method*)addr)->print_value_on(st);
st->cr();
} else {
// Use addr->print() from the debugger instead (not here)
st->print_cr(INTPTR_FORMAT " is pointing into metadata", p2i(addr));
}
return;
}
+ // Compressed klass needs to be decoded first.
+#ifdef _LP64
+ if (UseCompressedClassPointers && ((uintptr_t)addr &~ (uintptr_t)max_juint) == 0) {
+ narrowKlass narrow_klass = (narrowKlass)(uintptr_t)addr;
+ Klass* k = vmErrorHelper::decode_klass_raw(narrow_klass);
+
+ if (vmErrorHelper::is_valid_klass(k)) {
+ st->print_cr(UINT32_FORMAT " is a compressed pointer to class: " INTPTR_FORMAT, narrow_klass, p2i((HeapWord*)k));
+ k->print_on(st);
+ return;
+ }
+ }
+#endif
+
// Try an OS specific find
if (os::find(addr, st)) {
return;
}
< prev index next >