< prev index next >

src/hotspot/share/runtime/os.cpp

Print this page
rev 51740 : 8210754: print_location is not reliable enough (printing register info)
Reviewed-by:

*** 64,73 **** --- 64,74 ---- #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,1120 **** // Handle NULL first, so later checks don't need to protect against it. if (addr == NULL) { st->print_cr("0x0 is NULL"); return; } 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); return; } 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)); } else { ! st->print_cr(INTPTR_FORMAT " is pointing into object: " INTPTR_FORMAT, p2i(addr), p2i(p)); } ! oop(p)->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)); return; } } bool accessible = is_readable_pointer(addr); 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; } --- 1019,1070 ---- // 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) { ! vmErrorHelper::dump_code_blob(addr, b, st, verbose); return; } + // Check if addr points into Java heap. if (Universe::heap()->is_in(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(INTPTR_FORMAT " is pointing into object: " , p2i(addr)); } ! 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)); ! 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,1138 **** --- 1079,1089 ---- 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 "
*** 1169,1178 **** --- 1120,1143 ---- 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 >