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:
emaste 2017-08-10 13:51:04 +00:00
parent 2fa55a61fb
commit fde983be8b
4 changed files with 12 additions and 50 deletions

View File

@ -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();

View File

@ -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

View File

@ -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.

View File

@ -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