void CodeBlobCollector::collect() { assert_locked_or_safepoint(CodeCache_lock); assert(_global_code_blobs == NULL, "checking"); // create the global list _global_code_blobs = new (ResourceObj::C_HEAP) GrowableArray<JvmtiCodeBlobDesc*>(50,true); // iterate over the stub code descriptors and put them in the list first. int index = 0; StubCodeDesc* desc; while ((desc = StubCodeDesc::desc_for_index(++index)) != NULL) { _global_code_blobs->append(new JvmtiCodeBlobDesc(desc->name(), desc->begin(), desc->end())); } // next iterate over all the non-nmethod code blobs and add them to // the list - as noted above this will filter out duplicates and // enclosing blobs. Unimplemented(); //CodeCache::blobs_do(do_blob); // make the global list the instance list so that it can be used // for other iterations. _code_blobs = _global_code_blobs; _global_code_blobs = NULL; }
StubCodeGenerator::~StubCodeGenerator() { if (PrintStubCode || _print_code) { CodeBuffer* cbuf = _masm->code(); CodeBlob* blob = CodeCache::find_blob_unsafe(cbuf->insts()->start()); if (blob != NULL) { blob->set_strings(cbuf->strings()); } bool saw_first = false; StubCodeDesc* toprint[1000]; int toprint_len = 0; for (StubCodeDesc* cdesc = _last_stub; cdesc != NULL; cdesc = cdesc->_next) { toprint[toprint_len++] = cdesc; if (cdesc == _first_stub) { saw_first = true; break; } } assert(saw_first, "must get both first & last"); // Print in reverse order: qsort(toprint, toprint_len, sizeof(toprint[0]), compare_cdesc); for (int i = 0; i < toprint_len; i++) { StubCodeDesc* cdesc = toprint[i]; cdesc->print(); tty->cr(); Disassembler::decode(cdesc->begin(), cdesc->end()); tty->cr(); } } }
void CodeBlobCollector::collect() { assert_locked_or_safepoint(CodeCache_lock); assert(_global_code_blobs == NULL, "checking"); // create the global list _global_code_blobs = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JvmtiCodeBlobDesc*>(50,true); // iterate over the stub code descriptors and put them in the list first. for (StubCodeDesc* desc = StubCodeDesc::first(); desc != NULL; desc = StubCodeDesc::next(desc)) { _global_code_blobs->append(new JvmtiCodeBlobDesc(desc->name(), desc->begin(), desc->end())); } // Vtable stubs are not described with StubCodeDesc, // process them separately VtableStubs::vtable_stub_do(do_vtable_stub); // next iterate over all the non-nmethod code blobs and add them to // the list - as noted above this will filter out duplicates and // enclosing blobs. CodeCache::blobs_do(do_blob); // make the global list the instance list so that it can be used // for other iterations. _code_blobs = _global_code_blobs; _global_code_blobs = NULL; }
address Relocation::index_to_runtime_address(intptr_t index) { if (index == 0) return NULL; if (is_index(index)) { StubCodeDesc* p = StubCodeDesc::desc_for_index(index); assert(p != NULL, "there must be a stub for this index"); return p->begin(); } else { return (address) index; } }
intptr_t Relocation::runtime_address_to_index(address runtime_address) { assert(!is_index((intptr_t)runtime_address), "must not look like an index"); if (runtime_address == NULL) return 0; StubCodeDesc* p = StubCodeDesc::desc_for(runtime_address); if (p != NULL && p->begin() == runtime_address) { assert(is_index(p->index()), "there must not be too many stubs"); return (intptr_t)p->index(); } else { warning("random unregistered address in relocInfo: " INTPTR_FORMAT, runtime_address); return (intptr_t) runtime_address; } }
void i486_env::print_label(intptr_t value) { address adr = (address) value; if (StubRoutines::contains(adr)) { StubCodeDesc* desc = StubCodeDesc::desc_for(adr); const char * desc_name = "unknown stub"; if (desc != NULL) { desc_name = desc->name(); } output->print("Stub::%s", desc_name); if (WizardMode) output->print(" " INTPTR_FORMAT, value); } else { output->print(INTPTR_FORMAT, value); } }
void sparc_env::print_address(address adr, outputStream* st) { if (StubRoutines::contains(adr)) { StubCodeDesc *desc = StubCodeDesc::desc_for(adr); if (desc == NULL) desc = StubCodeDesc::desc_for(adr + frame::pc_return_offset); if (desc == NULL) st->print("Unknown stub at " INTPTR_FORMAT, adr); else { st->print("Stub::%s", desc->name()); if (desc->begin() != adr) st->print("%+d 0x%p",adr - desc->begin(), adr); else if (WizardMode) st->print(" " INTPTR_FORMAT, adr); } } else { BarrierSet* bs = Universe::heap()->barrier_set(); if (bs->kind() == BarrierSet::CardTableModRef && adr == (address)((CardTableModRefBS*)(bs))->byte_map_base) { st->print("word_map_base"); if (WizardMode) st->print(" " INTPTR_FORMAT, (intptr_t)adr); } else { st->print(INTPTR_FORMAT, (intptr_t)adr); } } }
// --- oops_arguments_do ----------------------------------------------------- // oops-do just for arguments when args are passed but the caller is // not yet claiming responsibility for them (e.g., mid-call resolution). void CodeBlob::oops_arguments_do(frame fr, OopClosure* f) const { // Native calls have all their args handlized. if( _type == native ) return; // C1 and C2 can call directly into the C++ runtime without a stub but these // calls all do not need their arguments GC'd (i.e., by the time a GC point // is reached all arguments get handlized). if( _type == c1 || _type == c2 ) return; guarantee( _type == runtime_stubs, "we only get here for runtime stubs" ); StubCodeDesc *stub = StubCodeDesc::desc_for(fr.pc()); Runtime1::StubID id = Runtime1::contains(fr.pc()); // In a resolve_and_patch_call stub, we have to parse the outgoing signature // to find any argument oops. The call site itself doesn't cover the // outgoing oops, and there is no target method yet. if( fr.pc() == CodeCache::_caller_must_gc_args_0 || fr.pc() == CodeCache::_caller_must_gc_args_1 ) { assert0( (stub && !strcmp(stub->name(), "resolve_and_patch_handler")) || id == Runtime1::frequency_counter_overflow_wrapper_id); oops_arguments_do_impl(fr,f); return; } // Assert sanity for stub-generator stubs if( stub ) { if( !strcmp(stub->name(), "sba_escape_handler") ) return; // no unhandled args from a failed STA/SVB if( !strcmp(stub->name(), "new_handler") ) return; // no unhandled args from a new allocation request // If we are at an inline-cache we need to construct an official j.l.NPE // object. However, no oops are in callee-save registers and the caller's // args are dead because the call isn't happening. (If we are not at an // inline-cache then we just reset the PC to the proper handler and do not // do any object construction). if( !strcmp(stub->name(), "handler_for_null_ptr_exception") ) return; // If we are throwing, then the callers args are long long gone. if( !strcmp(stub->name(), "forward_exception") ) return; // For safepoints, we generously allow any register to hold oops. if( !strcmp(stub->name(), "safepoint_handler") ) return; // The args for a blocking lock will be handlerized in the VM if( !strcmp(stub->name(), "blocking_lock_stub") ) return; // The args for registering a finalized object will be handlerized in the VM if( !strcmp(stub->name(), "register_finalizer") ) return; // The args for a blocking lock will be handlerized in the VM // There are no args saved in registers across an uncommon trap if( !strcmp(stub->name(), "deoptimize") ) return; if( !strcmp(stub->name(), "uncommon_trap") ) return; ShouldNotReachHere(); } // Not a StubGenerator stub; check for sane C1 stubs if (id != -1) { switch(id) { case Runtime1::access_field_patching_id: return; case Runtime1::load_klass_patching_id: return; case Runtime1::monitorenter_id: return; case Runtime1::new_array_id: return; case Runtime1::new_instance_id: return; case Runtime1::new_multi_array_id: return; case Runtime1::register_finalizer_id: return; case Runtime1::throw_array_store_exception_id: return; case Runtime1::throw_class_cast_exception_id: return; case Runtime1::throw_div0_exception_id: return; case Runtime1::throw_index_exception_id: return; case Runtime1::throw_null_pointer_exception_id: return; case Runtime1::throw_range_check_failed_id: return; default: tty->print_cr("Unimplemented Runtime1 stub ID %s (%d)", Runtime1::name_for(id), id); Unimplemented(); } } // Probably most other stubs are simple returns, but a few need special handling. ShouldNotReachHere(); }
static void find(intptr_t x, bool print_pc) { address addr = (address)x; 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) { i->print(); return; } if (Interpreter::contains(addr)) { tty->print_cr(INTPTR_FORMAT " is pointing into interpreter code (not bytecode specific)", addr); return; } // if (AdapterHandlerLibrary::contains(b)) { AdapterHandlerLibrary::print_handler(b); } // the stubroutines are generated into a buffer blob StubCodeDesc* d = StubCodeDesc::desc_for(addr); if (d != NULL) { d->print(); if (print_pc) tty->cr(); return; } if (StubRoutines::contains(addr)) { tty->print_cr(INTPTR_FORMAT " is pointing to an (unnamed) stub routine", addr); return; } // the InlineCacheBuffer is using stubs generated into a buffer blob if (InlineCacheBuffer::contains(addr)) { tty->print_cr(INTPTR_FORMAT " is pointing into InlineCacheBuffer", addr); return; } VtableStub* v = VtableStubs::stub_containing(addr); if (v != NULL) { v->print(); return; } } if (print_pc && b->is_nmethod()) { ResourceMark rm; tty->print("%#p: Compiled ", addr); ((nmethod*)b)->method()->print_value_on(tty); tty->print(" = (CodeBlob*)" INTPTR_FORMAT, b); tty->cr(); return; } if ( b->is_nmethod()) { if (b->is_zombie()) { tty->print_cr(INTPTR_FORMAT " is zombie nmethod", b); } else if (b->is_not_entrant()) { tty->print_cr(INTPTR_FORMAT " is non-entrant nmethod", b); } } b->print(); 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 parseable // 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*)addr)->is_oop()) { p = (HeapWord*) addr; print = true; } if (print) { oop(p)->print(); if (p != (HeapWord*)x && oop(p)->is_constMethod() && constMethodOop(p)->contains(addr)) { Thread *thread = Thread::current(); HandleMark hm(thread); methodHandle mh (thread, constMethodOop(p)->method()); if (!mh->is_native()) { tty->print_cr("bci_from(%p) = %d; print_codes():", addr, mh->bci_from(address(x))); mh->print_codes(); } } return; } } else if (Universe::heap()->is_in_reserved(addr)) { tty->print_cr(INTPTR_FORMAT " is an unallocated location in the heap", addr); return; } if (JNIHandles::is_global_handle((jobject) addr)) { tty->print_cr(INTPTR_FORMAT " is a global jni handle", addr); return; } if (JNIHandles::is_weak_global_handle((jobject) addr)) { tty->print_cr(INTPTR_FORMAT " is a weak global jni handle", addr); return; } if (JNIHandleBlock::any_contains((jobject) addr)) { tty->print_cr(INTPTR_FORMAT " is a local jni handle", addr); return; } for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) { // Check for privilege stack if (thread->privileged_stack_top() != NULL && thread->privileged_stack_top()->contains(addr)) { tty->print_cr(INTPTR_FORMAT " is pointing into the privilege stack for thread: " INTPTR_FORMAT, addr, thread); return; } // If the addr is a java thread print information about that. if (addr == (address)thread) { thread->print(); return; } } // Try an OS specific find if (os::find(addr)) { return; } if (print_pc) { tty->print_cr(INTPTR_FORMAT ": probably in C++ code; check debugger", addr); Disassembler::decode(same_page(addr-40,addr),same_page(addr+40,addr)); return; } tty->print_cr(INTPTR_FORMAT " is pointing to unknown location", addr); }
const char* StubCodeDesc::name_for(address pc) { StubCodeDesc* p = desc_for(pc); return p == NULL ? NULL : p->name(); }
StubCodeDesc* StubCodeDesc::desc_for_index(int index) { StubCodeDesc* p = _list; while (p != NULL && p->index() != index) p = p->_next; return p; }
StubCodeDesc* StubCodeDesc::desc_for(address pc) { StubCodeDesc* p = _list; while (p != NULL && !p->contains(pc)) p = p->_next; // p == NULL || p->contains(pc) return p; }
void VMError::report(outputStream* st, bool _verbose) { # define BEGIN if (_current_step == 0) { _current_step = __LINE__; # define STEP(s) } if (_current_step < __LINE__) { _current_step = __LINE__; _current_step_info = s; # define END } // don't allocate large buffer on stack static char buf[O_BUFLEN]; BEGIN STEP("printing fatal error message") st->print_cr("#"); if (should_report_bug(_id)) { st->print_cr("# A fatal error has been detected by the Java Runtime Environment:"); } else { st->print_cr("# There is insufficient memory for the Java " "Runtime Environment to continue."); } #ifndef PRODUCT // Error handler self tests // test secondary error handling. Test it twice, to test that resetting // error handler after a secondary crash works. STEP("test secondary crash 1") if (_verbose && TestCrashInErrorHandler != 0) { st->print_cr("Will crash now (TestCrashInErrorHandler=" UINTX_FORMAT ")...", TestCrashInErrorHandler); controlled_crash(TestCrashInErrorHandler); } STEP("test secondary crash 2") if (_verbose && TestCrashInErrorHandler != 0) { st->print_cr("Will crash now (TestCrashInErrorHandler=" UINTX_FORMAT ")...", TestCrashInErrorHandler); controlled_crash(TestCrashInErrorHandler); } STEP("test safefetch in error handler") // test whether it is safe to use SafeFetch32 in Crash Handler. Test twice // to test that resetting the signal handler works correctly. if (_verbose && TestSafeFetchInErrorHandler) { st->print_cr("Will test SafeFetch..."); if (CanUseSafeFetch32()) { int* const invalid_pointer = (int*) get_segfault_address(); const int x = 0x76543210; int i1 = SafeFetch32(invalid_pointer, x); int i2 = SafeFetch32(invalid_pointer, x); if (i1 == x && i2 == x) { st->print_cr("SafeFetch OK."); // Correctly deflected and returned default pattern } else { st->print_cr("??"); } } else { st->print_cr("not possible; skipped."); } } #endif // PRODUCT STEP("printing type of error") switch(_id) { case OOM_MALLOC_ERROR: case OOM_MMAP_ERROR: if (_size) { st->print("# Native memory allocation "); st->print((_id == (int)OOM_MALLOC_ERROR) ? "(malloc) failed to allocate " : "(mmap) failed to map "); jio_snprintf(buf, sizeof(buf), SIZE_FORMAT, _size); st->print("%s", buf); st->print(" bytes"); if (strlen(_detail_msg) > 0) { st->print(" for "); st->print("%s", _detail_msg); } st->cr(); } else { if (strlen(_detail_msg) > 0) { st->print("# "); st->print_cr("%s", _detail_msg); } } // In error file give some solutions if (_verbose) { print_oom_reasons(st); } else { return; // that's enough for the screen } break; case INTERNAL_ERROR: default: break; } STEP("printing exception/signal name") st->print_cr("#"); st->print("# "); // Is it an OS exception/signal? if (os::exception_name(_id, buf, sizeof(buf))) { st->print("%s", buf); st->print(" (0x%x)", _id); // signal number st->print(" at pc=" PTR_FORMAT, p2i(_pc)); } else { if (should_report_bug(_id)) { st->print("Internal Error"); } else { st->print("Out of Memory Error"); } if (_filename != NULL && _lineno > 0) { #ifdef PRODUCT // In product mode chop off pathname? char separator = os::file_separator()[0]; const char *p = strrchr(_filename, separator); const char *file = p ? p+1 : _filename; #else const char *file = _filename; #endif st->print(" (%s:%d)", file, _lineno); } else { st->print(" (0x%x)", _id); } } STEP("printing current thread and pid") // process id, thread id st->print(", pid=%d", os::current_process_id()); st->print(", tid=" UINTX_FORMAT, os::current_thread_id()); st->cr(); STEP("printing error message") if (should_report_bug(_id)) { // already printed the message. // error message if (strlen(_detail_msg) > 0) { st->print_cr("# %s: %s", _message ? _message : "Error", _detail_msg); } else if (_message) { st->print_cr("# Error: %s", _message); } } STEP("printing Java version string") report_vm_version(st, buf, sizeof(buf)); STEP("printing problematic frame") // Print current frame if we have a context (i.e. it's a crash) if (_context) { st->print_cr("# Problematic frame:"); st->print("# "); frame fr = os::fetch_frame_from_context(_context); fr.print_on_error(st, buf, sizeof(buf)); st->cr(); st->print_cr("#"); } STEP("printing core file information") st->print("# "); if (CreateCoredumpOnCrash) { if (coredump_status) { st->print("Core dump will be written. Default location: %s", coredump_message); } else { st->print("No core dump will be written. %s", coredump_message); } } else { st->print("CreateCoredumpOnCrash turned off, no core file dumped"); } st->cr(); st->print_cr("#"); STEP("printing bug submit message") if (should_report_bug(_id) && _verbose) { print_bug_submit_message(st, _thread); } STEP("printing summary") if (_verbose) { st->cr(); st->print_cr("--------------- S U M M A R Y ------------"); st->cr(); } STEP("printing VM option summary") if (_verbose) { // VM options Arguments::print_summary_on(st); st->cr(); } STEP("printing summary machine and OS info") if (_verbose) { os::print_summary_info(st, buf, sizeof(buf)); } STEP("printing date and time") if (_verbose) { os::print_date_and_time(st, buf, sizeof(buf)); } STEP("printing thread") if (_verbose) { st->cr(); st->print_cr("--------------- T H R E A D ---------------"); st->cr(); } STEP("printing current thread") // current thread if (_verbose) { if (_thread) { st->print("Current thread (" PTR_FORMAT "): ", p2i(_thread)); _thread->print_on_error(st, buf, sizeof(buf)); st->cr(); } else { st->print_cr("Current thread is native thread"); } st->cr(); } STEP("printing current compile task") if (_verbose && _thread && _thread->is_Compiler_thread()) { CompilerThread* t = (CompilerThread*)_thread; if (t->task()) { st->cr(); st->print_cr("Current CompileTask:"); t->task()->print_line_on_error(st, buf, sizeof(buf)); st->cr(); } } STEP("printing stack bounds") if (_verbose) { st->print("Stack: "); address stack_top; size_t stack_size; if (_thread) { stack_top = _thread->stack_base(); stack_size = _thread->stack_size(); } else { stack_top = os::current_stack_base(); stack_size = os::current_stack_size(); } address stack_bottom = stack_top - stack_size; st->print("[" PTR_FORMAT "," PTR_FORMAT "]", p2i(stack_bottom), p2i(stack_top)); frame fr = _context ? os::fetch_frame_from_context(_context) : os::current_frame(); if (fr.sp()) { st->print(", sp=" PTR_FORMAT, p2i(fr.sp())); size_t free_stack_size = pointer_delta(fr.sp(), stack_bottom, 1024); st->print(", free space=" SIZE_FORMAT "k", free_stack_size); } st->cr(); } STEP("printing native stack") if (_verbose) { if (os::platform_print_native_stack(st, _context, buf, sizeof(buf))) { // We have printed the native stack in platform-specific code // Windows/x64 needs special handling. } else { frame fr = _context ? os::fetch_frame_from_context(_context) : os::current_frame(); print_native_stack(st, fr, _thread, buf, sizeof(buf)); } } STEP("printing Java stack") if (_verbose && _thread && _thread->is_Java_thread()) { print_stack_trace(st, (JavaThread*)_thread, buf, sizeof(buf)); } STEP("printing target Java thread stack") // printing Java thread stack trace if it is involved in GC crash if (_verbose && _thread && (_thread->is_Named_thread())) { JavaThread* jt = ((NamedThread *)_thread)->processed_thread(); if (jt != NULL) { st->print_cr("JavaThread " PTR_FORMAT " (nid = %d) was being processed", p2i(jt), jt->osthread()->thread_id()); print_stack_trace(st, jt, buf, sizeof(buf), true); } } STEP("printing siginfo") // signal no, signal code, address that caused the fault if (_verbose && _siginfo) { st->cr(); os::print_siginfo(st, _siginfo); st->cr(); } STEP("CDS archive access warning") // Print an explicit hint if we crashed on access to the CDS archive. if (_verbose && _siginfo) { check_failing_cds_access(st, _siginfo); st->cr(); } STEP("printing register info") // decode register contents if possible if (_verbose && _context && Universe::is_fully_initialized()) { os::print_register_info(st, _context); st->cr(); } STEP("printing registers, top of stack, instructions near pc") // registers, top of stack, instructions near pc if (_verbose && _context) { os::print_context(st, _context); st->cr(); } STEP("printing code blob if possible") if (_verbose && _context) { CodeBlob* cb = CodeCache::find_blob(_pc); if (cb != NULL) { if (Interpreter::contains(_pc)) { // The interpreter CodeBlob is very large so try to print the codelet instead. InterpreterCodelet* codelet = Interpreter::codelet_containing(_pc); if (codelet != NULL) { codelet->print_on(st); Disassembler::decode(codelet->code_begin(), codelet->code_end(), st); } } else { StubCodeDesc* desc = StubCodeDesc::desc_for(_pc); if (desc != NULL) { desc->print_on(st); Disassembler::decode(desc->begin(), desc->end(), st); } else { Disassembler::decode(cb, st); st->cr(); } } } } STEP("printing VM operation") if (_verbose && _thread && _thread->is_VM_thread()) { VMThread* t = (VMThread*)_thread; VM_Operation* op = t->vm_operation(); if (op) { op->print_on_error(st); st->cr(); st->cr(); } } STEP("printing process") if (_verbose) { st->cr(); st->print_cr("--------------- P R O C E S S ---------------"); st->cr(); } STEP("printing all threads") // all threads if (_verbose && _thread) { Threads::print_on_error(st, _thread, buf, sizeof(buf)); st->cr(); } STEP("printing VM state") if (_verbose) { // Safepoint state st->print("VM state:"); if (SafepointSynchronize::is_synchronizing()) st->print("synchronizing"); else if (SafepointSynchronize::is_at_safepoint()) st->print("at safepoint"); else st->print("not at safepoint"); // Also see if error occurred during initialization or shutdown if (!Universe::is_fully_initialized()) { st->print(" (not fully initialized)"); } else if (VM_Exit::vm_exited()) { st->print(" (shutting down)"); } else { st->print(" (normal execution)"); } st->cr(); st->cr(); } STEP("printing owned locks on error") // mutexes/monitors that currently have an owner if (_verbose) { print_owned_locks_on_error(st); st->cr(); } STEP("printing number of OutOfMemoryError and StackOverflow exceptions") if (_verbose && Exceptions::has_exception_counts()) { st->print_cr("OutOfMemory and StackOverflow Exception counts:"); Exceptions::print_exception_counts_on_error(st); st->cr(); } STEP("printing compressed oops mode") if (_verbose && UseCompressedOops) { Universe::print_compressed_oops_mode(st); if (UseCompressedClassPointers) { Metaspace::print_compressed_class_space(st); } st->cr(); } STEP("printing heap information") if (_verbose && Universe::is_fully_initialized()) { Universe::heap()->print_on_error(st); st->cr(); st->print_cr("Polling page: " INTPTR_FORMAT, p2i(os::get_polling_page())); st->cr(); } STEP("printing code cache information") if (_verbose && Universe::is_fully_initialized()) { // print code cache information before vm abort CodeCache::print_summary(st); st->cr(); } STEP("printing ring buffers") if (_verbose) { Events::print_all(st); st->cr(); } STEP("printing dynamic libraries") if (_verbose) { // dynamic libraries, or memory map os::print_dll_info(st); st->cr(); } STEP("printing VM options") if (_verbose) { // VM options Arguments::print_on(st); st->cr(); } STEP("printing warning if internal testing API used") if (WhiteBox::used()) { st->print_cr("Unsupported internal testing APIs have been used."); st->cr(); } STEP("printing log configuration") if (_verbose){ st->print_cr("Logging:"); LogConfiguration::describe_current_configuration(st); st->cr(); } STEP("printing all environment variables") if (_verbose) { os::print_environment_variables(st, env_list); st->cr(); } STEP("printing signal handlers") if (_verbose) { os::print_signal_handlers(st, buf, sizeof(buf)); st->cr(); } STEP("Native Memory Tracking") if (_verbose) { MemTracker::error_report(st); } STEP("printing system") if (_verbose) { st->cr(); st->print_cr("--------------- S Y S T E M ---------------"); st->cr(); } STEP("printing OS information") if (_verbose) { os::print_os_info(st); st->cr(); } STEP("printing CPU info") if (_verbose) { os::print_cpu_info(st, buf, sizeof(buf)); st->cr(); } STEP("printing memory info") if (_verbose) { os::print_memory_info(st); st->cr(); } STEP("printing internal vm info") if (_verbose) { st->print_cr("vm_info: %s", Abstract_VM_Version::internal_vm_info_string()); st->cr(); } // print a defined marker to show that error handling finished correctly. STEP("printing end marker") if (_verbose) { st->print_cr("END."); } END # undef BEGIN # undef STEP # undef END }