[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