# HG changeset patch # User Tom Rodriguez # Date 1407434769 25200 # Node ID b1911c1e44c8b1c7c0dc36f8a76d33465300bbfd # Parent 4703a9442f3fcd291e9925688decfa8039faa274 Dump disassembly in crash log diff -r 4703a9442f3f -r b1911c1e44c8 src/os/bsd/vm/os_bsd.cpp --- a/src/os/bsd/vm/os_bsd.cpp Thu Aug 07 11:05:12 2014 -0700 +++ b/src/os/bsd/vm/os_bsd.cpp Thu Aug 07 11:06:09 2014 -0700 @@ -3805,6 +3805,11 @@ return fetcher.result(); } +address os::get_pc(void* context) { + ucontext_t *uc = (ucontext_t*)context; + return os::Bsd::ucontext_get_pc(uc); +} + int os::Bsd::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) { return pthread_cond_timedwait(_cond, _mutex, _abstime); diff -r 4703a9442f3f -r b1911c1e44c8 src/os/linux/vm/os_linux.cpp --- a/src/os/linux/vm/os_linux.cpp Thu Aug 07 11:05:12 2014 -0700 +++ b/src/os/linux/vm/os_linux.cpp Thu Aug 07 11:06:09 2014 -0700 @@ -5035,6 +5035,11 @@ return fetcher.result(); } +address os::get_pc(void* context) { + ucontext_t *uc = (ucontext_t*)context; + return os::Linux::ucontext_get_pc(uc); +} + int os::Linux::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) { if (is_NPTL()) { diff -r 4703a9442f3f -r b1911c1e44c8 src/os/solaris/vm/os_solaris.cpp --- a/src/os/solaris/vm/os_solaris.cpp Thu Aug 07 11:05:12 2014 -0700 +++ b/src/os/solaris/vm/os_solaris.cpp Thu Aug 07 11:06:09 2014 -0700 @@ -4379,6 +4379,10 @@ return fetcher.result(); } +address os::get_pc(void* context) { + ucontext_t *uc = (ucontext_t*)context; + return os::Solaris::ucontext_get_pc(uc); +} // This does not do anything on Solaris. This is basically a hook for being // able to use structured exception handling (thread-local exception filters) on, e.g., Win32. diff -r 4703a9442f3f -r b1911c1e44c8 src/os/windows/vm/os_windows.cpp --- a/src/os/windows/vm/os_windows.cpp Thu Aug 07 11:05:12 2014 -0700 +++ b/src/os/windows/vm/os_windows.cpp Thu Aug 07 11:06:09 2014 -0700 @@ -3672,6 +3672,16 @@ #endif } +address os::get_pc(void* context) { + CONTEXT* uc = (CONTEXT*)context; +#ifdef _M_AMD64 + return (address) context.Rip; +#else + return (address) context.Eip; +#endif +} + + // GetCurrentThreadId() returns DWORD intx os::current_thread_id() { return GetCurrentThreadId(); } diff -r 4703a9442f3f -r b1911c1e44c8 src/share/vm/compiler/disassembler.cpp --- a/src/share/vm/compiler/disassembler.cpp Thu Aug 07 11:05:12 2014 -0700 +++ b/src/share/vm/compiler/disassembler.cpp Thu Aug 07 11:06:09 2014 -0700 @@ -493,6 +493,10 @@ void Disassembler::decode(CodeBlob* cb, outputStream* st) { if (!load_library()) return; + if (cb->is_nmethod()) { + decode((nmethod*)cb, st); + return; + } decode_env env(cb, st); env.output()->print_cr("----------------------------------------------------------------------"); env.output()->print_cr("%s at [" PTR_FORMAT ", " PTR_FORMAT "] %d bytes", cb->name(), cb->code_begin(), cb->code_end(), ((jlong)(cb->code_end() - cb->code_begin())) * sizeof(unsigned char*)); diff -r 4703a9442f3f -r b1911c1e44c8 src/share/vm/runtime/os.hpp --- a/src/share/vm/runtime/os.hpp Thu Aug 07 11:05:12 2014 -0700 +++ b/src/share/vm/runtime/os.hpp Thu Aug 07 11:06:09 2014 -0700 @@ -563,6 +563,9 @@ static void *find_agent_function(AgentLibrary *agent_lib, bool check_lib, const char *syms[], size_t syms_len); + + static address get_pc(void* context); + // Print out system information; they are called by fatal error handler. // Output format may be different on different platforms. static void print_os_info(outputStream* st); diff -r 4703a9442f3f -r b1911c1e44c8 src/share/vm/utilities/vmError.cpp --- a/src/share/vm/utilities/vmError.cpp Thu Aug 07 11:05:12 2014 -0700 +++ b/src/share/vm/utilities/vmError.cpp Thu Aug 07 11:06:09 2014 -0700 @@ -24,6 +24,7 @@ #include "precompiled.hpp" #include "compiler/compileBroker.hpp" +#include "compiler/disassembler.hpp" #include "gc_interface/collectedHeap.hpp" #include "prims/whitebox.hpp" #include "runtime/arguments.hpp" @@ -532,6 +533,32 @@ st->cr(); } + STEP(102, "(printing code blob if possible)") + + if (_verbose && _context) { + address pc = os::get_pc(_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(105, "(printing register info)") // decode register contents if possible