lldb: Report inferior signals as signals, not exceptions, on FreeBSD
This is the FreeBSD equivalent of LLVM r238549. This serves 2 purposes: * LLDB should handle inferior process signals SIGSEGV/SIGILL/SIGBUS/ SIGFPE the way it is suppose to be handled. Prior to this fix these signals will neither create a coredump, nor exit from the debugger or work for signal handling scenario. * eInvalidCrashReason need not report "unknown crash reason" if we have a valid si_signo llvm.org/pr23699 Patch by Karnajit Wangkhem Differential Revision: https://reviews.llvm.org/D35223 Submitted by: Karnajit Wangkhem Obtained from: LLVM r310591
This commit is contained in:
parent
2fa55a61fb
commit
fde983be8b
@ -375,6 +375,7 @@ void FreeBSDThread::Notify(const ProcessMessage &message) {
|
||||
LimboNotify(message);
|
||||
break;
|
||||
|
||||
case ProcessMessage::eCrashMessage:
|
||||
case ProcessMessage::eSignalMessage:
|
||||
SignalNotify(message);
|
||||
break;
|
||||
@ -395,10 +396,6 @@ void FreeBSDThread::Notify(const ProcessMessage &message) {
|
||||
WatchNotify(message);
|
||||
break;
|
||||
|
||||
case ProcessMessage::eCrashMessage:
|
||||
CrashNotify(message);
|
||||
break;
|
||||
|
||||
case ProcessMessage::eExecMessage:
|
||||
ExecNotify(message);
|
||||
break;
|
||||
@ -577,7 +574,14 @@ void FreeBSDThread::LimboNotify(const ProcessMessage &message) {
|
||||
|
||||
void FreeBSDThread::SignalNotify(const ProcessMessage &message) {
|
||||
int signo = message.GetSignal();
|
||||
SetStopInfo(StopInfo::CreateStopReasonWithSignal(*this, signo));
|
||||
if (message.GetKind() == ProcessMessage::eCrashMessage) {
|
||||
std::string stop_description = GetCrashReasonString(
|
||||
message.GetCrashReason(), message.GetFaultAddress());
|
||||
SetStopInfo(StopInfo::CreateStopReasonWithSignal(
|
||||
*this, signo, stop_description.c_str()));
|
||||
} else {
|
||||
SetStopInfo(StopInfo::CreateStopReasonWithSignal(*this, signo));
|
||||
}
|
||||
}
|
||||
|
||||
void FreeBSDThread::SignalDeliveredNotify(const ProcessMessage &message) {
|
||||
@ -585,21 +589,6 @@ void FreeBSDThread::SignalDeliveredNotify(const ProcessMessage &message) {
|
||||
SetStopInfo(StopInfo::CreateStopReasonWithSignal(*this, signo));
|
||||
}
|
||||
|
||||
void FreeBSDThread::CrashNotify(const ProcessMessage &message) {
|
||||
// FIXME: Update stop reason as per bugzilla 14598
|
||||
int signo = message.GetSignal();
|
||||
|
||||
assert(message.GetKind() == ProcessMessage::eCrashMessage);
|
||||
|
||||
Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD));
|
||||
if (log)
|
||||
log->Printf("FreeBSDThread::%s () signo = %i, reason = '%s'", __FUNCTION__,
|
||||
signo, message.PrintCrashReason());
|
||||
|
||||
SetStopInfo(lldb::StopInfoSP(new POSIXCrashStopInfo(
|
||||
*this, signo, message.GetCrashReason(), message.GetFaultAddress())));
|
||||
}
|
||||
|
||||
unsigned FreeBSDThread::GetRegisterIndexFromOffset(unsigned offset) {
|
||||
unsigned reg = LLDB_INVALID_REGNUM;
|
||||
ArchSpec arch = HostInfo::GetArchitecture();
|
||||
|
@ -27,22 +27,6 @@ bool POSIXLimboStopInfo::ShouldStop(Event *event_ptr) { return false; }
|
||||
|
||||
bool POSIXLimboStopInfo::ShouldNotify(Event *event_ptr) { return false; }
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// POSIXCrashStopInfo
|
||||
|
||||
POSIXCrashStopInfo::POSIXCrashStopInfo(FreeBSDThread &thread, uint32_t status,
|
||||
CrashReason reason,
|
||||
lldb::addr_t fault_addr)
|
||||
: POSIXStopInfo(thread, status) {
|
||||
m_description = ::GetCrashReasonString(reason, fault_addr);
|
||||
}
|
||||
|
||||
POSIXCrashStopInfo::~POSIXCrashStopInfo() {}
|
||||
|
||||
lldb::StopReason POSIXCrashStopInfo::GetStopReason() const {
|
||||
return lldb::eStopReasonException;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// POSIXNewThreadStopInfo
|
||||
|
||||
|
@ -44,19 +44,6 @@ public:
|
||||
bool ShouldNotify(lldb_private::Event *event_ptr);
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// @class POSIXCrashStopInfo
|
||||
/// @brief Represents the stop state of process that is ready to crash.
|
||||
///
|
||||
class POSIXCrashStopInfo : public POSIXStopInfo {
|
||||
public:
|
||||
POSIXCrashStopInfo(FreeBSDThread &thread, uint32_t status, CrashReason reason,
|
||||
lldb::addr_t fault_addr);
|
||||
~POSIXCrashStopInfo();
|
||||
|
||||
lldb::StopReason GetStopReason() const;
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// @class POSIXNewThreadStopInfo
|
||||
/// @brief Represents the stop state of process when a new thread is spawned.
|
||||
|
@ -1192,7 +1192,9 @@ ProcessMessage ProcessMonitor::MonitorSignal(ProcessMonitor *monitor,
|
||||
case SIGBUS:
|
||||
lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
|
||||
const auto reason = GetCrashReason(*info);
|
||||
return ProcessMessage::Crash(tid, reason, signo, fault_addr);
|
||||
if (reason != CrashReason::eInvalidCrashReason) {
|
||||
return ProcessMessage::Crash(tid, reason, signo, fault_addr);
|
||||
} // else; Use atleast si_signo info for other si_code
|
||||
}
|
||||
|
||||
// Everything else is "normal" and does not require any special action on
|
||||
|
Loading…
x
Reference in New Issue
Block a user