diff options
Diffstat (limited to 'lldb/source/Plugins')
-rw-r--r-- | lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/POSIX/CrashReason.cpp | 42 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/POSIX/CrashReason.h | 3 |
3 files changed, 42 insertions, 6 deletions
diff --git a/lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp b/lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp index ebe80da81c4..d18d3c16d2c 100644 --- a/lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp @@ -316,8 +316,7 @@ void NativeThreadLinux::SetStoppedBySignal(uint32_t signo, (info->si_signo == SIGBUS && info->si_code == SI_KERNEL) ? CrashReason::eInvalidAddress : GetCrashReason(*info); - m_stop_description = GetCrashReasonString( - reason, reinterpret_cast<uintptr_t>(info->si_addr)); + m_stop_description = GetCrashReasonString(reason, *info); break; } } diff --git a/lldb/source/Plugins/Process/POSIX/CrashReason.cpp b/lldb/source/Plugins/Process/POSIX/CrashReason.cpp index c567b4a9655..a7d36fc998e 100644 --- a/lldb/source/Plugins/Process/POSIX/CrashReason.cpp +++ b/lldb/source/Plugins/Process/POSIX/CrashReason.cpp @@ -9,6 +9,8 @@ #include "CrashReason.h" +#include "llvm/Support/raw_ostream.h" + #include <sstream> namespace { @@ -19,6 +21,23 @@ void AppendFaultAddr(std::string &str, lldb::addr_t addr) { str += ss.str(); } +void AppendBounds(std::string &str, lldb::addr_t lower_bound, + lldb::addr_t upper_bound, lldb::addr_t addr) { + llvm::raw_string_ostream stream(str); + if ((unsigned long)addr < lower_bound) + stream << ": lower bound violation "; + else + stream << ": upper bound violation "; + stream << "(fault address: 0x"; + stream.write_hex(addr); + stream << ", lower bound: 0x"; + stream.write_hex(lower_bound); + stream << ", upper bound: 0x"; + stream.write_hex(upper_bound); + stream << ")"; + stream.flush(); +} + CrashReason GetCrashReasonForSIGSEGV(const siginfo_t &info) { assert(info.si_signo == SIGSEGV); @@ -34,6 +53,11 @@ CrashReason GetCrashReasonForSIGSEGV(const siginfo_t &info) { return CrashReason::eInvalidAddress; case SEGV_ACCERR: return CrashReason::ePrivilegedAddress; +#ifndef SEGV_BNDERR +#define SEGV_BNDERR 3 +#endif + case SEGV_BNDERR: + return CrashReason::eBoundViolation; } assert(false && "unexpected si_code for SIGSEGV"); @@ -109,7 +133,7 @@ CrashReason GetCrashReasonForSIGBUS(const siginfo_t &info) { } } -std::string GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr) { +std::string GetCrashReasonString(CrashReason reason, const siginfo_t &info) { std::string str; switch (reason) { @@ -119,11 +143,20 @@ std::string GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr) { case CrashReason::eInvalidAddress: str = "signal SIGSEGV: invalid address"; - AppendFaultAddr(str, fault_addr); + AppendFaultAddr(str, reinterpret_cast<lldb::addr_t>(info.si_addr)); break; case CrashReason::ePrivilegedAddress: str = "signal SIGSEGV: address access protected"; - AppendFaultAddr(str, fault_addr); + AppendFaultAddr(str, reinterpret_cast<lldb::addr_t>(info.si_addr)); + break; + case CrashReason::eBoundViolation: + str = "signal SIGSEGV"; +// Make sure that siginfo_t has the bound fields available. +#if defined(si_lower) && defined(si_upper) + AppendBounds(str, reinterpret_cast<lldb::addr_t>(info.si_lower), + reinterpret_cast<lldb::addr_t>(info.si_upper), + reinterpret_cast<lldb::addr_t>(info.si_addr)); +#endif break; case CrashReason::eIllegalOpcode: str = "signal SIGILL: illegal instruction"; @@ -207,6 +240,9 @@ const char *CrashReasonAsString(CrashReason reason) { case CrashReason::ePrivilegedAddress: str = "ePrivilegedAddress"; break; + case CrashReason::eBoundViolation: + str = "eBoundViolation"; + break; // SIGILL crash reasons. case CrashReason::eIllegalOpcode: diff --git a/lldb/source/Plugins/Process/POSIX/CrashReason.h b/lldb/source/Plugins/Process/POSIX/CrashReason.h index 1ef3e1a6998..4e8ffa65253 100644 --- a/lldb/source/Plugins/Process/POSIX/CrashReason.h +++ b/lldb/source/Plugins/Process/POSIX/CrashReason.h @@ -22,6 +22,7 @@ enum class CrashReason { // SIGSEGV crash reasons. eInvalidAddress, ePrivilegedAddress, + eBoundViolation, // SIGILL crash reasons. eIllegalOpcode, @@ -49,7 +50,7 @@ enum class CrashReason { eFloatSubscriptRange }; -std::string GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr); +std::string GetCrashReasonString(CrashReason reason, const siginfo_t &info); const char *CrashReasonAsString(CrashReason reason); |