[Lldb-commits] [lldb] r237426 - Fix a reason of *stopped notifications due to SIGINT/SIGSTOP signals (MI)
jingham at apple.com
jingham at apple.com
Fri May 15 09:17:25 PDT 2015
I can't comment on the MI side, but exposing GetInterruptedFromEvent is fine.
Jim
> On May 15, 2015, at 2:29 AM, Ilia K <ki.stfu at gmail.com> wrote:
>
> Author: ki.stfu
> Date: Fri May 15 04:29:09 2015
> New Revision: 237426
>
> URL: http://llvm.org/viewvc/llvm-project?rev=237426&view=rev
> Log:
> Fix a reason of *stopped notifications due to SIGINT/SIGSTOP signals (MI)
>
> # Add SBProcess::GetInterruptedFromEvent
> # Add vrEvent arg in CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateStopped
> and CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal
> # Refactor CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal
> ## Clean up and fix typos
> ## Remove vwrbShouldBrk arg
> # Fix MiSignalTestCase.test_lldbmi_stopped_when_stopatentry_{local,remote}
> to expect SIGSTOP instead of SIGINT
>
>
> Modified:
> lldb/trunk/include/lldb/API/SBProcess.h
> lldb/trunk/scripts/interface/SBProcess.i
> lldb/trunk/source/API/SBProcess.cpp
> 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/include/lldb/API/SBProcess.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBProcess.h?rev=237426&r1=237425&r2=237426&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/API/SBProcess.h (original)
> +++ lldb/trunk/include/lldb/API/SBProcess.h Fri May 15 04:29:09 2015
> @@ -260,6 +260,9 @@ public:
>
> static lldb::SBProcess
> GetProcessFromEvent (const lldb::SBEvent &event);
> +
> + static bool
> + GetInterruptedFromEvent (const lldb::SBEvent &event);
>
> static bool
> EventIsProcessEvent (const lldb::SBEvent &event);
>
> Modified: lldb/trunk/scripts/interface/SBProcess.i
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBProcess.i?rev=237426&r1=237425&r2=237426&view=diff
> ==============================================================================
> --- lldb/trunk/scripts/interface/SBProcess.i (original)
> +++ lldb/trunk/scripts/interface/SBProcess.i Fri May 15 04:29:09 2015
> @@ -349,6 +349,9 @@ public:
> GetProcessFromEvent (const lldb::SBEvent &event);
>
> static bool
> + GetInterruptedFromEvent (const lldb::SBEvent &event);
> +
> + static bool
> EventIsProcessEvent (const lldb::SBEvent &event);
>
> lldb::SBBroadcaster
>
> Modified: lldb/trunk/source/API/SBProcess.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBProcess.cpp?rev=237426&r1=237425&r2=237426&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBProcess.cpp (original)
> +++ lldb/trunk/source/API/SBProcess.cpp Fri May 15 04:29:09 2015
> @@ -999,6 +999,12 @@ SBProcess::GetProcessFromEvent (const SB
> }
>
> bool
> +SBProcess::GetInterruptedFromEvent (const SBEvent &event)
> +{
> + return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
> +}
> +
> +bool
> SBProcess::EventIsProcessEvent (const SBEvent &event)
> {
> return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass();
>
> 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=237426&r1=237425&r2=237426&view=diff
> ==============================================================================
> --- lldb/trunk/test/tools/lldb-mi/signal/TestMiSignal.py (original)
> +++ lldb/trunk/test/tools/lldb-mi/signal/TestMiSignal.py Fri May 15 04:29:09 2015
> @@ -66,9 +66,9 @@ class MiSignalTestCase(lldbmi_testcase.M
>
> # Test that *stopped is printed
> # Note that message is different in Darwin and Linux:
> - # Darwin: "*stopped,reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\",frame={level=\"0\",addr=\"0x[0-9a-f]+\",func=\"_dyld_start\",file=\"??\",fullname=\"??\",line=\"-1\"},thread-id=\"1\",stopped-threads=\"all\"
> + # Darwin: "*stopped,reason=\"signal-received\",signal-name=\"SIGSTOP\",signal-meaning=\"Stop\",frame={level=\"0\",addr=\"0x[0-9a-f]+\",func=\"_dyld_start\",file=\"??\",fullname=\"??\",line=\"-1\"},thread-id=\"1\",stopped-threads=\"all\"
> # Linux: "*stopped,reason=\"end-stepping-range\",frame={addr=\"0x[0-9a-f]+\",func=\"??\",args=[],file=\"??\",fullname=\"??\",line=\"-1\"},thread-id=\"1\",stopped-threads=\"all\"
> - self.expect([ "\*stopped,reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\",frame=\{level=\"0\",addr=\"0x[0-9a-f]+\",func=\"_dyld_start\",file=\"\?\?\",fullname=\"\?\?\",line=\"-1\"\},thread-id=\"1\",stopped-threads=\"all\"",
> + self.expect([ "\*stopped,reason=\"signal-received\",signal-name=\"SIGSTOP\",signal-meaning=\"Stop\",frame=\{level=\"0\",addr=\"0x[0-9a-f]+\",func=\"_dyld_start\",file=\"\?\?\",fullname=\"\?\?\",line=\"-1\"\},thread-id=\"1\",stopped-threads=\"all\"",
> "\*stopped,reason=\"end-stepping-range\",frame={addr=\"0x[0-9a-f]+\",func=\"\?\?\",args=\[\],file=\"\?\?\",fullname=\"\?\?\",line=\"-1\"},thread-id=\"1\",stopped-threads=\"all\"" ])
>
> # Run to main to make sure we have not exited the application
> @@ -111,7 +111,7 @@ class MiSignalTestCase(lldbmi_testcase.M
> self.expect("\^done")
>
> # Test that *stopped is printed
> - self.expect("\*stopped,reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\",.+?thread-id=\"1\",stopped-threads=\"all\"")
> + self.expect("\*stopped,reason=\"signal-received\",signal-name=\"SIGSTOP\",signal-meaning=\"Stop\",.+?thread-id=\"1\",stopped-threads=\"all\"")
>
> # Exit
> self.runCmd("-gdb-exit")
>
> Modified: lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp?rev=237426&r1=237425&r2=237426&view=diff
> ==============================================================================
> --- lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp (original)
> +++ lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp Fri May 15 04:29:09 2015
> @@ -835,7 +835,7 @@ CMICmnLLDBDebuggerHandleEvents::HandlePr
> break;
> case lldb::eStateStopped:
> pEventType = "eStateStopped";
> - bOk = HandleProcessEventStateStopped(bShouldBrk);
> + bOk = HandleProcessEventStateStopped(vEvent, bShouldBrk);
> if (bShouldBrk)
> break;
> case lldb::eStateCrashed:
> @@ -924,7 +924,7 @@ CMICmnLLDBDebuggerHandleEvents::HandlePr
> // Throws: None.
> //--
> bool
> -CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateStopped(bool &vwrbShouldBrk)
> +CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateStopped(const lldb::SBEvent &vrEvent, bool &vwrbShouldBrk)
> {
> if (!UpdateSelectedThread())
> return MIstatus::failure;
> @@ -955,7 +955,7 @@ CMICmnLLDBDebuggerHandleEvents::HandlePr
> break;
> case lldb::eStopReasonSignal:
> pEventType = "eStopReasonSignal";
> - bOk = HandleProcessEventStopSignal(vwrbShouldBrk);
> + bOk = HandleProcessEventStopSignal(vrEvent);
> break;
> case lldb::eStopReasonException:
> pEventType = "eStopReasonException";
> @@ -985,22 +985,23 @@ CMICmnLLDBDebuggerHandleEvents::HandlePr
> //++ ------------------------------------------------------------------------------------
> // Details: Asynchronous event handler for LLDB Process stop signal.
> // Type: Method.
> -// Args: vwrbShouldBrk - (W) True = Yes break, false = do not.
> +// Args: vrEvent - (R) An LLDB broadcast event.
> // Return: MIstatus::success - Functionality succeeded.
> // MIstatus::failure - Functionality failed.
> // Throws: None.
> //--
> bool
> -CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal(bool &vwrbShouldBrk)
> +CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal(const lldb::SBEvent &vrEvent)
> {
> bool bOk = MIstatus::success;
>
> InitializeSignals ();
> lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
> const MIuint64 nStopReason = sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0);
> - if (nStopReason == m_SIGINT || nStopReason == m_SIGSTOP)
> + const bool bInterrupted = lldb::SBProcess::GetInterruptedFromEvent(vrEvent);
> + if (nStopReason == m_SIGINT || (nStopReason == m_SIGSTOP && bInterrupted))
> {
> - // MI print "*stopped,reason=\"signal-received\",signal-name=\"SIGNINT\",signal-meaning=\"Interrupt\",frame={%s}"
> + // MI print "*stopped,reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\",frame={%s},thread-id=\"%d\",stopped-threads=\"all\""
> const CMICmnMIValueConst miValueConst("signal-received");
> const CMICmnMIValueResult miValueResult("reason", miValueConst);
> CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
> @@ -1012,22 +1013,47 @@ CMICmnLLDBDebuggerHandleEvents::HandlePr
> bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
> CMICmnMIValueTuple miValueTuple;
> bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
> - const CMICmnMIValueResult miValueResult5("frame", miValueTuple);
> + const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
> + bOk = bOk && miOutOfBandRecord.Add(miValueResult4);
> + const CMIUtilString strThreadId(CMIUtilString::Format("%" PRIu32, sbProcess.GetSelectedThread().GetIndexID()));
> + const CMICmnMIValueConst miValueConst5(strThreadId);
> + const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
> bOk = bOk && miOutOfBandRecord.Add(miValueResult5);
> - const CMIUtilString strThreadId(CMIUtilString::Format("%d", sbProcess.GetSelectedThread().GetIndexID()));
> - const CMICmnMIValueConst miValueConst6(strThreadId);
> - const CMICmnMIValueResult miValueResult6("thread-id", miValueConst6);
> + const CMICmnMIValueConst miValueConst6("all");
> + const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6);
> + bOk = bOk && miOutOfBandRecord.Add(miValueResult6);
> + bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
> + bOk = bOk && CMICmnStreamStdout::WritePrompt();
> + }
> + else if (nStopReason == m_SIGSTOP)
> + {
> + // MI print "*stopped,reason=\"signal-received\",signal-name=\"SIGSTOP\",signal-meaning=\"Stop\",frame={%s},thread-id=\"%d\",stopped-threads=\"all\""
> + const CMICmnMIValueConst miValueConst("signal-received");
> + const CMICmnMIValueResult miValueResult("reason", miValueConst);
> + CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
> + const CMICmnMIValueConst miValueConst2("SIGSTOP");
> + const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2);
> + bOk = miOutOfBandRecord.Add(miValueResult2);
> + const CMICmnMIValueConst miValueConst3("Stop");
> + const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3);
> + bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
> + CMICmnMIValueTuple miValueTuple;
> + bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
> + const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
> + bOk = bOk && miOutOfBandRecord.Add(miValueResult4);
> + const CMIUtilString strThreadId(CMIUtilString::Format("%" PRIu32, sbProcess.GetSelectedThread().GetIndexID()));
> + const CMICmnMIValueConst miValueConst5(strThreadId);
> + const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
> + bOk = bOk && miOutOfBandRecord.Add(miValueResult5);
> + const CMICmnMIValueConst miValueConst6("all");
> + const CMICmnMIValueResult miValueResult6("stopped-threads", 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 && CMICmnStreamStdout::WritePrompt();
> }
> else if (nStopReason == m_SIGSEGV)
> {
> - // MI print "*stopped,reason=\"signal-received\",signal-name=\"SIGSEGV\",signal-meaning=\"Segmentation
> - // fault\",thread-id=\"%d\",frame={%s}"
> + // 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);
> @@ -1037,13 +1063,13 @@ CMICmnLLDBDebuggerHandleEvents::HandlePr
> 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);
> + const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
> + bOk = bOk && miOutOfBandRecord.Add(miValueResult4);
> + const CMIUtilString strThreadId(CMIUtilString::Format("%d", sbProcess.GetSelectedThread().GetIndexID()));
> + const CMICmnMIValueConst miValueConst5(strThreadId);
> + const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
> bOk = bOk && miOutOfBandRecord.Add(miValueResult5);
> bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
> // Note no "(gdb)" output here
> @@ -1064,24 +1090,33 @@ CMICmnLLDBDebuggerHandleEvents::HandlePr
> if (CMIUtilString::Compare(threadCloneFn, fnName))
> {
> if (sbProcess.IsValid())
> - {
> sbProcess.Continue();
> - vwrbShouldBrk = true;
> - }
> }
> }
> }
> }
> else
> {
> - // MI print "*stopped,reason=\"signal-received\",signal=\"%lld\",thread-id=\"%d\",stopped-threads=\"all\""
> + // MI print "*stopped,reason=\"signal-received\",signal-name=\"%s\",thread-id=\"%d\",stopped-threads=\"all\""
> + // MI print "*stopped,reason=\"signal-received\",signal=\"%d\",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);
> + lldb::SBUnixSignals sbUnixSignals = sbProcess.GetUnixSignals();
> + const MIchar *pSignal = sbUnixSignals.GetSignalAsCString(nStopReason);
> + if (pSignal)
> + {
> + const CMICmnMIValueConst miValueConst2(pSignal);
> + const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2);
> + bOk = miOutOfBandRecord.Add(miValueResult2);
> + }
> + else
> + {
> + const CMIUtilString strSignal(CMIUtilString::Format("%" PRIu64, nStopReason));
> + const CMICmnMIValueConst miValueConst2(strSignal);
> + 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);
>
> Modified: lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h?rev=237426&r1=237425&r2=237426&view=diff
> ==============================================================================
> --- lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h (original)
> +++ lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h Fri May 15 04:29:09 2015
> @@ -63,10 +63,10 @@ class CMICmnLLDBDebuggerHandleEvents : p
> bool HandleProcessEventBroadcastBitStateChanged(const lldb::SBEvent &vEvent);
> bool HandleProcessEventStateRunning(void);
> bool HandleProcessEventStateExited(void);
> - bool HandleProcessEventStateStopped(bool &vwrbShouldBrk);
> + bool HandleProcessEventStateStopped(const lldb::SBEvent &vrEvent, bool &vwrbShouldBrk);
> bool HandleProcessEventStopReasonTrace(void);
> bool HandleProcessEventStopReasonBreakpoint(void);
> - bool HandleProcessEventStopSignal(bool &vwrbShouldBrk);
> + bool HandleProcessEventStopSignal(const lldb::SBEvent &vrEvent);
> bool HandleProcessEventStopException(void);
> bool HandleProcessEventStateSuspended(const lldb::SBEvent &vEvent);
> bool HandleTargetEventBroadcastBitModulesLoaded(const lldb::SBEvent &vEvent);
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list