src/os/solaris/vm/os_solaris.cpp

Print this page
rev 4979 : 8020775: PPC64 (part 12): posix signal printing
Summary: Implement methods printing posix signal information and call them in unix os files.

*** 2245,2306 **** st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10); st->cr(); (void) check_addr0(st); } - // Taken from /usr/include/sys/machsig.h Supposed to be architecture specific - // but they're the same for all the solaris architectures that we support. - const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR", - "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG", - "ILL_COPROC", "ILL_BADSTK" }; - - const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV", - "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES", - "FPE_FLTINV", "FPE_FLTSUB" }; - - const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" }; - - const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" }; - void os::print_siginfo(outputStream* st, void* siginfo) { ! st->print("siginfo:"); ! const int buflen = 100; ! char buf[buflen]; ! siginfo_t *si = (siginfo_t*)siginfo; ! st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen)); ! char *err = strerror(si->si_errno); ! if (si->si_errno != 0 && err != NULL) { ! st->print("si_errno=%s", err); ! } else { ! st->print("si_errno=%d", si->si_errno); ! } ! const int c = si->si_code; ! assert(c > 0, "unexpected si_code"); ! switch (si->si_signo) { ! case SIGILL: ! st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]); ! st->print(", si_addr=" PTR_FORMAT, si->si_addr); ! break; ! case SIGFPE: ! st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]); ! st->print(", si_addr=" PTR_FORMAT, si->si_addr); ! break; ! case SIGSEGV: ! st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]); ! st->print(", si_addr=" PTR_FORMAT, si->si_addr); ! break; ! case SIGBUS: ! st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]); ! st->print(", si_addr=" PTR_FORMAT, si->si_addr); ! break; ! default: ! st->print(", si_code=%d", si->si_code); ! // no si_addr ! } ! if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && UseSharedSpaces) { FileMapInfo* mapinfo = FileMapInfo::current_info(); if (mapinfo->is_in_shared_space(si->si_addr)) { st->print("\n\nError accessing class data sharing archive." \ " Mapped file inaccessible during execution, " \ --- 2245,2260 ---- st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10); st->cr(); (void) check_addr0(st); } void os::print_siginfo(outputStream* st, void* siginfo) { ! const siginfo_t* si = (const siginfo_t*)siginfo; ! os::Posix::print_siginfo_brief(st, si); ! if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && UseSharedSpaces) { FileMapInfo* mapinfo = FileMapInfo::current_info(); if (mapinfo->is_in_shared_space(si->si_addr)) { st->print("\n\nError accessing class data sharing archive." \ " Mapped file inaccessible during execution, " \
*** 2366,2385 **** st->print("SIG_IGN"); } else { st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); } ! st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask); address rh = VMError::get_resetted_sighandler(sig); // May be, handler was resetted by VMError? if(rh != NULL) { handler = rh; sa.sa_flags = VMError::get_resetted_sigflags(sig); } ! st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags); // Check: is it our handler? if(handler == CAST_FROM_FN_PTR(address, signalHandler) || handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) { // It is our signal handler --- 2320,2341 ---- st->print("SIG_IGN"); } else { st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); } ! st->print(", sa_mask[0]="); ! os::Posix::print_signal_set_short(st, &sa.sa_mask); address rh = VMError::get_resetted_sighandler(sig); // May be, handler was resetted by VMError? if(rh != NULL) { handler = rh; sa.sa_flags = VMError::get_resetted_sigflags(sig); } ! st->print(", sa_flags="); ! os::Posix::print_sa_flags(st, sa.sa_flags); // Check: is it our handler? if(handler == CAST_FROM_FN_PTR(address, signalHandler) || handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) { // It is our signal handler