This commit is contained in:
Vladimir Kozlov 2014-02-19 12:08:49 -08:00
commit 5117e1a805
358 changed files with 58875 additions and 1800 deletions

View file

@ -2251,67 +2251,12 @@ void os::print_memory_info(outputStream* st) {
(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 size_t ill_names_length = (sizeof(ill_names)/sizeof(char *));
const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
"FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
"FPE_FLTINV", "FPE_FLTSUB" };
const size_t fpe_names_length = (sizeof(fpe_names)/sizeof(char *));
const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
const size_t segv_names_length = (sizeof(segv_names)/sizeof(char *));
const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
const size_t bus_names_length = (sizeof(bus_names)/sizeof(char *));
void os::print_siginfo(outputStream* st, void* siginfo) {
st->print("siginfo:");
const siginfo_t* si = (const siginfo_t*)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 >= ill_names_length ? "" : ill_names[c]);
st->print(", si_addr=" PTR_FORMAT, si->si_addr);
break;
case SIGFPE:
st->print(", si_code=%d (%s)", c,
c >= fpe_names_length ? "" : fpe_names[c]);
st->print(", si_addr=" PTR_FORMAT, si->si_addr);
break;
case SIGSEGV:
st->print(", si_code=%d (%s)", c,
c >= segv_names_length ? "" : segv_names[c]);
st->print(", si_addr=" PTR_FORMAT, si->si_addr);
break;
case SIGBUS:
st->print(", si_code=%d (%s)", c,
c >= bus_names_length ? "" : 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
}
os::Posix::print_siginfo_brief(st, si);
if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
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)) {
@ -2381,7 +2326,8 @@ static void print_signal_handler(outputStream* st, int sig,
st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
}
st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
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?
@ -2390,7 +2336,8 @@ static void print_signal_handler(outputStream* st, int sig,
sa.sa_flags = VMError::get_resetted_sigflags(sig);
}
st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags);
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) ||