11#include "llvm/Support/raw_ostream.h"
17void AppendFaultAddr(std::string &str,
lldb::addr_t addr) {
19 ss <<
" (fault address: 0x" << std::hex << addr <<
")";
23#if defined(si_lower) && defined(si_upper)
24void AppendBounds(std::string &str,
lldb::addr_t lower_bound,
26 llvm::raw_string_ostream stream(str);
27 if ((
unsigned long)addr < lower_bound)
28 stream <<
": lower bound violation ";
30 stream <<
": upper bound violation ";
31 stream <<
"(fault address: 0x";
32 stream.write_hex(addr);
33 stream <<
", lower bound: 0x";
34 stream.write_hex(lower_bound);
35 stream <<
", upper bound: 0x";
36 stream.write_hex(upper_bound);
42CrashReason GetCrashReasonForSIGSEGV(
const siginfo_t &info) {
43 assert(info.si_signo == SIGSEGV);
45 switch (info.si_code) {
78CrashReason GetCrashReasonForSIGILL(
const siginfo_t &info) {
79 assert(info.si_signo == SIGILL);
81 switch (info.si_code) {
103CrashReason GetCrashReasonForSIGFPE(
const siginfo_t &info) {
104 assert(info.si_signo == SIGFPE);
106 switch (info.si_code) {
128CrashReason GetCrashReasonForSIGBUS(
const siginfo_t &info) {
129 assert(info.si_signo == SIGBUS);
131 switch (info.si_code) {
148#if defined(si_lower) && defined(si_upper)
150 str =
"signal SIGSEGV";
151 AppendBounds(str,
reinterpret_cast<uintptr_t
>(info.si_lower),
152 reinterpret_cast<uintptr_t
>(info.si_upper),
153 reinterpret_cast<uintptr_t
>(info.si_addr));
159 reinterpret_cast<uintptr_t
>(info.si_addr));
167 str =
"unknown crash reason";
171 str =
"signal SIGSEGV: invalid address";
172 AppendFaultAddr(str, fault_addr);
175 str =
"signal SIGSEGV: address access protected";
176 AppendFaultAddr(str, fault_addr);
179 str =
"signal SIGSEGV: bound violation";
182 str =
"signal SIGSEGV: async tag check fault";
185 str =
"signal SIGSEGV: sync tag check fault";
186 AppendFaultAddr(str, fault_addr);
189 str =
"signal SIGILL: illegal instruction";
192 str =
"signal SIGILL: illegal instruction operand";
195 str =
"signal SIGILL: illegal addressing mode";
198 str =
"signal SIGILL: illegal trap";
201 str =
"signal SIGILL: privileged instruction";
204 str =
"signal SIGILL: privileged register";
207 str =
"signal SIGILL: coprocessor error";
210 str =
"signal SIGILL: internal stack error";
213 str =
"signal SIGBUS: illegal alignment";
216 str =
"signal SIGBUS: illegal address";
219 str =
"signal SIGBUS: hardware error";
222 str =
"signal SIGFPE: integer divide by zero";
225 str =
"signal SIGFPE: integer overflow";
228 str =
"signal SIGFPE: floating point divide by zero";
231 str =
"signal SIGFPE: floating point overflow";
234 str =
"signal SIGFPE: floating point underflow";
237 str =
"signal SIGFPE: inexact floating point result";
240 str =
"signal SIGFPE: invalid floating point operation";
243 str =
"signal SIGFPE: invalid floating point subscript range";
251 const char *str =
nullptr;
255 str =
"eInvalidCrashReason";
260 str =
"eInvalidAddress";
263 str =
"ePrivilegedAddress";
266 str =
"eBoundViolation";
269 str =
"eAsyncTagCheckFault";
272 str =
"eSyncTagCheckFault";
277 str =
"eIllegalOpcode";
280 str =
"eIllegalOperand";
283 str =
"eIllegalAddressingMode";
286 str =
"eIllegalTrap";
289 str =
"ePrivilegedOpcode";
292 str =
"ePrivilegedRegister";
295 str =
"eCoprocessorError";
298 str =
"eInternalStackError";
303 str =
"eIllegalAlignment";
306 str =
"eIllegalAddress";
309 str =
"eHardwareError";
314 str =
"eIntegerDivideByZero";
317 str =
"eIntegerOverflow";
320 str =
"eFloatDivideByZero";
323 str =
"eFloatOverflow";
326 str =
"eFloatUnderflow";
329 str =
"eFloatInexactResult";
332 str =
"eFloatInvalidOperation";
335 str =
"eFloatSubscriptRange";
342 switch (info.si_signo) {
344 return GetCrashReasonForSIGSEGV(info);
346 return GetCrashReasonForSIGBUS(info);
348 return GetCrashReasonForSIGFPE(info);
350 return GetCrashReasonForSIGILL(info);
353 assert(
false &&
"unexpected signal");
const char * CrashReasonAsString(CrashReason reason)
std::string GetCrashReasonString(CrashReason reason, const siginfo_t &info)
CrashReason GetCrashReason(const siginfo_t &info)