[Lldb-commits] [lldb] r230237 - Fix a problem where lldb-mi would not stop the debuggee after -exec-interrupt command.

Ilia K ki.stfu at gmail.com
Tue Feb 24 02:37:01 PST 2015


Fixed by r230320.

Thanks,
Ilia

On Tue, Feb 24, 2015 at 1:19 PM, Ilia K <ki.stfu at gmail.com> wrote:

> Hello Dawn,
>
> I'll fix this problem soon. Sorry for inconvenience.
>
> Thanks,
> Ilia
>
> On Tue, Feb 24, 2015 at 4:31 AM, <dawn at burble.org> wrote:
>
>> This commit the broke test_lldbmi_stopped_when_stopatentry_remote test of
>> TestMiNotification.py on our master/upstream OSX build.
>>
>> On Mon, Feb 23, 2015 at 06:27:18PM -0000, Hafiz Abid Qadeer wrote:
>> > Author: abidh
>> > Date: Mon Feb 23 12:27:17 2015
>> > New Revision: 230237
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=230237&view=rev
>> > Log:
>> > Fix a problem where lldb-mi would not stop the debuggee after
>> -exec-interrupt command.
>> >
>> > Summary:
>> > This revision fixes a problem where lldb-mi would not stop the
>> execution after exec-interrupt call.
>> > On Linux, SIGSTOP is used to stop the debuggee process. LLDB stopped
>> the debuggee alright. But when
>> > lldb-mi received the notification of stopping with reason as SIGSTOP,
>> it would resume the process.
>> > This was heppening in
>> CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal. This function
>> aslo
>> > used hard coded numbers for signal istead of symbolic names.
>> >
>> > This revision changes code to treat SIGSTOP reason as SIGINT. Also used
>> symbolic names for signals
>> > instead of numbers.
>> >
>> > Reviewers: ki.stfu, clayborg
>> >
>> > Reviewed By: ki.stfu, clayborg
>> >
>> > Subscribers: zturner, lldb-commits
>> >
>> > Differential Revision: http://reviews.llvm.org/D7783
>> >
>> > Modified:
>> >     lldb/trunk/test/tools/lldb-mi/signal/TestMiSignal.py
>> >     lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
>> >     lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h
>> >
>> > Modified: lldb/trunk/test/tools/lldb-mi/signal/TestMiSignal.py
>> > URL:
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/signal/TestMiSignal.py?rev=230237&r1=230236&r2=230237&view=diff
>> >
>> ==============================================================================
>> > --- lldb/trunk/test/tools/lldb-mi/signal/TestMiSignal.py (original)
>> > +++ lldb/trunk/test/tools/lldb-mi/signal/TestMiSignal.py Mon Feb 23
>> 12:27:17 2015
>> > @@ -37,7 +37,7 @@ class MiSignalTestCase(lldbmi_testcase.M
>> >
>> >          # Test that -exec-interrupt can interrupt an execution
>> >          self.runCmd("-exec-interrupt")
>> > -        self.expect("\*stopped,reason=\"signal-received\"")
>> > +
>> self.expect("\*stopped,reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\",.*thread-id=\"1\",stopped-threads=\"all\"")
>> >
>> >          # Continue (to loop forever)
>> >          self.runCmd("-exec-continue")
>> > @@ -45,7 +45,7 @@ class MiSignalTestCase(lldbmi_testcase.M
>> >
>> >          # Test that Ctrl+C can interrupt an execution
>> >          self.child.sendintr() #FIXME: here uses self.child directly
>> > -        self.expect("\*stopped,reason=\"signal-received\"")
>> > +
>> self.expect("\*stopped,reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\",.*thread-id=\"1\",stopped-threads=\"all\"")
>> >
>> >      @lldbmi_test
>> >      @expectedFailureWindows("llvm.org/pr22274: need a pexpect
>> replacement for windows")
>> >
>> > Modified: lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp?rev=230237&r1=230236&r2=230237&view=diff
>> >
>> ==============================================================================
>> > --- lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
>> (original)
>> > +++ lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp Mon Feb
>> 23 12:27:17 2015
>> > @@ -27,6 +27,7 @@
>> >  #include "lldb/API/SBThread.h"
>> >  #include "lldb/API/SBCommandInterpreter.h"
>> >  #include "lldb/API/SBCommandReturnObject.h"
>> > +#include "lldb/API/SBUnixSignals.h"
>> >  #ifdef _WIN32
>> >  #include <io.h> // For the ::_access()
>> >  #else
>> > @@ -88,6 +89,11 @@ CMICmnLLDBDebuggerHandleEvents::Initiali
>> >          return MIstatus::success;
>> >
>> >      m_bInitialized = MIstatus::success;
>> > +    m_bSignalsInitialized = false;
>> > +    m_SIGINT = 0;
>> > +    m_SIGSTOP = 0;
>> > +    m_SIGSEGV = 0;
>> > +    m_SIGTRAP = 0;
>> >
>> >      return m_bInitialized;
>> >  }
>> > @@ -832,106 +838,103 @@ CMICmnLLDBDebuggerHandleEvents::HandlePr
>> >  {
>> >      bool bOk = MIstatus::success;
>> >
>> > +    InitializeSignals ();
>> >      lldb::SBProcess sbProcess =
>> CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
>> >      const MIuint64 nStopReason =
>> sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0);
>> > -    switch (nStopReason)
>> > +    if (nStopReason == m_SIGINT || nStopReason == m_SIGSTOP)
>> >      {
>> > -        case 2: // Terminal interrupt signal. SIGINT
>> > -        {
>> > -            // MI print
>> "*stopped,reason=\"signal-received\",signal-name=\"SIGNINT\",signal-meaning=\"Interrupt\",frame={%s}"
>> > -            const CMICmnMIValueConst miValueConst("signal-received");
>> > -            const CMICmnMIValueResult miValueResult("reason",
>> miValueConst);
>> > -            CMICmnMIOutOfBandRecord
>> miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped,
>> miValueResult);
>> > -            const CMICmnMIValueConst miValueConst2("SIGINT");
>> > -            const CMICmnMIValueResult miValueResult2("signal-name",
>> miValueConst2);
>> > -            bOk = miOutOfBandRecord.Add(miValueResult2);
>> > -            const CMICmnMIValueConst miValueConst3("Interrupt");
>> > -            const CMICmnMIValueResult miValueResult3("signal-meaning",
>> miValueConst3);
>> > -            bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
>> > -            CMICmnMIValueTuple miValueTuple;
>> > -            bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
>> > -            const CMICmnMIValueResult miValueResult5("frame",
>> miValueTuple);
>> > -            bOk = bOk && miOutOfBandRecord.Add(miValueResult5);
>> > -            bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
>> > -            bOk = bOk && TextToStdout("(gdb)");
>> > -        }
>> > -        break;
>> > -        case 11: // Invalid memory reference. SIGSEGV
>> > -        {
>> > -            // MI print
>> "*stopped,reason=\"signal-received\",signal-name=\"SIGSEGV\",signal-meaning=\"Segmentation
>> > -            // fault\",thread-id=\"%d\",frame={%s}"
>> > -            const CMICmnMIValueConst miValueConst("signal-received");
>> > -            const CMICmnMIValueResult miValueResult("reason",
>> miValueConst);
>> > -            CMICmnMIOutOfBandRecord
>> miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped,
>> miValueResult);
>> > -            const CMICmnMIValueConst miValueConst2("SIGSEGV");
>> > -            const CMICmnMIValueResult miValueResult2("signal-name",
>> miValueConst2);
>> > -            bOk = miOutOfBandRecord.Add(miValueResult2);
>> > -            const CMICmnMIValueConst miValueConst3("Segmentation
>> fault");
>> > -            const CMICmnMIValueResult miValueResult3("signal-meaning",
>> miValueConst3);
>> > -            bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
>> > -            const CMIUtilString
>> strThreadId(CMIUtilString::Format("%d",
>> sbProcess.GetSelectedThread().GetIndexID()));
>> > -            const CMICmnMIValueConst miValueConst4(strThreadId);
>> > -            const CMICmnMIValueResult miValueResult4("thread-id",
>> miValueConst4);
>> > -            bOk = bOk && miOutOfBandRecord.Add(miValueResult4);
>> > -            CMICmnMIValueTuple miValueTuple;
>> > -            bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
>> > -            const CMICmnMIValueResult miValueResult5("frame",
>> miValueTuple);
>> > -            bOk = bOk && miOutOfBandRecord.Add(miValueResult5);
>> > -            bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
>> > -            // Note no "(gdb)" output here
>> > -        }
>> > -        break;
>> > -        case 19:
>> > -            if (sbProcess.IsValid())
>> > -                sbProcess.Continue();
>> > -            break;
>> > -        case 5: //  Trace/breakpoint trap. SIGTRAP
>> > +        // MI print
>> "*stopped,reason=\"signal-received\",signal-name=\"SIGNINT\",signal-meaning=\"Interrupt\",frame={%s}"
>> > +        const CMICmnMIValueConst miValueConst("signal-received");
>> > +        const CMICmnMIValueResult miValueResult("reason",
>> miValueConst);
>> > +        CMICmnMIOutOfBandRecord
>> miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped,
>> miValueResult);
>> > +        const CMICmnMIValueConst miValueConst2("SIGINT");
>> > +        const CMICmnMIValueResult miValueResult2("signal-name",
>> miValueConst2);
>> > +        bOk = miOutOfBandRecord.Add(miValueResult2);
>> > +        const CMICmnMIValueConst miValueConst3("Interrupt");
>> > +        const CMICmnMIValueResult miValueResult3("signal-meaning",
>> miValueConst3);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
>> > +        CMICmnMIValueTuple miValueTuple;
>> > +        bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
>> > +        const CMICmnMIValueResult miValueResult5("frame",
>> miValueTuple);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult5);
>> > +        const CMIUtilString strThreadId(CMIUtilString::Format("%d",
>> sbProcess.GetSelectedThread().GetIndexID()));
>> > +        const CMICmnMIValueConst miValueConst6(strThreadId);
>> > +        const CMICmnMIValueResult miValueResult6("thread-id",
>> miValueConst6);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult6);
>> > +        const CMICmnMIValueConst miValueConst7("all");
>> > +        const CMICmnMIValueResult miValueResult7("stopped-threads",
>> miValueConst7);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult7);
>> > +        bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
>> > +        bOk = bOk && TextToStdout("(gdb)");
>> > +    }
>> > +    else if (nStopReason == m_SIGSEGV)
>> > +    {
>> > +        // MI print
>> "*stopped,reason=\"signal-received\",signal-name=\"SIGSEGV\",signal-meaning=\"Segmentation
>> > +        // fault\",thread-id=\"%d\",frame={%s}"
>> > +        const CMICmnMIValueConst miValueConst("signal-received");
>> > +        const CMICmnMIValueResult miValueResult("reason",
>> miValueConst);
>> > +        CMICmnMIOutOfBandRecord
>> miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped,
>> miValueResult);
>> > +        const CMICmnMIValueConst miValueConst2("SIGSEGV");
>> > +        const CMICmnMIValueResult miValueResult2("signal-name",
>> miValueConst2);
>> > +        bOk = miOutOfBandRecord.Add(miValueResult2);
>> > +        const CMICmnMIValueConst miValueConst3("Segmentation fault");
>> > +        const CMICmnMIValueResult miValueResult3("signal-meaning",
>> miValueConst3);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
>> > +        const CMIUtilString strThreadId(CMIUtilString::Format("%d",
>> sbProcess.GetSelectedThread().GetIndexID()));
>> > +        const CMICmnMIValueConst miValueConst4(strThreadId);
>> > +        const CMICmnMIValueResult miValueResult4("thread-id",
>> miValueConst4);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult4);
>> > +        CMICmnMIValueTuple miValueTuple;
>> > +        bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
>> > +        const CMICmnMIValueResult miValueResult5("frame",
>> miValueTuple);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult5);
>> > +        bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
>> > +        // Note no "(gdb)" output here
>> > +    }
>> > +    else if (nStopReason == m_SIGTRAP)
>> > +    {
>> > +        lldb::SBThread thread = sbProcess.GetSelectedThread();
>> > +        const MIuint nFrames = thread.GetNumFrames();
>> > +        if (nFrames > 0)
>> >          {
>> > -            lldb::SBThread thread = sbProcess.GetSelectedThread();
>> > -            const MIuint nFrames = thread.GetNumFrames();
>> > -            if (nFrames > 0)
>> > +            lldb::SBFrame frame = thread.GetFrameAtIndex(0);
>> > +            const char *pFnName = frame.GetFunctionName();
>> > +            if (pFnName != nullptr)
>> >              {
>> > -                lldb::SBFrame frame = thread.GetFrameAtIndex(0);
>> > -                const char *pFnName = frame.GetFunctionName();
>> > -                if (pFnName != nullptr)
>> > -                {
>> > -                    const CMIUtilString fnName =
>> CMIUtilString(pFnName);
>> > -                    static const CMIUtilString threadCloneFn =
>> CMIUtilString("__pthread_clone");
>> > +                const CMIUtilString fnName = CMIUtilString(pFnName);
>> > +                static const CMIUtilString threadCloneFn =
>> CMIUtilString("__pthread_clone");
>> >
>> > -                    if (CMIUtilString::Compare(threadCloneFn, fnName))
>> > +                if (CMIUtilString::Compare(threadCloneFn, fnName))
>> > +                {
>> > +                    if (sbProcess.IsValid())
>> >                      {
>> > -                        if (sbProcess.IsValid())
>> > -                        {
>> > -                            sbProcess.Continue();
>> > -                            vwrbShouldBrk = true;
>> > -                            break;
>> > -                        }
>> > +                        sbProcess.Continue();
>> > +                        vwrbShouldBrk = true;
>> >                      }
>> >                  }
>> >              }
>> >          }
>> > -        default:
>> > -        {
>> > -            // MI print
>> "*stopped,reason=\"signal-received\",signal=\"%lld\",thread-id=\"%d\",stopped-threads=\"all\""
>> > -            const CMICmnMIValueConst miValueConst("signal-received");
>> > -            const CMICmnMIValueResult miValueResult("reason",
>> miValueConst);
>> > -            CMICmnMIOutOfBandRecord
>> miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped,
>> miValueResult);
>> > -            const CMIUtilString
>> strReason(CMIUtilString::Format("%lld", nStopReason));
>> > -            const CMICmnMIValueConst miValueConst2(strReason);
>> > -            const CMICmnMIValueResult miValueResult2("signal",
>> miValueConst2);
>> > -            bOk = miOutOfBandRecord.Add(miValueResult2);
>> > -            const CMIUtilString
>> strThreadId(CMIUtilString::Format("%d",
>> sbProcess.GetSelectedThread().GetIndexID()));
>> > -            const CMICmnMIValueConst miValueConst3(strThreadId);
>> > -            const CMICmnMIValueResult miValueResult3("thread-id",
>> miValueConst3);
>> > -            bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
>> > -            const CMICmnMIValueConst miValueConst4("all");
>> > -            const CMICmnMIValueResult
>> miValueResult4("stopped-threads", miValueConst4);
>> > -            bOk = bOk && miOutOfBandRecord.Add(miValueResult4);
>> > -            bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
>> > -            bOk = bOk && TextToStdout("(gdb)");
>> > -        }
>> > -    } // switch( nStopReason )
>> > -
>> > +    }
>> > +    else
>> > +    {
>> > +        // MI print
>> "*stopped,reason=\"signal-received\",signal=\"%lld\",thread-id=\"%d\",stopped-threads=\"all\""
>> > +        const CMICmnMIValueConst miValueConst("signal-received");
>> > +        const CMICmnMIValueResult miValueResult("reason",
>> miValueConst);
>> > +        CMICmnMIOutOfBandRecord
>> miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped,
>> miValueResult);
>> > +        const CMIUtilString strReason(CMIUtilString::Format("%lld",
>> nStopReason));
>> > +        const CMICmnMIValueConst miValueConst2(strReason);
>> > +        const CMICmnMIValueResult miValueResult2("signal",
>> miValueConst2);
>> > +        bOk = miOutOfBandRecord.Add(miValueResult2);
>> > +        const CMIUtilString strThreadId(CMIUtilString::Format("%d",
>> sbProcess.GetSelectedThread().GetIndexID()));
>> > +        const CMICmnMIValueConst miValueConst3(strThreadId);
>> > +        const CMICmnMIValueResult miValueResult3("thread-id",
>> miValueConst3);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
>> > +        const CMICmnMIValueConst miValueConst4("all");
>> > +        const CMICmnMIValueResult miValueResult4("stopped-threads",
>> miValueConst4);
>> > +        bOk = bOk && miOutOfBandRecord.Add(miValueResult4);
>> > +        bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
>> > +        bOk = bOk && TextToStdout("(gdb)");
>> > +    }
>> >      return bOk;
>> >  }
>> >
>> > @@ -1651,3 +1654,29 @@ CMICmnLLDBDebuggerHandleEvents::TextToSt
>> >  {
>> >      return CMICmnStreamStderr::TextToStderr(vrTxt);
>> >  }
>> > +
>> > +//++
>> ------------------------------------------------------------------------------------
>> > +// Details: Initialize the member variables with the signal values in
>> this process
>> > +//          file.
>> > +// Type:    Method.
>> > +// Args:    None
>> > +// Return:  Noen
>> > +// Throws:  None.
>> > +//--
>> > +void
>> > +CMICmnLLDBDebuggerHandleEvents::InitializeSignals()
>> > +{
>> > +    if (!m_bSignalsInitialized)
>> > +    {
>> > +        lldb::SBProcess sbProcess =
>> CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
>> > +        if (sbProcess.IsValid())
>> > +        {
>> > +            lldb::SBUnixSignals unix_signals =
>> sbProcess.GetUnixSignals();
>> > +            m_SIGINT = unix_signals.GetSignalNumberFromName("SIGINT");
>> > +            m_SIGSTOP =
>> unix_signals.GetSignalNumberFromName("SIGSTOP");
>> > +            m_SIGSEGV =
>> unix_signals.GetSignalNumberFromName("SIGSEGV");
>> > +            m_SIGTRAP =
>> unix_signals.GetSignalNumberFromName("SIGTRAP");
>> > +            m_bSignalsInitialized = true;
>> > +        }
>> > +    }
>> > +}
>> >
>> > Modified: lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h
>> > URL:
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h?rev=230237&r1=230236&r2=230237&view=diff
>> >
>> ==============================================================================
>> > --- lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h (original)
>> > +++ lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h Mon Feb 23
>> 12:27:17 2015
>> > @@ -92,4 +92,10 @@ class CMICmnLLDBDebuggerHandleEvents : p
>> >    private:
>> >      // From CMICmnBase
>> >      /* dtor */ virtual ~CMICmnLLDBDebuggerHandleEvents(void);
>> > +    void InitializeSignals();
>> > +    bool m_bSignalsInitialized;
>> > +    MIuint64 m_SIGINT;
>> > +    MIuint64 m_SIGSTOP;
>> > +    MIuint64 m_SIGSEGV;
>> > +    MIuint64 m_SIGTRAP;
>> >  };
>> >
>> >
>> > _______________________________________________
>> > lldb-commits mailing list
>> > lldb-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150224/c0f25291/attachment.html>


More information about the lldb-commits mailing list