in src/processor/minidump_processor.cc [682:1640]
string MinidumpProcessor::GetCrashReason(Minidump *dump, uint64_t *address) {
MinidumpException *exception = dump->GetException();
if (!exception)
return "";
const MDRawExceptionStream *raw_exception = exception->exception();
if (!raw_exception)
return "";
if (address)
*address = raw_exception->exception_record.exception_address;
// The reason value is OS-specific and possibly CPU-specific. Set up
// sensible numeric defaults for the reason string in case we can't
// map the codes to a string (because there's no system info, or because
// it's an unrecognized platform, or because it's an unrecognized code.)
char reason_string[24];
uint32_t exception_code = raw_exception->exception_record.exception_code;
uint32_t exception_flags = raw_exception->exception_record.exception_flags;
snprintf(reason_string, sizeof(reason_string), "0x%08x / 0x%08x",
exception_code, exception_flags);
string reason = reason_string;
const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, NULL);
if (!raw_system_info)
return reason;
switch (raw_system_info->platform_id) {
case MD_OS_MAC_OS_X:
case MD_OS_IOS: {
char flags_string[11];
snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags);
switch (exception_code) {
case MD_EXCEPTION_MAC_BAD_ACCESS:
reason = "EXC_BAD_ACCESS / ";
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS:
reason.append("KERN_INVALID_ADDRESS");
break;
case MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE:
reason.append("KERN_PROTECTION_FAILURE");
break;
case MD_EXCEPTION_CODE_MAC_NO_ACCESS:
reason.append("KERN_NO_ACCESS");
break;
case MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE:
reason.append("KERN_MEMORY_FAILURE");
break;
case MD_EXCEPTION_CODE_MAC_MEMORY_ERROR:
reason.append("KERN_MEMORY_ERROR");
break;
default:
// arm and ppc overlap
if (raw_system_info->processor_architecture ==
MD_CPU_ARCHITECTURE_ARM ||
raw_system_info->processor_architecture ==
MD_CPU_ARCHITECTURE_ARM64_OLD) {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN:
reason.append("EXC_ARM_DA_ALIGN");
break;
case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG:
reason.append("EXC_ARM_DA_DEBUG");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
} else if (raw_system_info->processor_architecture ==
MD_CPU_ARCHITECTURE_PPC) {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ:
reason.append("EXC_PPC_VM_PROT_READ");
break;
case MD_EXCEPTION_CODE_MAC_PPC_BADSPACE:
reason.append("EXC_PPC_BADSPACE");
break;
case MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED:
reason.append("EXC_PPC_UNALIGNED");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
} else if (raw_system_info->processor_architecture ==
MD_CPU_ARCHITECTURE_X86 ||
raw_system_info->processor_architecture ==
MD_CPU_ARCHITECTURE_AMD64) {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT:
reason.append("EXC_I386_GPFLT");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
} else {
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
}
break;
}
break;
case MD_EXCEPTION_MAC_BAD_INSTRUCTION:
reason = "EXC_BAD_INSTRUCTION / ";
switch (raw_system_info->processor_architecture) {
case MD_CPU_ARCHITECTURE_ARM:
case MD_CPU_ARCHITECTURE_ARM64_OLD: {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED:
reason.append("EXC_ARM_UNDEFINED");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
case MD_CPU_ARCHITECTURE_PPC: {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL:
reason.append("EXC_PPC_INVALID_SYSCALL");
break;
case MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION:
reason.append("EXC_PPC_UNIPL_INST");
break;
case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION:
reason.append("EXC_PPC_PRIVINST");
break;
case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER:
reason.append("EXC_PPC_PRIVREG");
break;
case MD_EXCEPTION_CODE_MAC_PPC_TRACE:
reason.append("EXC_PPC_TRACE");
break;
case MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR:
reason.append("EXC_PPC_PERFMON");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
case MD_CPU_ARCHITECTURE_AMD64:
case MD_CPU_ARCHITECTURE_X86: {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION:
reason.append("EXC_I386_INVOP");
break;
case MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT:
reason.append("EXC_I386_INVTSSFLT");
break;
case MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT:
reason.append("EXC_I386_SEGNPFLT");
break;
case MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT:
reason.append("EXC_I386_STKFLT");
break;
case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT:
reason.append("EXC_I386_GPFLT");
break;
case MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT:
reason.append("EXC_I386_ALIGNFLT");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
case MD_EXCEPTION_MAC_ARITHMETIC:
reason = "EXC_ARITHMETIC / ";
switch (raw_system_info->processor_architecture) {
case MD_CPU_ARCHITECTURE_PPC: {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW:
reason.append("EXC_PPC_OVERFLOW");
break;
case MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE:
reason.append("EXC_PPC_ZERO_DIVIDE");
break;
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT:
reason.append("EXC_FLT_INEXACT");
break;
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE:
reason.append("EXC_PPC_FLT_ZERO_DIVIDE");
break;
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW:
reason.append("EXC_PPC_FLT_UNDERFLOW");
break;
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW:
reason.append("EXC_PPC_FLT_OVERFLOW");
break;
case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER:
reason.append("EXC_PPC_FLT_NOT_A_NUMBER");
break;
case MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION:
reason.append("EXC_PPC_NOEMULATION");
break;
case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST:
reason.append("EXC_PPC_ALTIVECASSIST");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
case MD_CPU_ARCHITECTURE_AMD64:
case MD_CPU_ARCHITECTURE_X86: {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_X86_DIV:
reason.append("EXC_I386_DIV");
break;
case MD_EXCEPTION_CODE_MAC_X86_INTO:
reason.append("EXC_I386_INTO");
break;
case MD_EXCEPTION_CODE_MAC_X86_NOEXT:
reason.append("EXC_I386_NOEXT");
break;
case MD_EXCEPTION_CODE_MAC_X86_EXTOVR:
reason.append("EXC_I386_EXTOVR");
break;
case MD_EXCEPTION_CODE_MAC_X86_EXTERR:
reason.append("EXC_I386_EXTERR");
break;
case MD_EXCEPTION_CODE_MAC_X86_EMERR:
reason.append("EXC_I386_EMERR");
break;
case MD_EXCEPTION_CODE_MAC_X86_BOUND:
reason.append("EXC_I386_BOUND");
break;
case MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR:
reason.append("EXC_I386_SSEEXTERR");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
case MD_EXCEPTION_MAC_EMULATION:
reason = "EXC_EMULATION / ";
reason.append(flags_string);
break;
case MD_EXCEPTION_MAC_SOFTWARE:
reason = "EXC_SOFTWARE / ";
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_ABORT:
reason.append("SIGABRT");
break;
case MD_EXCEPTION_CODE_MAC_NS_EXCEPTION:
reason.append("UNCAUGHT_NS_EXCEPTION");
break;
// These are ppc only but shouldn't be a problem as they're
// unused on x86
case MD_EXCEPTION_CODE_MAC_PPC_TRAP:
reason.append("EXC_PPC_TRAP");
break;
case MD_EXCEPTION_CODE_MAC_PPC_MIGRATE:
reason.append("EXC_PPC_MIGRATE");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
case MD_EXCEPTION_MAC_BREAKPOINT:
reason = "EXC_BREAKPOINT / ";
switch (raw_system_info->processor_architecture) {
case MD_CPU_ARCHITECTURE_ARM:
case MD_CPU_ARCHITECTURE_ARM64_OLD: {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN:
reason.append("EXC_ARM_DA_ALIGN");
break;
case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG:
reason.append("EXC_ARM_DA_DEBUG");
break;
case MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT:
reason.append("EXC_ARM_BREAKPOINT");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
case MD_CPU_ARCHITECTURE_PPC: {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT:
reason.append("EXC_PPC_BREAKPOINT");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
case MD_CPU_ARCHITECTURE_AMD64:
case MD_CPU_ARCHITECTURE_X86: {
switch (exception_flags) {
case MD_EXCEPTION_CODE_MAC_X86_SGL:
reason.append("EXC_I386_SGL");
break;
case MD_EXCEPTION_CODE_MAC_X86_BPT:
reason.append("EXC_I386_BPT");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
case MD_EXCEPTION_MAC_SYSCALL:
reason = "EXC_SYSCALL / ";
reason.append(flags_string);
break;
case MD_EXCEPTION_MAC_MACH_SYSCALL:
reason = "EXC_MACH_SYSCALL / ";
reason.append(flags_string);
break;
case MD_EXCEPTION_MAC_RPC_ALERT:
reason = "EXC_RPC_ALERT / ";
reason.append(flags_string);
break;
case MD_EXCEPTION_MAC_SIMULATED:
reason = "Simulated Exception";
break;
}
break;
}
case MD_OS_WIN32_NT:
case MD_OS_WIN32_WINDOWS: {
switch (exception_code) {
case MD_EXCEPTION_CODE_WIN_CONTROL_C:
reason = "DBG_CONTROL_C";
break;
case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION:
reason = "EXCEPTION_GUARD_PAGE";
break;
case MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT:
reason = "EXCEPTION_DATATYPE_MISALIGNMENT";
break;
case MD_EXCEPTION_CODE_WIN_BREAKPOINT:
reason = "EXCEPTION_BREAKPOINT";
break;
case MD_EXCEPTION_CODE_WIN_SINGLE_STEP:
reason = "EXCEPTION_SINGLE_STEP";
break;
case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION:
// For EXCEPTION_ACCESS_VIOLATION, Windows puts the address that
// caused the fault in exception_information[1].
// exception_information[0] is 0 if the violation was caused by
// an attempt to read data, 1 if it was an attempt to write data,
// and 8 if this was a data execution violation.
// This information is useful in addition to the code address, which
// will be present in the crash thread's instruction field anyway.
if (raw_exception->exception_record.number_parameters >= 1) {
MDAccessViolationTypeWin av_type =
static_cast<MDAccessViolationTypeWin>
(raw_exception->exception_record.exception_information[0]);
switch (av_type) {
case MD_ACCESS_VIOLATION_WIN_READ:
reason = "EXCEPTION_ACCESS_VIOLATION_READ";
break;
case MD_ACCESS_VIOLATION_WIN_WRITE:
reason = "EXCEPTION_ACCESS_VIOLATION_WRITE";
break;
case MD_ACCESS_VIOLATION_WIN_EXEC:
reason = "EXCEPTION_ACCESS_VIOLATION_EXEC";
break;
default:
reason = "EXCEPTION_ACCESS_VIOLATION";
break;
}
} else {
reason = "EXCEPTION_ACCESS_VIOLATION";
}
if (address &&
raw_exception->exception_record.number_parameters >= 2) {
*address =
raw_exception->exception_record.exception_information[1];
}
break;
case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR:
// For EXCEPTION_IN_PAGE_ERROR, Windows puts the address that
// caused the fault in exception_information[1].
// exception_information[0] is 0 if the violation was caused by
// an attempt to read data, 1 if it was an attempt to write data,
// and 8 if this was a data execution violation.
// exception_information[2] contains the underlying NTSTATUS code,
// which is the explanation for why this error occured.
// This information is useful in addition to the code address, which
// will be present in the crash thread's instruction field anyway.
if (raw_exception->exception_record.number_parameters >= 1) {
MDInPageErrorTypeWin av_type =
static_cast<MDInPageErrorTypeWin>
(raw_exception->exception_record.exception_information[0]);
switch (av_type) {
case MD_IN_PAGE_ERROR_WIN_READ:
reason = "EXCEPTION_IN_PAGE_ERROR_READ";
break;
case MD_IN_PAGE_ERROR_WIN_WRITE:
reason = "EXCEPTION_IN_PAGE_ERROR_WRITE";
break;
case MD_IN_PAGE_ERROR_WIN_EXEC:
reason = "EXCEPTION_IN_PAGE_ERROR_EXEC";
break;
default:
reason = "EXCEPTION_IN_PAGE_ERROR";
break;
}
} else {
reason = "EXCEPTION_IN_PAGE_ERROR";
}
if (address &&
raw_exception->exception_record.number_parameters >= 2) {
*address =
raw_exception->exception_record.exception_information[1];
}
if (raw_exception->exception_record.number_parameters >= 3) {
uint32_t ntstatus =
static_cast<uint32_t>
(raw_exception->exception_record.exception_information[2]);
reason.append(" / ");
reason.append(NTStatusToString(ntstatus));
}
break;
case MD_EXCEPTION_CODE_WIN_INVALID_HANDLE:
reason = "EXCEPTION_INVALID_HANDLE";
break;
case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION:
reason = "EXCEPTION_ILLEGAL_INSTRUCTION";
break;
case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION:
reason = "EXCEPTION_NONCONTINUABLE_EXCEPTION";
break;
case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION:
reason = "EXCEPTION_INVALID_DISPOSITION";
break;
case MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED:
reason = "EXCEPTION_BOUNDS_EXCEEDED";
break;
case MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND:
reason = "EXCEPTION_FLT_DENORMAL_OPERAND";
break;
case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO:
reason = "EXCEPTION_FLT_DIVIDE_BY_ZERO";
break;
case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT:
reason = "EXCEPTION_FLT_INEXACT_RESULT";
break;
case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION:
reason = "EXCEPTION_FLT_INVALID_OPERATION";
break;
case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW:
reason = "EXCEPTION_FLT_OVERFLOW";
break;
case MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK:
reason = "EXCEPTION_FLT_STACK_CHECK";
break;
case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW:
reason = "EXCEPTION_FLT_UNDERFLOW";
break;
case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO:
reason = "EXCEPTION_INT_DIVIDE_BY_ZERO";
break;
case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW:
reason = "EXCEPTION_INT_OVERFLOW";
break;
case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION:
reason = "EXCEPTION_PRIV_INSTRUCTION";
break;
case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW:
reason = "EXCEPTION_STACK_OVERFLOW";
break;
case MD_EXCEPTION_CODE_WIN_BAD_FUNCTION_TABLE:
reason = "EXCEPTION_BAD_FUNCTION_TABLE";
break;
case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK:
reason = "EXCEPTION_POSSIBLE_DEADLOCK";
break;
case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN:
reason = "EXCEPTION_STACK_BUFFER_OVERRUN";
break;
case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION:
reason = "EXCEPTION_HEAP_CORRUPTION";
break;
case MD_EXCEPTION_OUT_OF_MEMORY:
reason = "Out of Memory";
break;
case MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION:
reason = "Unhandled C++ Exception";
break;
case MD_EXCEPTION_CODE_WIN_SIMULATED:
reason = "Simulated Exception";
break;
default:
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
case MD_OS_ANDROID:
case MD_OS_LINUX: {
char flags_string[11];
snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags);
switch (exception_code) {
case MD_EXCEPTION_CODE_LIN_SIGHUP:
reason = "SIGHUP";
break;
case MD_EXCEPTION_CODE_LIN_SIGINT:
reason = "SIGINT";
break;
case MD_EXCEPTION_CODE_LIN_SIGQUIT:
reason = "SIGQUIT";
break;
case MD_EXCEPTION_CODE_LIN_SIGILL:
reason = "SIGILL / ";
switch (exception_flags) {
case MD_EXCEPTION_FLAG_LIN_ILL_ILLOPC:
reason.append("ILL_ILLOPC");
break;
case MD_EXCEPTION_FLAG_LIN_ILL_ILLOPN:
reason.append("ILL_ILLOPN");
break;
case MD_EXCEPTION_FLAG_LIN_ILL_ILLADR:
reason.append("ILL_ILLADR");
break;
case MD_EXCEPTION_FLAG_LIN_ILL_ILLTRP:
reason.append("ILL_ILLTRP");
break;
case MD_EXCEPTION_FLAG_LIN_ILL_PRVOPC:
reason.append("ILL_PRVOPC");
break;
case MD_EXCEPTION_FLAG_LIN_ILL_PRVREG:
reason.append("ILL_PRVREG");
break;
case MD_EXCEPTION_FLAG_LIN_ILL_COPROC:
reason.append("ILL_COPROC");
break;
case MD_EXCEPTION_FLAG_LIN_ILL_BADSTK:
reason.append("ILL_BADSTK");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
case MD_EXCEPTION_CODE_LIN_SIGTRAP:
reason = "SIGTRAP";
break;
case MD_EXCEPTION_CODE_LIN_SIGABRT:
reason = "SIGABRT";
break;
case MD_EXCEPTION_CODE_LIN_SIGBUS:
reason = "SIGBUS / ";
switch (exception_flags) {
case MD_EXCEPTION_FLAG_LIN_BUS_ADRALN:
reason.append("BUS_ADALN");
break;
case MD_EXCEPTION_FLAG_LIN_BUS_ADRERR:
reason.append("BUS_ADRERR");
break;
case MD_EXCEPTION_FLAG_LIN_BUS_OBJERR:
reason.append("BUS_OBJERR");
break;
case MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AR:
reason.append("BUS_MCEERR_AR");
break;
case MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AO:
reason.append("BUS_MCEERR_AO");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
case MD_EXCEPTION_CODE_LIN_SIGFPE:
reason = "SIGFPE / ";
switch (exception_flags) {
case MD_EXCEPTION_FLAG_LIN_FPE_INTDIV:
reason.append("FPE_INTDIV");
break;
case MD_EXCEPTION_FLAG_LIN_FPE_INTOVF:
reason.append("FPE_INTOVF");
break;
case MD_EXCEPTION_FLAG_LIN_FPE_FLTDIV:
reason.append("FPE_FLTDIV");
break;
case MD_EXCEPTION_FLAG_LIN_FPE_FLTOVF:
reason.append("FPE_FLTOVF");
break;
case MD_EXCEPTION_FLAG_LIN_FPE_FLTUND:
reason.append("FPE_FLTUND");
break;
case MD_EXCEPTION_FLAG_LIN_FPE_FLTRES:
reason.append("FPE_FLTRES");
break;
case MD_EXCEPTION_FLAG_LIN_FPE_FLTINV:
reason.append("FPE_FLTINV");
break;
case MD_EXCEPTION_FLAG_LIN_FPE_FLTSUB:
reason.append("FPE_FLTSUB");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
case MD_EXCEPTION_CODE_LIN_SIGKILL:
reason = "SIGKILL";
break;
case MD_EXCEPTION_CODE_LIN_SIGUSR1:
reason = "SIGUSR1";
break;
case MD_EXCEPTION_CODE_LIN_SIGSEGV:
reason = "SIGSEGV /";
switch (exception_flags) {
case MD_EXCEPTION_FLAG_LIN_SEGV_MAPERR:
reason.append("SEGV_MAPERR");
break;
case MD_EXCEPTION_FLAG_LIN_SEGV_ACCERR:
reason.append("SEGV_ACCERR");
break;
case MD_EXCEPTION_FLAG_LIN_SEGV_BNDERR:
reason.append("SEGV_BNDERR");
break;
case MD_EXCEPTION_FLAG_LIN_SEGV_PKUERR:
reason.append("SEGV_PKUERR");
break;
default:
reason.append(flags_string);
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
case MD_EXCEPTION_CODE_LIN_SIGUSR2:
reason = "SIGUSR2";
break;
case MD_EXCEPTION_CODE_LIN_SIGPIPE:
reason = "SIGPIPE";
break;
case MD_EXCEPTION_CODE_LIN_SIGALRM:
reason = "SIGALRM";
break;
case MD_EXCEPTION_CODE_LIN_SIGTERM:
reason = "SIGTERM";
break;
case MD_EXCEPTION_CODE_LIN_SIGSTKFLT:
reason = "SIGSTKFLT";
break;
case MD_EXCEPTION_CODE_LIN_SIGCHLD:
reason = "SIGCHLD";
break;
case MD_EXCEPTION_CODE_LIN_SIGCONT:
reason = "SIGCONT";
break;
case MD_EXCEPTION_CODE_LIN_SIGSTOP:
reason = "SIGSTOP";
break;
case MD_EXCEPTION_CODE_LIN_SIGTSTP:
reason = "SIGTSTP";
break;
case MD_EXCEPTION_CODE_LIN_SIGTTIN:
reason = "SIGTTIN";
break;
case MD_EXCEPTION_CODE_LIN_SIGTTOU:
reason = "SIGTTOU";
break;
case MD_EXCEPTION_CODE_LIN_SIGURG:
reason = "SIGURG";
break;
case MD_EXCEPTION_CODE_LIN_SIGXCPU:
reason = "SIGXCPU";
break;
case MD_EXCEPTION_CODE_LIN_SIGXFSZ:
reason = "SIGXFSZ";
break;
case MD_EXCEPTION_CODE_LIN_SIGVTALRM:
reason = "SIGVTALRM";
break;
case MD_EXCEPTION_CODE_LIN_SIGPROF:
reason = "SIGPROF";
break;
case MD_EXCEPTION_CODE_LIN_SIGWINCH:
reason = "SIGWINCH";
break;
case MD_EXCEPTION_CODE_LIN_SIGIO:
reason = "SIGIO";
break;
case MD_EXCEPTION_CODE_LIN_SIGPWR:
reason = "SIGPWR";
break;
case MD_EXCEPTION_CODE_LIN_SIGSYS:
reason = "SIGSYS";
break;
case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED:
reason = "DUMP_REQUESTED";
break;
default:
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
case MD_OS_SOLARIS: {
switch (exception_code) {
case MD_EXCEPTION_CODE_SOL_SIGHUP:
reason = "SIGHUP";
break;
case MD_EXCEPTION_CODE_SOL_SIGINT:
reason = "SIGINT";
break;
case MD_EXCEPTION_CODE_SOL_SIGQUIT:
reason = "SIGQUIT";
break;
case MD_EXCEPTION_CODE_SOL_SIGILL:
reason = "SIGILL";
break;
case MD_EXCEPTION_CODE_SOL_SIGTRAP:
reason = "SIGTRAP";
break;
case MD_EXCEPTION_CODE_SOL_SIGIOT:
reason = "SIGIOT | SIGABRT";
break;
case MD_EXCEPTION_CODE_SOL_SIGEMT:
reason = "SIGEMT";
break;
case MD_EXCEPTION_CODE_SOL_SIGFPE:
reason = "SIGFPE";
break;
case MD_EXCEPTION_CODE_SOL_SIGKILL:
reason = "SIGKILL";
break;
case MD_EXCEPTION_CODE_SOL_SIGBUS:
reason = "SIGBUS";
break;
case MD_EXCEPTION_CODE_SOL_SIGSEGV:
reason = "SIGSEGV";
break;
case MD_EXCEPTION_CODE_SOL_SIGSYS:
reason = "SIGSYS";
break;
case MD_EXCEPTION_CODE_SOL_SIGPIPE:
reason = "SIGPIPE";
break;
case MD_EXCEPTION_CODE_SOL_SIGALRM:
reason = "SIGALRM";
break;
case MD_EXCEPTION_CODE_SOL_SIGTERM:
reason = "SIGTERM";
break;
case MD_EXCEPTION_CODE_SOL_SIGUSR1:
reason = "SIGUSR1";
break;
case MD_EXCEPTION_CODE_SOL_SIGUSR2:
reason = "SIGUSR2";
break;
case MD_EXCEPTION_CODE_SOL_SIGCLD:
reason = "SIGCLD | SIGCHLD";
break;
case MD_EXCEPTION_CODE_SOL_SIGPWR:
reason = "SIGPWR";
break;
case MD_EXCEPTION_CODE_SOL_SIGWINCH:
reason = "SIGWINCH";
break;
case MD_EXCEPTION_CODE_SOL_SIGURG:
reason = "SIGURG";
break;
case MD_EXCEPTION_CODE_SOL_SIGPOLL:
reason = "SIGPOLL | SIGIO";
break;
case MD_EXCEPTION_CODE_SOL_SIGSTOP:
reason = "SIGSTOP";
break;
case MD_EXCEPTION_CODE_SOL_SIGTSTP:
reason = "SIGTSTP";
break;
case MD_EXCEPTION_CODE_SOL_SIGCONT:
reason = "SIGCONT";
break;
case MD_EXCEPTION_CODE_SOL_SIGTTIN:
reason = "SIGTTIN";
break;
case MD_EXCEPTION_CODE_SOL_SIGTTOU:
reason = "SIGTTOU";
break;
case MD_EXCEPTION_CODE_SOL_SIGVTALRM:
reason = "SIGVTALRM";
break;
case MD_EXCEPTION_CODE_SOL_SIGPROF:
reason = "SIGPROF";
break;
case MD_EXCEPTION_CODE_SOL_SIGXCPU:
reason = "SIGXCPU";
break;
case MD_EXCEPTION_CODE_SOL_SIGXFSZ:
reason = "SIGXFSZ";
break;
case MD_EXCEPTION_CODE_SOL_SIGWAITING:
reason = "SIGWAITING";
break;
case MD_EXCEPTION_CODE_SOL_SIGLWP:
reason = "SIGLWP";
break;
case MD_EXCEPTION_CODE_SOL_SIGFREEZE:
reason = "SIGFREEZE";
break;
case MD_EXCEPTION_CODE_SOL_SIGTHAW:
reason = "SIGTHAW";
break;
case MD_EXCEPTION_CODE_SOL_SIGCANCEL:
reason = "SIGCANCEL";
break;
case MD_EXCEPTION_CODE_SOL_SIGLOST:
reason = "SIGLOST";
break;
case MD_EXCEPTION_CODE_SOL_SIGXRES:
reason = "SIGXRES";
break;
case MD_EXCEPTION_CODE_SOL_SIGJVM1:
reason = "SIGJVM1";
break;
case MD_EXCEPTION_CODE_SOL_SIGJVM2:
reason = "SIGJVM2";
break;
default:
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
break;
}
case MD_OS_PS3: {
switch (exception_code) {
case MD_EXCEPTION_CODE_PS3_UNKNOWN:
reason = "UNKNOWN";
break;
case MD_EXCEPTION_CODE_PS3_TRAP_EXCEP:
reason = "TRAP_EXCEP";
break;
case MD_EXCEPTION_CODE_PS3_PRIV_INSTR:
reason = "PRIV_INSTR";
break;
case MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR:
reason = "ILLEGAL_INSTR";
break;
case MD_EXCEPTION_CODE_PS3_INSTR_STORAGE:
reason = "INSTR_STORAGE";
break;
case MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT:
reason = "INSTR_SEGMENT";
break;
case MD_EXCEPTION_CODE_PS3_DATA_STORAGE:
reason = "DATA_STORAGE";
break;
case MD_EXCEPTION_CODE_PS3_DATA_SEGMENT:
reason = "DATA_SEGMENT";
break;
case MD_EXCEPTION_CODE_PS3_FLOAT_POINT:
reason = "FLOAT_POINT";
break;
case MD_EXCEPTION_CODE_PS3_DABR_MATCH:
reason = "DABR_MATCH";
break;
case MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP:
reason = "ALIGN_EXCEP";
break;
case MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS:
reason = "MEMORY_ACCESS";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_ALIGN:
reason = "COPRO_ALIGN";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM:
reason = "COPRO_INVALID_COM";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_ERR:
reason = "COPRO_ERR";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_FIR:
reason = "COPRO_FIR";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT:
reason = "COPRO_DATA_SEGMENT";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE:
reason = "COPRO_DATA_STORAGE";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR:
reason = "COPRO_STOP_INSTR";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR:
reason = "COPRO_HALT_INSTR";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN:
reason = "COPRO_HALTINSTR_UNKNOWN";
break;
case MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS:
reason = "COPRO_MEMORY_ACCESS";
break;
case MD_EXCEPTION_CODE_PS3_GRAPHIC:
reason = "GRAPHIC";
break;
default:
BPLOG(INFO) << "Unknown exception reason "<< reason;
break;
}
break;
}
default: {
BPLOG(INFO) << "Unknown exception reason " << reason;
break;
}
}
return reason;
}