[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 09:57:34 PST 2015


Hello Abid,

Yes, it works.

FYI: I have added comment back (see r230351).

Thanks,
Ilia


On Tue, Feb 24, 2015 at 8:25 PM, Abid, Hafiz <Hafiz_Abid at mentor.com> wrote:

>  Hi Ilia,
>
> I have adjusted this test a bit to fix the failure on Linux in 230347.
> Please check that it has not broken for you.
>
>
>
> Thanks,
>
> Abid
>
>
>
> *From:* Ilia K [mailto:ki.stfu at gmail.com]
> *Sent:* 24 February 2015 10:37
> *To:* dawn at burble.org
> *Cc:* Abid, Hafiz; lldb-commits at cs.uiuc.edu
> *Subject:* Re: [Lldb-commits] [lldb] r230237 - Fix a problem where
> lldb-mi would not stop the debuggee after -exec-interrupt command.
>
>
>
> 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/d2028fa3/attachment.html>


More information about the lldb-commits mailing list