comparison src/os/solaris/vm/os_solaris.cpp @ 14410:f42f2e2a1518

8020775: PPC64 (part 12): posix signal printing Summary: Implement methods printing posix signal information and call them in unix os files. Reviewed-by: kvn, dholmes, twisti Contributed-by: thomas.stuefe@sap.com
author goetz
date Fri, 26 Jul 2013 00:59:18 +0200
parents ec173c8f3739
children e2722a66aba7
comparison
equal deleted inserted replaced
14409:b55e4bd0389e 14410:f42f2e2a1518
2245 st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10); 2245 st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10);
2246 st->cr(); 2246 st->cr();
2247 (void) check_addr0(st); 2247 (void) check_addr0(st);
2248 } 2248 }
2249 2249
2250 // Taken from /usr/include/sys/machsig.h Supposed to be architecture specific
2251 // but they're the same for all the solaris architectures that we support.
2252 const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
2253 "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
2254 "ILL_COPROC", "ILL_BADSTK" };
2255
2256 const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
2257 "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
2258 "FPE_FLTINV", "FPE_FLTSUB" };
2259
2260 const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
2261
2262 const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
2263
2264 void os::print_siginfo(outputStream* st, void* siginfo) { 2250 void os::print_siginfo(outputStream* st, void* siginfo) {
2265 st->print("siginfo:"); 2251 const siginfo_t* si = (const siginfo_t*)siginfo;
2266 2252
2267 const int buflen = 100; 2253 os::Posix::print_siginfo_brief(st, si);
2268 char buf[buflen]; 2254
2269 siginfo_t *si = (siginfo_t*)siginfo; 2255 if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
2270 st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
2271 char *err = strerror(si->si_errno);
2272 if (si->si_errno != 0 && err != NULL) {
2273 st->print("si_errno=%s", err);
2274 } else {
2275 st->print("si_errno=%d", si->si_errno);
2276 }
2277 const int c = si->si_code;
2278 assert(c > 0, "unexpected si_code");
2279 switch (si->si_signo) {
2280 case SIGILL:
2281 st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
2282 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2283 break;
2284 case SIGFPE:
2285 st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
2286 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2287 break;
2288 case SIGSEGV:
2289 st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
2290 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2291 break;
2292 case SIGBUS:
2293 st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
2294 st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2295 break;
2296 default:
2297 st->print(", si_code=%d", si->si_code);
2298 // no si_addr
2299 }
2300
2301 if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
2302 UseSharedSpaces) { 2256 UseSharedSpaces) {
2303 FileMapInfo* mapinfo = FileMapInfo::current_info(); 2257 FileMapInfo* mapinfo = FileMapInfo::current_info();
2304 if (mapinfo->is_in_shared_space(si->si_addr)) { 2258 if (mapinfo->is_in_shared_space(si->si_addr)) {
2305 st->print("\n\nError accessing class data sharing archive." \ 2259 st->print("\n\nError accessing class data sharing archive." \
2306 " Mapped file inaccessible during execution, " \ 2260 " Mapped file inaccessible during execution, " \
2366 st->print("SIG_IGN"); 2320 st->print("SIG_IGN");
2367 } else { 2321 } else {
2368 st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); 2322 st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
2369 } 2323 }
2370 2324
2371 st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask); 2325 st->print(", sa_mask[0]=");
2326 os::Posix::print_signal_set_short(st, &sa.sa_mask);
2372 2327
2373 address rh = VMError::get_resetted_sighandler(sig); 2328 address rh = VMError::get_resetted_sighandler(sig);
2374 // May be, handler was resetted by VMError? 2329 // May be, handler was resetted by VMError?
2375 if(rh != NULL) { 2330 if(rh != NULL) {
2376 handler = rh; 2331 handler = rh;
2377 sa.sa_flags = VMError::get_resetted_sigflags(sig); 2332 sa.sa_flags = VMError::get_resetted_sigflags(sig);
2378 } 2333 }
2379 2334
2380 st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags); 2335 st->print(", sa_flags=");
2336 os::Posix::print_sa_flags(st, sa.sa_flags);
2381 2337
2382 // Check: is it our handler? 2338 // Check: is it our handler?
2383 if(handler == CAST_FROM_FN_PTR(address, signalHandler) || 2339 if(handler == CAST_FROM_FN_PTR(address, signalHandler) ||
2384 handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) { 2340 handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) {
2385 // It is our signal handler 2341 // It is our signal handler