Author: Michał Górny Date: 2020-11-10T14:18:03+01:00 New Revision: e637602e7ac9bb5721dbe079fa783cee891139b4
URL: https://github.com/llvm/llvm-project/commit/e637602e7ac9bb5721dbe079fa783cee891139b4 DIFF: https://github.com/llvm/llvm-project/commit/e637602e7ac9bb5721dbe079fa783cee891139b4.diff LOG: [lldb] [Process/FreeBSDRemote] Fix handling user-generated SIGTRAP Update the SIGTRAP handler to account for the possibility of SIGTRAP being generated by the user, i.e. not having any specific debugging event associated with it, as well as receiving unknown SIGTRAPs. These instances of SIGTRAP are passed to the regular signal handler. Differential Revision: https://reviews.llvm.org/D91007 Added: Modified: lldb/source/Plugins/Process/FreeBSDRemote/NativeProcessFreeBSD.cpp lldb/test/API/functionalities/signal/raise/TestRaise.py Removed: ################################################################################ diff --git a/lldb/source/Plugins/Process/FreeBSDRemote/NativeProcessFreeBSD.cpp b/lldb/source/Plugins/Process/FreeBSDRemote/NativeProcessFreeBSD.cpp index 5c10c9c8cd07..8f0936c169b9 100644 --- a/lldb/source/Plugins/Process/FreeBSDRemote/NativeProcessFreeBSD.cpp +++ b/lldb/source/Plugins/Process/FreeBSDRemote/NativeProcessFreeBSD.cpp @@ -192,7 +192,8 @@ void NativeProcessFreeBSD::MonitorSIGTRAP(lldb::pid_t pid) { } assert(info.pl_event == PL_EVENT_SIGNAL); - LLDB_LOG(log, "got SIGTRAP, pid = {0}, lwpid = {1}", pid, info.pl_lwpid); + LLDB_LOG(log, "got SIGTRAP, pid = {0}, lwpid = {1}, flags = {2:x}", pid, + info.pl_lwpid, info.pl_flags); NativeThreadFreeBSD *thread = nullptr; if (info.pl_flags & (PL_FLAG_BORN | PL_FLAG_EXITED)) { @@ -240,6 +241,8 @@ void NativeProcessFreeBSD::MonitorSIGTRAP(lldb::pid_t pid) { if (info.pl_flags & PL_FLAG_SI) { assert(info.pl_siginfo.si_signo == SIGTRAP); + LLDB_LOG(log, "SIGTRAP siginfo: si_code = {0}, pid = {1}", + info.pl_siginfo.si_code, info.pl_siginfo.si_pid); switch (info.pl_siginfo.si_code) { case TRAP_BRKPT: @@ -248,7 +251,7 @@ void NativeProcessFreeBSD::MonitorSIGTRAP(lldb::pid_t pid) { FixupBreakpointPCAsNeeded(*thread); } SetState(StateType::eStateStopped, true); - break; + return; case TRAP_TRACE: if (thread) { auto ®ctx = static_cast<NativeRegisterContextFreeBSD &>( @@ -272,9 +275,14 @@ void NativeProcessFreeBSD::MonitorSIGTRAP(lldb::pid_t pid) { } SetState(StateType::eStateStopped, true); - break; + return; } } + + // Either user-generated SIGTRAP or an unknown event that would + // otherwise leave the debugger hanging. + LLDB_LOG(log, "unknown SIGTRAP, passing to generic handler"); + MonitorSignal(pid, SIGTRAP); } void NativeProcessFreeBSD::MonitorSignal(lldb::pid_t pid, int signal) { diff --git a/lldb/test/API/functionalities/signal/raise/TestRaise.py b/lldb/test/API/functionalities/signal/raise/TestRaise.py index 93df3b1f93a9..70271e43cff5 100644 --- a/lldb/test/API/functionalities/signal/raise/TestRaise.py +++ b/lldb/test/API/functionalities/signal/raise/TestRaise.py @@ -30,7 +30,6 @@ def test_sigsigrtmin(self): self.signal_test('SIGRTMIN', True) @skipIfNetBSD # Hangs on NetBSD - @skipIfFreeBSD # hangs def test_sigtrap(self): self.build() self.signal_test('SIGTRAP', True) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits