Actually it looks like those calls may be redundant now as it's being
handled by StopInfo. This patch gets attach resume/interrupt working for me
on Linux.
On Fri, Mar 21, 2014 at 7:21 PM, Andrew MacPherson <[email protected]>wrote:
> Thanks Jim, LinuxSignals.cpp had SIGSTOP marked as suppress = false unlike
> UnixSignals.cpp which had it correctly marked suppress = true. With that
> fixed though the SIGSTOP is still getting set due to the call to
> SetResumeSignal() in POSIXThread::SignalDeliveredNotify() it looks like.
> Should this code also be using the signals table to decide whether to
> suppress it?
>
> Thanks again.
>
>
>
> On Fri, Mar 21, 2014 at 6:58 PM, <[email protected]> wrote:
>
>> Sorry, that's StopInfoSignal::WillResume.
>>
>> Jim
>>
>> On Mar 21, 2014, at 10:54 AM, [email protected] wrote:
>>
>> > Somebody is not paying attention to the "process handle" settings.
>> Normally SIGSTOP is set not to pass:
>> >
>> > (lldb) process handle SIGSTOP
>> > NAME PASS STOP NOTIFY
>> > ========== ===== ===== ======
>> > SIGSTOP false true true
>> >
>> > This check should be done in Process::WillResume:
>> >
>> > virtual void
>> > WillResume (lldb::StateType resume_state)
>> > {
>> > ThreadSP thread_sp (m_thread_wp.lock());
>> > if (thread_sp)
>> > {
>> > if
>> (thread_sp->GetProcess()->GetUnixSignals().GetShouldSuppress(m_value) ==
>> false)
>> > thread_sp->SetResumeSignal(m_value);
>> > }
>> > }
>> >
>> > I wonder why this isn't happening in your case?
>> >
>> > Jim
>> >
>> >
>> > On Mar 21, 2014, at 10:46 AM, Andrew MacPherson <[email protected]>
>> wrote:
>> >
>> >> Currently when attaching to a running process on Linux, a SIGSTOP
>> signal is (incorrectly I think) injected into the inferior on resume. This
>> can be reproduced by simply launching any process and then in a separate
>> terminal doing:
>> >>
>> >> sudo lldb -p <pid>
>> >> c
>> >> process interrupt
>> >> c
>> >>
>> >> On the second continue the SIGSTOP that was used to stop the process
>> is injected into the inferior by being passed to PTRACE_CONT, resulting in
>> the process going into a stop state outside the control of LLDB. The
>> SIGSTOP comes from the SetResumeSignal() call in POSIXThread and StopInfo.
>> >>
>> >> I can't think of any reason why a SIGSTOP should ever be injected into
>> the inferior so as a test I simply prevented it from ever happening:
>> >>
>> >> diff --git a/source/Plugins/Process/Linux/ProcessMonitor.cpp
>> b/source/Plugins/Process/Linux/ProcessMonitor.cpp
>> >> index 3dec6de..3079379 100644
>> >> --- a/source/Plugins/Process/Linux/ProcessMonitor.cpp
>> >> +++ b/source/Plugins/Process/Linux/ProcessMonitor.cpp
>> >> @@ -2209,6 +2209,9 @@ ProcessMonitor::Resume(lldb::tid_t tid, uint32_t
>> signo)
>> >> bool result;
>> >> Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet
>> (POSIX_LOG_PROCESS));
>> >>
>> >> + if (signo == SIGSTOP)
>> >> + signo = eResumeSignalNone;
>> >> +
>> >> if (log)
>> >> log->Printf ("ProcessMonitor::%s() resuming thread = %"
>> PRIu64 " with signal %s", __FUNCTION__, tid,
>> >>
>> m_process->GetUnixSignals().GetSignalAsCString (signo));
>> >>
>> >> This resolves the issue and doesn't cause any other problems that I
>> can find but almost certainly isn't the proper fix. My main concern is that
>> all of the resume signal code is shared with other OSes which I'm guessing
>> treat this differently.
>> >>
>> >> Any thoughts as to what the proper fix here might be?
>> >>
>> >> Thanks,
>> >> Andrew
>> >> _______________________________________________
>> >> lldb-dev mailing list
>> >> [email protected]
>> >> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>> >
>> > _______________________________________________
>> > lldb-dev mailing list
>> > [email protected]
>> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>>
>>
>
diff --git a/source/Plugins/Process/Linux/LinuxSignals.cpp b/source/Plugins/Process/Linux/LinuxSignals.cpp
index 585b8eb..cf8c105 100644
--- a/source/Plugins/Process/Linux/LinuxSignals.cpp
+++ b/source/Plugins/Process/Linux/LinuxSignals.cpp
@@ -50,7 +50,7 @@ LinuxSignals::Reset()
#endif
ADDSIGNAL(CHLD, false, false, true, "child process exit");
ADDSIGNAL(CONT, false, true, true, "process continue");
- ADDSIGNAL(STOP, false, true, true, "process stop");
+ ADDSIGNAL(STOP, true, true, true, "process stop");
ADDSIGNAL(TSTP, false, true, true, "tty stop");
ADDSIGNAL(TTIN, false, true, true, "background tty read");
ADDSIGNAL(TTOU, false, true, true, "background tty write");
diff --git a/source/Plugins/Process/POSIX/POSIXThread.cpp b/source/Plugins/Process/POSIX/POSIXThread.cpp
index 99c5873..f6deece 100644
--- a/source/Plugins/Process/POSIX/POSIXThread.cpp
+++ b/source/Plugins/Process/POSIX/POSIXThread.cpp
@@ -558,18 +558,14 @@ void
POSIXThread::SignalNotify(const ProcessMessage &message)
{
int signo = message.GetSignal();
-
SetStopInfo (StopInfo::CreateStopReasonWithSignal(*this, signo));
- SetResumeSignal(signo);
}
void
POSIXThread::SignalDeliveredNotify(const ProcessMessage &message)
{
int signo = message.GetSignal();
-
SetStopInfo (StopInfo::CreateStopReasonWithSignal(*this, signo));
- SetResumeSignal(signo);
}
void
@@ -588,7 +584,6 @@ POSIXThread::CrashNotify(const ProcessMessage &message)
SetStopInfo (lldb::StopInfoSP(new POSIXCrashStopInfo(*this, signo,
message.GetCrashReason(),
message.GetFaultAddress())));
- SetResumeSignal(signo);
}
void
_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev