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

Reply via email to