#pragma D option quiet #pragma D option jstackstrsize=1024 inline int FAULT_JSTACK_SIZE = 20; inline int EXIT_JSTACK_SIZE = 5; inline int print_stack_trace = 1; string strfault[int, int]; string strsig[int]; dtrace:::BEGIN { strsig[SIGHUP] = "SIGHUP"; strsig[SIGINT] = "SIGINT"; strsig[SIGQUIT] = "SIGQUIT"; strsig[SIGILL] = "SIGILL"; strsig[SIGTRAP] = "SIGTRAP"; strsig[SIGIOT] = "SIGIOT"; strsig[SIGABRT] = "SIGABRT"; strsig[SIGEMT] = "SIGEMT"; strsig[SIGFPE] = "SIGFPE"; strsig[SIGKILL] = "SIGKILL"; strsig[SIGBUS] = "SIGBUS"; strsig[SIGSEGV] = "SIGSEGV"; strsig[SIGSYS] = "SIGSYS"; strsig[SIGPIPE] = "SIGPIPE"; strsig[SIGALRM] = "SIGALRM"; strsig[SIGTERM] = "SIGTERM"; strsig[SIGUSR1] = "SIGUSR1"; strsig[SIGUSR2] = "SIGUSR2"; strsig[SIGCLD] = "SIGCLD"; strsig[SIGCHLD] = "SIGCHLD"; strsig[SIGPWR] = "SIGPWR"; strsig[SIGWINCH] = "SIGWINCH"; strsig[SIGURG] = "SIGURG"; strsig[SIGPOLL] = "SIGPOLL"; strsig[SIGIO] = "SIGIO"; strsig[SIGSTOP] = "SIGSTOP"; strsig[SIGTSTP] = "SIGTSTP"; strsig[SIGCONT] = "SIGCONT"; strsig[SIGTTIN] = "SIGTTIN"; strsig[SIGTTOU] = "SIGTTOU"; strsig[SIGVTALRM] = "SIGVTALRM"; strsig[SIGPROF] = "SIGPROF"; strsig[SIGXCPU] = "SIGXCPU"; strsig[SIGXFSZ] = "SIGXFSZ"; strsig[SIGWAITING] = "SIGWAITING"; strsig[SIGLWP] = "SIGLWP"; strsig[SIGFREEZE] = "SIGFREEZE"; strsig[SIGTHAW] = "SIGTHAW"; strsig[SIGCANCEL] = "SIGCANCEL"; strsig[SIGLOST] = "SIGLOST"; strsig[SIGXRES] = "SIGXRES"; strsig[SIGJVM1] = "SIGJVM1"; strsig[SIGJVM2] = "SIGJVM2"; strsig[SIGRTMIN] = "SIGRTMIN"; strsig[SIGRTMAX] = "SIGRTMAX"; strfault[SIGFPE,FPE_INTDIV] = "integer divide by zero"; strfault[SIGFPE,FPE_INTOVF] = "integer overflow"; strfault[SIGFPE,FPE_FLTDIV] = "floating point divide by zero"; strfault[SIGFPE,FPE_FLTOVF] = "floating point overflow"; strfault[SIGFPE,FPE_FLTUND] = "floating point underflow"; strfault[SIGFPE,FPE_FLTRES] = "floating point inexact result"; strfault[SIGFPE,FPE_FLTINV] = "invalid floating point operation"; strfault[SIGFPE,FPE_FLTSUB] = "subscript out of range"; strfault[SIGILL,ILL_ILLOPC] = "illegal opcode"; strfault[SIGILL,ILL_ILLOPN] = "illegal operand"; strfault[SIGILL,ILL_ILLADR] = "illegal addressing mode"; strfault[SIGILL,ILL_ILLTRP] = "illegal trap"; strfault[SIGILL,ILL_PRVOPC] = "privileged opcode"; strfault[SIGILL,ILL_PRVREG] = "privileged register"; strfault[SIGILL,ILL_COPROC] = "co-processor error"; strfault[SIGILL,ILL_BADSTK] = "internal stack error"; strfault[SIGSEGV,SEGV_MAPERR] = "address not mapped to object"; strfault[SIGSEGV,SEGV_ACCERR] = "invalid permissions for mapped object"; printf("catching crash of jvm\n"); printf("otherwise, Ctrl-C to end\n\n\n"); } hotspot*:::vm-init-end { printf("new jvm started pid [%d]\n",pid); } proc:::signal-send /args[1]->pr_fname == "java"/ { printf("[%s:%6d/%3d] sent %5s to %s:%d\n", execname,pid,tid,strsig[args[2]],args[1]->pr_fname,args[1]->pr_pid); } proc:::signal-handle /execname == "java"/ { printf("[%s:%6d/%3d] receiving %s\n",execname,pid,tid,strsig[arg0]); self->catch_it = 1; } proc:::signal-handle /self->catch_it && print_stack_trace == 1 && (arg0 == SIGABRT || arg0 == SIGINT || arg0 == SIGQUIT || arg0 == SIGABRT || arg0 == SIGSEGV || arg0 == SIGKILL)/ { jstack(FAULT_JSTACK_SIZE); } proc:::fault { self->do_jstack = execname == "java" ? 1 : 0; } proc:::fault /self->do_jstack == 1/ { printf("[%s:%6d/%3d] experiencing fault <%s>, signal %d\n",execname,pid,tid, strfault[args[1]->si_signo,args[1]->si_code],args[1]->si_signo); print_stack_trace == 1 ? jstack(FAULT_JSTACK_SIZE) : 0; } proc:::fault /self->do_jstack == 0/ { printf("[%s:%6d/%3d] experiencing fault <%s>, signal %d\n",execname,pid,tid, strfault[args[1]->si_signo,args[1]->si_code],args[1]->si_signo); print_stack_trace == 1 ? ustack(FAULT_JSTACK_SIZE) : 0; }