[lldb-dev] Resuming traced process on Linux and SIGSTOP

Andrew MacPherson andrew.macp at gmail.com
Fri Mar 21 11:35:35 PDT 2014


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 <andrew.macp at gmail.com>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, <jingham at apple.com> wrote:
>
>> Sorry, that's StopInfoSignal::WillResume.
>>
>> Jim
>>
>> On Mar 21, 2014, at 10:54 AM, jingham at apple.com 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 <andrew.macp at gmail.com>
>> 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
>> >> lldb-dev at cs.uiuc.edu
>> >> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>> >
>> > _______________________________________________
>> > lldb-dev mailing list
>> > lldb-dev at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20140321/4725d519/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: SIGSTOP-resume.patch
Type: text/x-diff
Size: 1794 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20140321/4725d519/attachment.patch>


More information about the lldb-dev mailing list