[Lldb-commits] [lldb] r230237 - Fix a problem where lldb-mi would not stop the debuggee after -exec-interrupt command.
dawn at burble.org
dawn at burble.org
Mon Feb 23 17:31:30 PST 2015
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
More information about the lldb-commits
mailing list