summaryrefslogtreecommitdiffstats
path: root/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp')
-rw-r--r--lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp2906
1 files changed, 1491 insertions, 1415 deletions
diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp b/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
index ea6485bdc67..e975dd6525e 100644
--- a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
+++ b/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
@@ -9,14 +9,14 @@
// Third party headers:
#include "lldb/API/SBAddress.h"
+#include "lldb/API/SBBreakpoint.h"
+#include "lldb/API/SBCommandInterpreter.h"
+#include "lldb/API/SBCommandReturnObject.h"
#include "lldb/API/SBEvent.h"
#include "lldb/API/SBProcess.h"
-#include "lldb/API/SBBreakpoint.h"
#include "lldb/API/SBStream.h"
#include "lldb/API/SBTarget.h"
#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()
@@ -25,45 +25,45 @@
#endif // _WIN32
// In-house headers:
+#include "MICmnLLDBDebugSessionInfo.h"
+#include "MICmnLLDBDebugger.h"
#include "MICmnLLDBDebuggerHandleEvents.h"
-#include "MICmnResources.h"
#include "MICmnLog.h"
-#include "MICmnLLDBDebugger.h"
-#include "MICmnLLDBDebugSessionInfo.h"
+#include "MICmnMIOutOfBandRecord.h"
#include "MICmnMIResultRecord.h"
#include "MICmnMIValueConst.h"
#include "MICmnMIValueList.h"
-#include "MICmnMIOutOfBandRecord.h"
-#include "MICmnStreamStdout.h"
+#include "MICmnResources.h"
#include "MICmnStreamStderr.h"
-#include "MIUtilDebug.h"
+#include "MICmnStreamStdout.h"
#include "MIDriver.h"
+#include "MIUtilDebug.h"
#include "Platform.h" // for PATH_MAX
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: CMICmnLLDBDebuggerHandleEvents constructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
-CMICmnLLDBDebuggerHandleEvents::CMICmnLLDBDebuggerHandleEvents()
-{
-}
+CMICmnLLDBDebuggerHandleEvents::CMICmnLLDBDebuggerHandleEvents() {}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: CMICmnLLDBDebuggerHandleEvents destructor.
// Type: Overridable.
// Args: None.
// Return: None.
// Throws: None.
//--
-CMICmnLLDBDebuggerHandleEvents::~CMICmnLLDBDebuggerHandleEvents()
-{
- Shutdown();
+CMICmnLLDBDebuggerHandleEvents::~CMICmnLLDBDebuggerHandleEvents() {
+ Shutdown();
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Initialize resources for *this broadcaster object.
// Type: Method.
// Args: None.
@@ -71,25 +71,24 @@ CMICmnLLDBDebuggerHandleEvents::~CMICmnLLDBDebuggerHandleEvents()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::Initialize()
-{
- m_clientUsageRefCnt++;
-
- if (m_bInitialized)
- 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;
+bool CMICmnLLDBDebuggerHandleEvents::Initialize() {
+ m_clientUsageRefCnt++;
+
+ if (m_bInitialized)
+ 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;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Release resources for *this broadcaster object.
// Type: Method.
// Args: None.
@@ -97,23 +96,24 @@ CMICmnLLDBDebuggerHandleEvents::Initialize()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::Shutdown()
-{
- if (--m_clientUsageRefCnt > 0)
- return MIstatus::success;
+bool CMICmnLLDBDebuggerHandleEvents::Shutdown() {
+ if (--m_clientUsageRefCnt > 0)
+ return MIstatus::success;
- if (!m_bInitialized)
- return MIstatus::success;
+ if (!m_bInitialized)
+ return MIstatus::success;
- m_bInitialized = false;
+ m_bInitialized = false;
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Interpret the event object to ascertain the action to take or information to
-// to form and put in a MI Out-of-band record object which is given to stdout.
+//++
+//------------------------------------------------------------------------------------
+// Details: Interpret the event object to ascertain the action to take or
+// information to
+// to form and put in a MI Out-of-band record object which is given to
+// stdout.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
// vrbHandledEvent - (W) True - event handled, false = not handled.
@@ -121,42 +121,34 @@ CMICmnLLDBDebuggerHandleEvents::Shutdown()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEvent(const lldb::SBEvent &vEvent, bool &vrbHandledEvent)
-{
- bool bOk = MIstatus::success;
- vrbHandledEvent = false;
-
- if (lldb::SBProcess::EventIsProcessEvent(vEvent))
- {
- vrbHandledEvent = true;
- bOk = HandleEventSBProcess(vEvent);
- }
- else if (lldb::SBBreakpoint::EventIsBreakpointEvent(vEvent))
- {
- vrbHandledEvent = true;
- bOk = HandleEventSBBreakPoint(vEvent);
- }
- else if (lldb::SBThread::EventIsThreadEvent(vEvent))
- {
- vrbHandledEvent = true;
- bOk = HandleEventSBThread(vEvent);
- }
- else if (lldb::SBTarget::EventIsTargetEvent(vEvent))
- {
- vrbHandledEvent = true;
- bOk = HandleEventSBTarget(vEvent);
- }
- else if (lldb::SBCommandInterpreter::EventIsCommandInterpreterEvent(vEvent))
- {
- vrbHandledEvent = true;
- bOk = HandleEventSBCommandInterpreter(vEvent);
- }
-
- return bOk;
+bool CMICmnLLDBDebuggerHandleEvents::HandleEvent(const lldb::SBEvent &vEvent,
+ bool &vrbHandledEvent) {
+ bool bOk = MIstatus::success;
+ vrbHandledEvent = false;
+
+ if (lldb::SBProcess::EventIsProcessEvent(vEvent)) {
+ vrbHandledEvent = true;
+ bOk = HandleEventSBProcess(vEvent);
+ } else if (lldb::SBBreakpoint::EventIsBreakpointEvent(vEvent)) {
+ vrbHandledEvent = true;
+ bOk = HandleEventSBBreakPoint(vEvent);
+ } else if (lldb::SBThread::EventIsThreadEvent(vEvent)) {
+ vrbHandledEvent = true;
+ bOk = HandleEventSBThread(vEvent);
+ } else if (lldb::SBTarget::EventIsTargetEvent(vEvent)) {
+ vrbHandledEvent = true;
+ bOk = HandleEventSBTarget(vEvent);
+ } else if (lldb::SBCommandInterpreter::EventIsCommandInterpreterEvent(
+ vEvent)) {
+ vrbHandledEvent = true;
+ bOk = HandleEventSBCommandInterpreter(vEvent);
+ }
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle a LLDB SBProcess event.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
@@ -164,49 +156,119 @@ CMICmnLLDBDebuggerHandleEvents::HandleEvent(const lldb::SBEvent &vEvent, bool &v
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBProcess(const lldb::SBEvent &vEvent)
-{
- bool bOk = MIstatus::success;
-
- const char *pEventType = "";
- const MIuint nEventType = vEvent.GetType();
- switch (nEventType)
- {
- case lldb::SBProcess::eBroadcastBitInterrupt:
- pEventType = "eBroadcastBitInterrupt";
- break;
- case lldb::SBProcess::eBroadcastBitProfileData:
- pEventType = "eBroadcastBitProfileData";
- break;
- case lldb::SBProcess::eBroadcastBitStructuredData:
- pEventType = "eBroadcastBitStructuredData";
- break;
- case lldb::SBProcess::eBroadcastBitStateChanged:
- pEventType = "eBroadcastBitStateChanged";
- bOk = HandleProcessEventBroadcastBitStateChanged(vEvent);
- break;
- case lldb::SBProcess::eBroadcastBitSTDERR:
- pEventType = "eBroadcastBitSTDERR";
- bOk = GetProcessStderr();
- break;
- case lldb::SBProcess::eBroadcastBitSTDOUT:
- pEventType = "eBroadcastBitSTDOUT";
- bOk = GetProcessStdout();
- break;
- default:
- {
- const CMIUtilString msg(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), "SBProcess", (MIuint)nEventType));
- SetErrorDescription(msg);
- return MIstatus::failure;
- }
- }
- m_pLog->WriteLog(CMIUtilString::Format("##### An SB Process event occurred: %s", pEventType));
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBProcess(
+ const lldb::SBEvent &vEvent) {
+ bool bOk = MIstatus::success;
+
+ const char *pEventType = "";
+ const MIuint nEventType = vEvent.GetType();
+ switch (nEventType) {
+ case lldb::SBProcess::eBroadcastBitInterrupt:
+ pEventType = "eBroadcastBitInterrupt";
+ break;
+ case lldb::SBProcess::eBroadcastBitProfileData:
+ pEventType = "eBroadcastBitProfileData";
+ break;
+ case lldb::SBProcess::eBroadcastBitStructuredData:
+ pEventType = "eBroadcastBitStructuredData";
+ break;
+ case lldb::SBProcess::eBroadcastBitStateChanged:
+ pEventType = "eBroadcastBitStateChanged";
+ bOk = HandleProcessEventBroadcastBitStateChanged(vEvent);
+ break;
+ case lldb::SBProcess::eBroadcastBitSTDERR:
+ pEventType = "eBroadcastBitSTDERR";
+ bOk = GetProcessStderr();
+ break;
+ case lldb::SBProcess::eBroadcastBitSTDOUT:
+ pEventType = "eBroadcastBitSTDOUT";
+ bOk = GetProcessStdout();
+ break;
+ default: {
+ const CMIUtilString msg(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT),
+ "SBProcess", (MIuint)nEventType));
+ SetErrorDescription(msg);
+ return MIstatus::failure;
+ }
+ }
+ m_pLog->WriteLog(CMIUtilString::Format(
+ "##### An SB Process event occurred: %s", pEventType));
+
+ return bOk;
+}
- return bOk;
+//++
+//------------------------------------------------------------------------------------
+// Details: Handle a LLDB SBBreakpoint event.
+// Type: Method.
+// Args: vEvent - (R) An LLDB broadcast event.
+// Return: MIstatus::success - Functionality succeeded.
+// MIstatus::failure - Functionality failed.
+// Throws: None.
+//--
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakPoint(
+ const lldb::SBEvent &vEvent) {
+ bool bOk = MIstatus::success;
+
+ const char *pEventType = "";
+ const lldb::BreakpointEventType eEvent =
+ lldb::SBBreakpoint::GetBreakpointEventTypeFromEvent(vEvent);
+ switch (eEvent) {
+ case lldb::eBreakpointEventTypeThreadChanged:
+ pEventType = "eBreakpointEventTypeThreadChanged";
+ break;
+ case lldb::eBreakpointEventTypeLocationsRemoved:
+ pEventType = "eBreakpointEventTypeLocationsRemoved";
+ break;
+ case lldb::eBreakpointEventTypeInvalidType:
+ pEventType = "eBreakpointEventTypeInvalidType";
+ break;
+ case lldb::eBreakpointEventTypeLocationsAdded:
+ pEventType = "eBreakpointEventTypeLocationsAdded";
+ bOk = HandleEventSBBreakpointLocationsAdded(vEvent);
+ break;
+ case lldb::eBreakpointEventTypeAdded:
+ pEventType = "eBreakpointEventTypeAdded";
+ bOk = HandleEventSBBreakpointAdded(vEvent);
+ break;
+ case lldb::eBreakpointEventTypeRemoved:
+ pEventType = "eBreakpointEventTypeRemoved";
+ bOk = HandleEventSBBreakpointCmn(vEvent);
+ break;
+ case lldb::eBreakpointEventTypeLocationsResolved:
+ pEventType = "eBreakpointEventTypeLocationsResolved";
+ bOk = HandleEventSBBreakpointCmn(vEvent);
+ break;
+ case lldb::eBreakpointEventTypeEnabled:
+ pEventType = "eBreakpointEventTypeEnabled";
+ bOk = HandleEventSBBreakpointCmn(vEvent);
+ break;
+ case lldb::eBreakpointEventTypeDisabled:
+ pEventType = "eBreakpointEventTypeDisabled";
+ bOk = HandleEventSBBreakpointCmn(vEvent);
+ break;
+ case lldb::eBreakpointEventTypeCommandChanged:
+ pEventType = "eBreakpointEventTypeCommandChanged";
+ bOk = HandleEventSBBreakpointCmn(vEvent);
+ break;
+ case lldb::eBreakpointEventTypeConditionChanged:
+ pEventType = "eBreakpointEventTypeConditionChanged";
+ bOk = HandleEventSBBreakpointCmn(vEvent);
+ break;
+ case lldb::eBreakpointEventTypeIgnoreChanged:
+ pEventType = "eBreakpointEventTypeIgnoreChanged";
+ bOk = HandleEventSBBreakpointCmn(vEvent);
+ break;
+ }
+ m_pLog->WriteLog(CMIUtilString::Format(
+ "##### An SB Breakpoint event occurred: %s", pEventType));
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle a LLDB SBBreakpoint event.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
@@ -214,67 +276,24 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBProcess(const lldb::SBEvent &vEvent
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakPoint(const lldb::SBEvent &vEvent)
-{
- bool bOk = MIstatus::success;
-
- const char *pEventType = "";
- const lldb::BreakpointEventType eEvent = lldb::SBBreakpoint::GetBreakpointEventTypeFromEvent(vEvent);
- switch (eEvent)
- {
- case lldb::eBreakpointEventTypeThreadChanged:
- pEventType = "eBreakpointEventTypeThreadChanged";
- break;
- case lldb::eBreakpointEventTypeLocationsRemoved:
- pEventType = "eBreakpointEventTypeLocationsRemoved";
- break;
- case lldb::eBreakpointEventTypeInvalidType:
- pEventType = "eBreakpointEventTypeInvalidType";
- break;
- case lldb::eBreakpointEventTypeLocationsAdded:
- pEventType = "eBreakpointEventTypeLocationsAdded";
- bOk = HandleEventSBBreakpointLocationsAdded(vEvent);
- break;
- case lldb::eBreakpointEventTypeAdded:
- pEventType = "eBreakpointEventTypeAdded";
- bOk = HandleEventSBBreakpointAdded(vEvent);
- break;
- case lldb::eBreakpointEventTypeRemoved:
- pEventType = "eBreakpointEventTypeRemoved";
- bOk = HandleEventSBBreakpointCmn(vEvent);
- break;
- case lldb::eBreakpointEventTypeLocationsResolved:
- pEventType = "eBreakpointEventTypeLocationsResolved";
- bOk = HandleEventSBBreakpointCmn(vEvent);
- break;
- case lldb::eBreakpointEventTypeEnabled:
- pEventType = "eBreakpointEventTypeEnabled";
- bOk = HandleEventSBBreakpointCmn(vEvent);
- break;
- case lldb::eBreakpointEventTypeDisabled:
- pEventType = "eBreakpointEventTypeDisabled";
- bOk = HandleEventSBBreakpointCmn(vEvent);
- break;
- case lldb::eBreakpointEventTypeCommandChanged:
- pEventType = "eBreakpointEventTypeCommandChanged";
- bOk = HandleEventSBBreakpointCmn(vEvent);
- break;
- case lldb::eBreakpointEventTypeConditionChanged:
- pEventType = "eBreakpointEventTypeConditionChanged";
- bOk = HandleEventSBBreakpointCmn(vEvent);
- break;
- case lldb::eBreakpointEventTypeIgnoreChanged:
- pEventType = "eBreakpointEventTypeIgnoreChanged";
- bOk = HandleEventSBBreakpointCmn(vEvent);
- break;
- }
- m_pLog->WriteLog(CMIUtilString::Format("##### An SB Breakpoint event occurred: %s", pEventType));
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointLocationsAdded(
+ const lldb::SBEvent &vEvent) {
+ const MIuint nLoc =
+ lldb::SBBreakpoint::GetNumBreakpointLocationsFromEvent(vEvent);
+ if (nLoc == 0)
+ return MIstatus::success;
- return bOk;
+ lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent);
+ const CMIUtilString plural((nLoc == 1) ? "" : "s");
+ const CMIUtilString msg(
+ CMIUtilString::Format("%d location%s added to breakpoint %d", nLoc,
+ plural.c_str(), brkPt.GetID()));
+
+ return TextToStdout(msg);
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle a LLDB SBBreakpoint event.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
@@ -282,58 +301,116 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakPoint(const lldb::SBEvent &vEv
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointLocationsAdded(const lldb::SBEvent &vEvent)
-{
- const MIuint nLoc = lldb::SBBreakpoint::GetNumBreakpointLocationsFromEvent(vEvent);
- if (nLoc == 0)
- return MIstatus::success;
-
- lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent);
- const CMIUtilString plural((nLoc == 1) ? "" : "s");
- const CMIUtilString msg(CMIUtilString::Format("%d location%s added to breakpoint %d", nLoc, plural.c_str(), brkPt.GetID()));
-
- return TextToStdout(msg);
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointCmn(
+ const lldb::SBEvent &vEvent) {
+ lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent);
+ if (!brkPt.IsValid())
+ return MIstatus::success;
+
+ CMICmnLLDBDebugSessionInfo &rSessionInfo(
+ CMICmnLLDBDebugSessionInfo::Instance());
+ CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo;
+ if (!rSessionInfo.GetBrkPtInfo(brkPt, sBrkPtInfo)) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_GET),
+ "HandleEventSBBreakpointCmn()", brkPt.GetID()));
+ return MIstatus::failure;
+ }
+
+ // CODETAG_LLDB_BREAKPOINT_CREATION
+ // This is in a worker thread
+ // Add more breakpoint information or overwrite existing information
+ CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfoRec;
+ if (!rSessionInfo.RecordBrkPtInfoGet(brkPt.GetID(), sBrkPtInfoRec)) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_NOTFOUND),
+ "HandleEventSBBreakpointCmn()", brkPt.GetID()));
+ return MIstatus::failure;
+ }
+ sBrkPtInfo.m_bDisp = sBrkPtInfoRec.m_bDisp;
+ sBrkPtInfo.m_bEnabled = brkPt.IsEnabled();
+ sBrkPtInfo.m_bHaveArgOptionThreadGrp = false;
+ sBrkPtInfo.m_strOptThrdGrp = "";
+ sBrkPtInfo.m_nTimes = brkPt.GetHitCount();
+ sBrkPtInfo.m_strOrigLoc = sBrkPtInfoRec.m_strOrigLoc;
+ sBrkPtInfo.m_nIgnore = sBrkPtInfoRec.m_nIgnore;
+ sBrkPtInfo.m_bPending = sBrkPtInfoRec.m_bPending;
+ sBrkPtInfo.m_bCondition = sBrkPtInfoRec.m_bCondition;
+ sBrkPtInfo.m_strCondition = sBrkPtInfoRec.m_strCondition;
+ sBrkPtInfo.m_bBrkPtThreadId = sBrkPtInfoRec.m_bBrkPtThreadId;
+ sBrkPtInfo.m_nBrkPtThreadId = sBrkPtInfoRec.m_nBrkPtThreadId;
+
+ // MI print
+ // "=breakpoint-modified,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016"
+ // PRIx64 "\",
+ // func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}"
+ CMICmnMIValueTuple miValueTuple;
+ if (!rSessionInfo.MIResponseFormBrkPtInfo(sBrkPtInfo, miValueTuple)) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE),
+ "HandleEventSBBreakpointCmn()"));
+ return MIstatus::failure;
+ }
+
+ const CMICmnMIValueResult miValueResultC("bkpt", miValueTuple);
+ const CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointModified, miValueResultC);
+ bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Handle a LLDB SBBreakpoint event.
+//++
+//------------------------------------------------------------------------------------
+// Details: Handle a LLDB SBBreakpoint added event.
+// Add more breakpoint information or overwrite existing information.
+// Normally a break point session info objects exists by now when an MI
+// command
+// was issued to insert a break so the retrieval would normally always
+// succeed
+// however should a user type "b main" into a console then LLDB will
+// create a
+// breakpoint directly, hence no MI command, hence no previous record
+// of the
+// breakpoint so RecordBrkPtInfoGet() will fail. We still get the event
+// though
+// so need to create a breakpoint info object here and send appropriate
+// MI
+// response.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
// Return: MIstatus::success - Functionality succeeded.
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointCmn(const lldb::SBEvent &vEvent)
-{
- lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent);
- if (!brkPt.IsValid())
- return MIstatus::success;
-
- CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
- CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo;
- if (!rSessionInfo.GetBrkPtInfo(brkPt, sBrkPtInfo))
- {
- SetErrorDescription(
- CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_GET), "HandleEventSBBreakpointCmn()", brkPt.GetID()));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointAdded(
+ const lldb::SBEvent &vEvent) {
+ lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent);
+ if (!brkPt.IsValid())
+ return MIstatus::success;
- // CODETAG_LLDB_BREAKPOINT_CREATION
- // This is in a worker thread
- // Add more breakpoint information or overwrite existing information
- CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfoRec;
- if (!rSessionInfo.RecordBrkPtInfoGet(brkPt.GetID(), sBrkPtInfoRec))
- {
- SetErrorDescription(
- CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_NOTFOUND), "HandleEventSBBreakpointCmn()", brkPt.GetID()));
- return MIstatus::failure;
- }
+ CMICmnLLDBDebugSessionInfo &rSessionInfo(
+ CMICmnLLDBDebugSessionInfo::Instance());
+ CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo;
+ if (!rSessionInfo.GetBrkPtInfo(brkPt, sBrkPtInfo)) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_GET),
+ "HandleEventSBBreakpointAdded()", brkPt.GetID()));
+ return MIstatus::failure;
+ }
+
+ // CODETAG_LLDB_BREAKPOINT_CREATION
+ // This is in a worker thread
+ CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfoRec;
+ const bool bBrkPtExistAlready =
+ rSessionInfo.RecordBrkPtInfoGet(brkPt.GetID(), sBrkPtInfoRec);
+ if (bBrkPtExistAlready) {
+ // Update breakpoint information object
sBrkPtInfo.m_bDisp = sBrkPtInfoRec.m_bDisp;
sBrkPtInfo.m_bEnabled = brkPt.IsEnabled();
sBrkPtInfo.m_bHaveArgOptionThreadGrp = false;
- sBrkPtInfo.m_strOptThrdGrp = "";
+ sBrkPtInfo.m_strOptThrdGrp.clear();
sBrkPtInfo.m_nTimes = brkPt.GetHitCount();
sBrkPtInfo.m_strOrigLoc = sBrkPtInfoRec.m_strOrigLoc;
sBrkPtInfo.m_nIgnore = sBrkPtInfoRec.m_nIgnore;
@@ -342,138 +419,75 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointCmn(const lldb::SBEvent &
sBrkPtInfo.m_strCondition = sBrkPtInfoRec.m_strCondition;
sBrkPtInfo.m_bBrkPtThreadId = sBrkPtInfoRec.m_bBrkPtThreadId;
sBrkPtInfo.m_nBrkPtThreadId = sBrkPtInfoRec.m_nBrkPtThreadId;
-
- // MI print "=breakpoint-modified,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016" PRIx64 "\",
- // func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}"
- CMICmnMIValueTuple miValueTuple;
- if (!rSessionInfo.MIResponseFormBrkPtInfo(sBrkPtInfo, miValueTuple))
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE), "HandleEventSBBreakpointCmn()"));
- return MIstatus::failure;
- }
-
- const CMICmnMIValueResult miValueResultC("bkpt", miValueTuple);
- const CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointModified, miValueResultC);
- bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ } else {
+ // Create a breakpoint information object
+ sBrkPtInfo.m_bDisp = brkPt.IsOneShot();
+ sBrkPtInfo.m_bEnabled = brkPt.IsEnabled();
+ sBrkPtInfo.m_bHaveArgOptionThreadGrp = false;
+ sBrkPtInfo.m_strOptThrdGrp.clear();
+ sBrkPtInfo.m_strOrigLoc = CMIUtilString::Format(
+ "%s:%d", sBrkPtInfo.m_fileName.c_str(), sBrkPtInfo.m_nLine);
+ sBrkPtInfo.m_nIgnore = brkPt.GetIgnoreCount();
+ sBrkPtInfo.m_bPending = false;
+ const char *pStrCondition = brkPt.GetCondition();
+ sBrkPtInfo.m_bCondition = (pStrCondition != nullptr) ? true : false;
+ sBrkPtInfo.m_strCondition =
+ (pStrCondition != nullptr) ? pStrCondition : "??";
+ sBrkPtInfo.m_bBrkPtThreadId = (brkPt.GetThreadID() != 0) ? true : false;
+ sBrkPtInfo.m_nBrkPtThreadId = brkPt.GetThreadID();
+ }
+
+ CMICmnMIValueTuple miValueTuple;
+ if (!rSessionInfo.MIResponseFormBrkPtInfo(sBrkPtInfo, miValueTuple)) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE),
+ "HandleEventSBBreakpointAdded()"));
+ return MIstatus::failure;
+ }
+
+ bool bOk = MIstatus::success;
+ if (bBrkPtExistAlready) {
+ // MI print
+ // "=breakpoint-modified,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016"
+ // PRIx64
+ // "\",func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}"
+ const CMICmnMIValueResult miValueResult("bkpt", miValueTuple);
+ const CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointModified, miValueResult);
+ bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
bOk = bOk && CMICmnStreamStdout::WritePrompt();
-
- return bOk;
-}
-
-//++ ------------------------------------------------------------------------------------
-// Details: Handle a LLDB SBBreakpoint added event.
-// Add more breakpoint information or overwrite existing information.
-// Normally a break point session info objects exists by now when an MI command
-// was issued to insert a break so the retrieval would normally always succeed
-// however should a user type "b main" into a console then LLDB will create a
-// breakpoint directly, hence no MI command, hence no previous record of the
-// breakpoint so RecordBrkPtInfoGet() will fail. We still get the event though
-// so need to create a breakpoint info object here and send appropriate MI
-// response.
-// Type: Method.
-// Args: vEvent - (R) An LLDB broadcast event.
-// Return: MIstatus::success - Functionality succeeded.
-// MIstatus::failure - Functionality failed.
-// Throws: None.
-//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointAdded(const lldb::SBEvent &vEvent)
-{
- lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent);
- if (!brkPt.IsValid())
- return MIstatus::success;
-
- CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
- CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo;
- if (!rSessionInfo.GetBrkPtInfo(brkPt, sBrkPtInfo))
- {
- SetErrorDescription(
- CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_GET), "HandleEventSBBreakpointAdded()", brkPt.GetID()));
- return MIstatus::failure;
+ } else {
+ // CODETAG_LLDB_BRKPT_ID_MAX
+ if (brkPt.GetID() > (lldb::break_id_t)rSessionInfo.m_nBrkPointCntMax) {
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_CMD_ERR_BRKPT_CNT_EXCEEDED),
+ "HandleEventSBBreakpointAdded()", rSessionInfo.m_nBrkPointCntMax,
+ sBrkPtInfo.m_id));
+ return MIstatus::failure;
}
-
- // CODETAG_LLDB_BREAKPOINT_CREATION
- // This is in a worker thread
- CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfoRec;
- const bool bBrkPtExistAlready = rSessionInfo.RecordBrkPtInfoGet(brkPt.GetID(), sBrkPtInfoRec);
- if (bBrkPtExistAlready)
- {
- // Update breakpoint information object
- sBrkPtInfo.m_bDisp = sBrkPtInfoRec.m_bDisp;
- sBrkPtInfo.m_bEnabled = brkPt.IsEnabled();
- sBrkPtInfo.m_bHaveArgOptionThreadGrp = false;
- sBrkPtInfo.m_strOptThrdGrp.clear();
- sBrkPtInfo.m_nTimes = brkPt.GetHitCount();
- sBrkPtInfo.m_strOrigLoc = sBrkPtInfoRec.m_strOrigLoc;
- sBrkPtInfo.m_nIgnore = sBrkPtInfoRec.m_nIgnore;
- sBrkPtInfo.m_bPending = sBrkPtInfoRec.m_bPending;
- sBrkPtInfo.m_bCondition = sBrkPtInfoRec.m_bCondition;
- sBrkPtInfo.m_strCondition = sBrkPtInfoRec.m_strCondition;
- sBrkPtInfo.m_bBrkPtThreadId = sBrkPtInfoRec.m_bBrkPtThreadId;
- sBrkPtInfo.m_nBrkPtThreadId = sBrkPtInfoRec.m_nBrkPtThreadId;
- }
- else
- {
- // Create a breakpoint information object
- sBrkPtInfo.m_bDisp = brkPt.IsOneShot();
- sBrkPtInfo.m_bEnabled = brkPt.IsEnabled();
- sBrkPtInfo.m_bHaveArgOptionThreadGrp = false;
- sBrkPtInfo.m_strOptThrdGrp.clear();
- sBrkPtInfo.m_strOrigLoc = CMIUtilString::Format("%s:%d", sBrkPtInfo.m_fileName.c_str(), sBrkPtInfo.m_nLine);
- sBrkPtInfo.m_nIgnore = brkPt.GetIgnoreCount();
- sBrkPtInfo.m_bPending = false;
- const char *pStrCondition = brkPt.GetCondition();
- sBrkPtInfo.m_bCondition = (pStrCondition != nullptr) ? true : false;
- sBrkPtInfo.m_strCondition = (pStrCondition != nullptr) ? pStrCondition : "??";
- sBrkPtInfo.m_bBrkPtThreadId = (brkPt.GetThreadID() != 0) ? true : false;
- sBrkPtInfo.m_nBrkPtThreadId = brkPt.GetThreadID();
+ if (!rSessionInfo.RecordBrkPtInfo(brkPt.GetID(), sBrkPtInfo)) {
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_SET),
+ "HandleEventSBBreakpointAdded()", sBrkPtInfo.m_id));
+ return MIstatus::failure;
}
- CMICmnMIValueTuple miValueTuple;
- if (!rSessionInfo.MIResponseFormBrkPtInfo(sBrkPtInfo, miValueTuple))
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE), "HandleEventSBBreakpointAdded()"));
- return MIstatus::failure;
- }
-
- bool bOk = MIstatus::success;
- if (bBrkPtExistAlready)
- {
- // MI print
- // "=breakpoint-modified,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016" PRIx64 "\",func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}"
- const CMICmnMIValueResult miValueResult("bkpt", miValueTuple);
- const CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointModified, miValueResult);
- bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
- }
- else
- {
- // CODETAG_LLDB_BRKPT_ID_MAX
- if (brkPt.GetID() > (lldb::break_id_t)rSessionInfo.m_nBrkPointCntMax)
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_CNT_EXCEEDED), "HandleEventSBBreakpointAdded()",
- rSessionInfo.m_nBrkPointCntMax, sBrkPtInfo.m_id));
- return MIstatus::failure;
- }
- if (!rSessionInfo.RecordBrkPtInfo(brkPt.GetID(), sBrkPtInfo))
- {
- SetErrorDescription(
- CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_SET), "HandleEventSBBreakpointAdded()", sBrkPtInfo.m_id));
- return MIstatus::failure;
- }
-
- // MI print
- // "=breakpoint-created,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016" PRIx64 "\",func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}"
- const CMICmnMIValueResult miValueResult("bkpt", miValueTuple);
- const CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointCreated, miValueResult);
- bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
- }
+ // MI print
+ // "=breakpoint-created,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016"
+ // PRIx64
+ // "\",func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}"
+ const CMICmnMIValueResult miValueResult("bkpt", miValueTuple);
+ const CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointCreated, miValueResult);
+ bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+ }
- return bOk;
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle a LLDB SBThread event.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
@@ -481,47 +495,48 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointAdded(const lldb::SBEvent
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBThread(const lldb::SBEvent &vEvent)
-{
- if (!ChkForStateChanges())
- return MIstatus::failure;
-
- bool bOk = MIstatus::success;
- const char *pEventType = "";
- const MIuint nEventType = vEvent.GetType();
- switch (nEventType)
- {
- case lldb::SBThread::eBroadcastBitStackChanged:
- pEventType = "eBroadcastBitStackChanged";
- bOk = HandleEventSBThreadBitStackChanged(vEvent);
- break;
- case lldb::SBThread::eBroadcastBitThreadSuspended:
- pEventType = "eBroadcastBitThreadSuspended";
- bOk = HandleEventSBThreadSuspended(vEvent);
- break;
- case lldb::SBThread::eBroadcastBitThreadResumed:
- pEventType = "eBroadcastBitThreadResumed";
- break;
- case lldb::SBThread::eBroadcastBitSelectedFrameChanged:
- pEventType = "eBroadcastBitSelectedFrameChanged";
- break;
- case lldb::SBThread::eBroadcastBitThreadSelected:
- pEventType = "eBroadcastBitThreadSelected";
- break;
- default:
- {
- const CMIUtilString msg(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), "SBThread", (MIuint)nEventType));
- SetErrorDescription(msg);
- return MIstatus::failure;
- }
- }
- m_pLog->WriteLog(CMIUtilString::Format("##### An SBThread event occurred: %s", pEventType));
-
- return bOk;
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBThread(
+ const lldb::SBEvent &vEvent) {
+ if (!ChkForStateChanges())
+ return MIstatus::failure;
+
+ bool bOk = MIstatus::success;
+ const char *pEventType = "";
+ const MIuint nEventType = vEvent.GetType();
+ switch (nEventType) {
+ case lldb::SBThread::eBroadcastBitStackChanged:
+ pEventType = "eBroadcastBitStackChanged";
+ bOk = HandleEventSBThreadBitStackChanged(vEvent);
+ break;
+ case lldb::SBThread::eBroadcastBitThreadSuspended:
+ pEventType = "eBroadcastBitThreadSuspended";
+ bOk = HandleEventSBThreadSuspended(vEvent);
+ break;
+ case lldb::SBThread::eBroadcastBitThreadResumed:
+ pEventType = "eBroadcastBitThreadResumed";
+ break;
+ case lldb::SBThread::eBroadcastBitSelectedFrameChanged:
+ pEventType = "eBroadcastBitSelectedFrameChanged";
+ break;
+ case lldb::SBThread::eBroadcastBitThreadSelected:
+ pEventType = "eBroadcastBitThreadSelected";
+ break;
+ default: {
+ const CMIUtilString msg(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT),
+ "SBThread", (MIuint)nEventType));
+ SetErrorDescription(msg);
+ return MIstatus::failure;
+ }
+ }
+ m_pLog->WriteLog(CMIUtilString::Format("##### An SBThread event occurred: %s",
+ pEventType));
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle a LLDB SBThread event.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
@@ -529,31 +544,33 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBThread(const lldb::SBEvent &vEvent)
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBThreadSuspended(const lldb::SBEvent &vEvent)
-{
- lldb::SBThread thread = lldb::SBThread::GetThreadFromEvent(vEvent);
- if (!thread.IsValid())
- return MIstatus::success;
-
- const lldb::StopReason eStopReason = thread.GetStopReason();
- if (eStopReason != lldb::eStopReasonSignal)
- return MIstatus::success;
-
- // MI print "@thread=%d,signal=%lld"
- const MIuint64 nId = thread.GetStopReasonDataAtIndex(0);
- const CMIUtilString strThread(CMIUtilString::Format("%d", thread.GetThreadID()));
- const CMICmnMIValueConst miValueConst(strThread);
- const CMICmnMIValueResult miValueResult("thread", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Thread, miValueResult);
- const CMIUtilString strSignal(CMIUtilString::Format("%lld", nId));
- const CMICmnMIValueConst miValueConst2(strSignal);
- const CMICmnMIValueResult miValueResult2("signal", miValueConst2);
- miOutOfBandRecord.Add(miValueResult2);
- return MiOutOfBandRecordToStdout(miOutOfBandRecord);
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBThreadSuspended(
+ const lldb::SBEvent &vEvent) {
+ lldb::SBThread thread = lldb::SBThread::GetThreadFromEvent(vEvent);
+ if (!thread.IsValid())
+ return MIstatus::success;
+
+ const lldb::StopReason eStopReason = thread.GetStopReason();
+ if (eStopReason != lldb::eStopReasonSignal)
+ return MIstatus::success;
+
+ // MI print "@thread=%d,signal=%lld"
+ const MIuint64 nId = thread.GetStopReasonDataAtIndex(0);
+ const CMIUtilString strThread(
+ CMIUtilString::Format("%d", thread.GetThreadID()));
+ const CMICmnMIValueConst miValueConst(strThread);
+ const CMICmnMIValueResult miValueResult("thread", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_Thread, miValueResult);
+ const CMIUtilString strSignal(CMIUtilString::Format("%lld", nId));
+ const CMICmnMIValueConst miValueConst2(strSignal);
+ const CMICmnMIValueResult miValueResult2("signal", miValueConst2);
+ miOutOfBandRecord.Add(miValueResult2);
+ return MiOutOfBandRecordToStdout(miOutOfBandRecord);
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle a LLDB SBThread event.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
@@ -561,19 +578,19 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBThreadSuspended(const lldb::SBEvent
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBThreadBitStackChanged(const lldb::SBEvent &vEvent)
-{
- lldb::SBThread thread = lldb::SBThread::GetThreadFromEvent(vEvent);
- if (!thread.IsValid())
- return MIstatus::success;
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBThreadBitStackChanged(
+ const lldb::SBEvent &vEvent) {
+ lldb::SBThread thread = lldb::SBThread::GetThreadFromEvent(vEvent);
+ if (!thread.IsValid())
+ return MIstatus::success;
- lldb::SBStream streamOut;
- const bool bOk = thread.GetStatus(streamOut);
- return bOk && TextToStdout(streamOut.GetData());
+ lldb::SBStream streamOut;
+ const bool bOk = thread.GetStatus(streamOut);
+ return bOk && TextToStdout(streamOut.GetData());
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle a LLDB SBTarget event.
// Type: Method.
// Args: vEvent - (R) An LLDB broadcast event.
@@ -581,172 +598,186 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBThreadBitStackChanged(const lldb::S
// MIstatus::failure - Functional failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBTarget(const lldb::SBEvent &vEvent)
-{
- if (!ChkForStateChanges())
- return MIstatus::failure;
-
- bool bOk = MIstatus::success;
- const char *pEventType = "";
- const MIuint nEventType = vEvent.GetType();
- switch (nEventType)
- {
- case lldb::SBTarget::eBroadcastBitBreakpointChanged:
- pEventType = "eBroadcastBitBreakpointChanged";
- break;
- case lldb::SBTarget::eBroadcastBitModulesLoaded:
- pEventType = "eBroadcastBitModulesLoaded";
- bOk = HandleTargetEventBroadcastBitModulesLoaded(vEvent);
- break;
- case lldb::SBTarget::eBroadcastBitModulesUnloaded:
- pEventType = "eBroadcastBitModulesUnloaded";
- bOk = HandleTargetEventBroadcastBitModulesUnloaded(vEvent);
- break;
- case lldb::SBTarget::eBroadcastBitWatchpointChanged:
- pEventType = "eBroadcastBitWatchpointChanged";
- break;
- case lldb::SBTarget::eBroadcastBitSymbolsLoaded:
- pEventType = "eBroadcastBitSymbolsLoaded";
- break;
- default:
- {
- const CMIUtilString msg(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), "SBTarget", (MIuint)nEventType));
- SetErrorDescription(msg);
- return MIstatus::failure;
- }
- }
- m_pLog->WriteLog(CMIUtilString::Format("##### An SBTarget event occurred: %s", pEventType));
-
- return bOk;
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBTarget(
+ const lldb::SBEvent &vEvent) {
+ if (!ChkForStateChanges())
+ return MIstatus::failure;
+
+ bool bOk = MIstatus::success;
+ const char *pEventType = "";
+ const MIuint nEventType = vEvent.GetType();
+ switch (nEventType) {
+ case lldb::SBTarget::eBroadcastBitBreakpointChanged:
+ pEventType = "eBroadcastBitBreakpointChanged";
+ break;
+ case lldb::SBTarget::eBroadcastBitModulesLoaded:
+ pEventType = "eBroadcastBitModulesLoaded";
+ bOk = HandleTargetEventBroadcastBitModulesLoaded(vEvent);
+ break;
+ case lldb::SBTarget::eBroadcastBitModulesUnloaded:
+ pEventType = "eBroadcastBitModulesUnloaded";
+ bOk = HandleTargetEventBroadcastBitModulesUnloaded(vEvent);
+ break;
+ case lldb::SBTarget::eBroadcastBitWatchpointChanged:
+ pEventType = "eBroadcastBitWatchpointChanged";
+ break;
+ case lldb::SBTarget::eBroadcastBitSymbolsLoaded:
+ pEventType = "eBroadcastBitSymbolsLoaded";
+ break;
+ default: {
+ const CMIUtilString msg(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT),
+ "SBTarget", (MIuint)nEventType));
+ SetErrorDescription(msg);
+ return MIstatus::failure;
+ }
+ }
+ m_pLog->WriteLog(CMIUtilString::Format("##### An SBTarget event occurred: %s",
+ pEventType));
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Print to stdout "=library-loaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" PRIx64"\""
+//++
+//------------------------------------------------------------------------------------
+// Details: Print to stdout
+// "=library-loaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016"
+// PRIx64"\""
// Type: Method.
// Args: None.
// Return: MIstatus::success - Function succeeded.
// MIstatus::failure - Function failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleTargetEventBroadcastBitModulesLoaded(const lldb::SBEvent &vEvent)
-{
- bool bOk = MIstatus::failure;
- const MIuint nSize = lldb::SBTarget::GetNumModulesFromEvent(vEvent);
- for (MIuint nIndex = 0; nIndex < nSize; ++nIndex)
- {
- const lldb::SBModule sbModule = lldb::SBTarget::GetModuleAtIndexFromEvent(nIndex, vEvent);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded);
- const bool bWithExtraFields = true;
- bOk = MiHelpGetModuleInfo(sbModule, bWithExtraFields, miOutOfBandRecord);
- bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
- if (!bOk)
- break;
- }
+bool CMICmnLLDBDebuggerHandleEvents::HandleTargetEventBroadcastBitModulesLoaded(
+ const lldb::SBEvent &vEvent) {
+ bool bOk = MIstatus::failure;
+ const MIuint nSize = lldb::SBTarget::GetNumModulesFromEvent(vEvent);
+ for (MIuint nIndex = 0; nIndex < nSize; ++nIndex) {
+ const lldb::SBModule sbModule =
+ lldb::SBTarget::GetModuleAtIndexFromEvent(nIndex, vEvent);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded);
+ const bool bWithExtraFields = true;
+ bOk = MiHelpGetModuleInfo(sbModule, bWithExtraFields, miOutOfBandRecord);
+ bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ if (!bOk)
+ break;
+ }
- return bOk;
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Print to stdout "=library-unloaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" PRIx64"\""
+//++
+//------------------------------------------------------------------------------------
+// Details: Print to stdout
+// "=library-unloaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016"
+// PRIx64"\""
// Type: Method.
// Args: None.
// Return: MIstatus::success - Function succeeded.
// MIstatus::failure - Function failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleTargetEventBroadcastBitModulesUnloaded(const lldb::SBEvent &vEvent)
-{
- bool bOk = MIstatus::failure;
- const MIuint nSize = lldb::SBTarget::GetNumModulesFromEvent(vEvent);
- for (MIuint nIndex = 0; nIndex < nSize; ++nIndex)
- {
- const lldb::SBModule sbModule = lldb::SBTarget::GetModuleAtIndexFromEvent(nIndex, vEvent);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleUnloaded);
- const bool bWithExtraFields = false;
- bOk = MiHelpGetModuleInfo(sbModule, bWithExtraFields, miOutOfBandRecord);
- bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
- if (!bOk)
- break;
- }
+bool CMICmnLLDBDebuggerHandleEvents::
+ HandleTargetEventBroadcastBitModulesUnloaded(const lldb::SBEvent &vEvent) {
+ bool bOk = MIstatus::failure;
+ const MIuint nSize = lldb::SBTarget::GetNumModulesFromEvent(vEvent);
+ for (MIuint nIndex = 0; nIndex < nSize; ++nIndex) {
+ const lldb::SBModule sbModule =
+ lldb::SBTarget::GetModuleAtIndexFromEvent(nIndex, vEvent);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleUnloaded);
+ const bool bWithExtraFields = false;
+ bOk = MiHelpGetModuleInfo(sbModule, bWithExtraFields, miOutOfBandRecord);
+ bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ if (!bOk)
+ break;
+ }
- return bOk;
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Build module information for =library-loaded/=library-unloaded: "id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" PRIx64"\""
+//++
+//------------------------------------------------------------------------------------
+// Details: Build module information for =library-loaded/=library-unloaded:
+// "id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016"
+// PRIx64"\""
// Type: Method.
// Args: vwrMiValueList - (W) MI value list object.
// Return: MIstatus::success - Function succeeded.
// MIstatus::failure - Function failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::MiHelpGetModuleInfo(const lldb::SBModule &vModule, const bool vbWithExtraFields,
- CMICmnMIOutOfBandRecord &vwrMiOutOfBandRecord)
-{
- bool bOk = MIstatus::success;
-
- // First, build standard fields:
- // Build "id" field
- std::unique_ptr<char[]> apPath(new char[PATH_MAX]);
- vModule.GetFileSpec().GetPath(apPath.get(), PATH_MAX);
- const CMIUtilString strTargetPath(apPath.get());
- const CMICmnMIValueConst miValueConst(strTargetPath.AddSlashes());
- const CMICmnMIValueResult miValueResult("id", miValueConst);
- vwrMiOutOfBandRecord.Add(miValueResult);
- // Build "target-name" field
- const CMICmnMIValueConst miValueConst2(strTargetPath.AddSlashes());
- const CMICmnMIValueResult miValueResult2("target-name", miValueConst2);
- vwrMiOutOfBandRecord.Add(miValueResult2);
- // Build "host-name" field
- vModule.GetPlatformFileSpec().GetPath(apPath.get(), PATH_MAX);
- const CMIUtilString strHostPath(apPath.get());
- const CMICmnMIValueConst miValueConst3(strHostPath.AddSlashes());
- const CMICmnMIValueResult miValueResult3("host-name", miValueConst3);
- vwrMiOutOfBandRecord.Add(miValueResult3);
-
- // Then build extra fields if needed:
- if (vbWithExtraFields)
- {
- // Build "symbols-loaded" field
- vModule.GetSymbolFileSpec().GetPath(apPath.get(), PATH_MAX);
- const CMIUtilString strSymbolsPath(apPath.get());
- const bool bSymbolsLoaded = !CMIUtilString::Compare(strHostPath, strSymbolsPath);
- const CMICmnMIValueConst miValueConst4(CMIUtilString::Format("%d", bSymbolsLoaded));
- const CMICmnMIValueResult miValueResult4("symbols-loaded", miValueConst4);
- vwrMiOutOfBandRecord.Add(miValueResult4);
- // Build "symbols-path" field
- if (bSymbolsLoaded)
- {
- const CMICmnMIValueConst miValueConst5(strSymbolsPath.AddSlashes());
- const CMICmnMIValueResult miValueResult5("symbols-path", miValueConst5);
- vwrMiOutOfBandRecord.Add(miValueResult5);
- }
- // Build "loaded_addr" field
- lldb::SBAddress sbAddress(vModule.GetObjectFileHeaderAddress());
- CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
- const lldb::addr_t nLoadAddress(sbAddress.GetLoadAddress(rSessionInfo.GetTarget()));
- const CMIUtilString strLoadedAddr(nLoadAddress != LLDB_INVALID_ADDRESS ?
- CMIUtilString::Format("0x%016" PRIx64, nLoadAddress) : "-");
- const CMICmnMIValueConst miValueConst6(strLoadedAddr);
- const CMICmnMIValueResult miValueResult6("loaded_addr", miValueConst6);
- vwrMiOutOfBandRecord.Add(miValueResult6);
-
- // Build "size" field
- lldb::SBSection sbSection = sbAddress.GetSection();
- const CMIUtilString strSize(CMIUtilString::Format("%" PRIu64, sbSection.GetByteSize()));
- const CMICmnMIValueConst miValueConst7(strSize);
- const CMICmnMIValueResult miValueResult7("size", miValueConst7);
- vwrMiOutOfBandRecord.Add(miValueResult7);
+bool CMICmnLLDBDebuggerHandleEvents::MiHelpGetModuleInfo(
+ const lldb::SBModule &vModule, const bool vbWithExtraFields,
+ CMICmnMIOutOfBandRecord &vwrMiOutOfBandRecord) {
+ bool bOk = MIstatus::success;
+
+ // First, build standard fields:
+ // Build "id" field
+ std::unique_ptr<char[]> apPath(new char[PATH_MAX]);
+ vModule.GetFileSpec().GetPath(apPath.get(), PATH_MAX);
+ const CMIUtilString strTargetPath(apPath.get());
+ const CMICmnMIValueConst miValueConst(strTargetPath.AddSlashes());
+ const CMICmnMIValueResult miValueResult("id", miValueConst);
+ vwrMiOutOfBandRecord.Add(miValueResult);
+ // Build "target-name" field
+ const CMICmnMIValueConst miValueConst2(strTargetPath.AddSlashes());
+ const CMICmnMIValueResult miValueResult2("target-name", miValueConst2);
+ vwrMiOutOfBandRecord.Add(miValueResult2);
+ // Build "host-name" field
+ vModule.GetPlatformFileSpec().GetPath(apPath.get(), PATH_MAX);
+ const CMIUtilString strHostPath(apPath.get());
+ const CMICmnMIValueConst miValueConst3(strHostPath.AddSlashes());
+ const CMICmnMIValueResult miValueResult3("host-name", miValueConst3);
+ vwrMiOutOfBandRecord.Add(miValueResult3);
+
+ // Then build extra fields if needed:
+ if (vbWithExtraFields) {
+ // Build "symbols-loaded" field
+ vModule.GetSymbolFileSpec().GetPath(apPath.get(), PATH_MAX);
+ const CMIUtilString strSymbolsPath(apPath.get());
+ const bool bSymbolsLoaded =
+ !CMIUtilString::Compare(strHostPath, strSymbolsPath);
+ const CMICmnMIValueConst miValueConst4(
+ CMIUtilString::Format("%d", bSymbolsLoaded));
+ const CMICmnMIValueResult miValueResult4("symbols-loaded", miValueConst4);
+ vwrMiOutOfBandRecord.Add(miValueResult4);
+ // Build "symbols-path" field
+ if (bSymbolsLoaded) {
+ const CMICmnMIValueConst miValueConst5(strSymbolsPath.AddSlashes());
+ const CMICmnMIValueResult miValueResult5("symbols-path", miValueConst5);
+ vwrMiOutOfBandRecord.Add(miValueResult5);
}
-
- return bOk;
+ // Build "loaded_addr" field
+ lldb::SBAddress sbAddress(vModule.GetObjectFileHeaderAddress());
+ CMICmnLLDBDebugSessionInfo &rSessionInfo(
+ CMICmnLLDBDebugSessionInfo::Instance());
+ const lldb::addr_t nLoadAddress(
+ sbAddress.GetLoadAddress(rSessionInfo.GetTarget()));
+ const CMIUtilString strLoadedAddr(
+ nLoadAddress != LLDB_INVALID_ADDRESS
+ ? CMIUtilString::Format("0x%016" PRIx64, nLoadAddress)
+ : "-");
+ const CMICmnMIValueConst miValueConst6(strLoadedAddr);
+ const CMICmnMIValueResult miValueResult6("loaded_addr", miValueConst6);
+ vwrMiOutOfBandRecord.Add(miValueResult6);
+
+ // Build "size" field
+ lldb::SBSection sbSection = sbAddress.GetSection();
+ const CMIUtilString strSize(
+ CMIUtilString::Format("%" PRIu64, sbSection.GetByteSize()));
+ const CMICmnMIValueConst miValueConst7(strSize);
+ const CMICmnMIValueResult miValueResult7("size", miValueConst7);
+ vwrMiOutOfBandRecord.Add(miValueResult7);
+ }
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle a LLDB SBCommandInterpreter event.
// Type: Method.
// Args: vEvent - (R) An LLDB command interpreter event.
@@ -754,57 +785,58 @@ CMICmnLLDBDebuggerHandleEvents::MiHelpGetModuleInfo(const lldb::SBModule &vModul
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleEventSBCommandInterpreter(const lldb::SBEvent &vEvent)
-{
- // This function is not used
- // *** This function is under development
-
- const char *pEventType = "";
- const MIuint nEventType = vEvent.GetType();
- switch (nEventType)
- {
- case lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit:
- pEventType = "eBroadcastBitThreadShouldExit";
- // ToDo: IOR: Reminder to maybe handle this here
- // const MIuint nEventType = event.GetType();
- // if (nEventType & lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit)
- //{
- // m_pClientDriver->SetExitApplicationFlag();
- // vrbYesExit = true;
- // return MIstatus::success;
- //}
- break;
- case lldb::SBCommandInterpreter::eBroadcastBitResetPrompt:
- pEventType = "eBroadcastBitResetPrompt";
- break;
- case lldb::SBCommandInterpreter::eBroadcastBitQuitCommandReceived:
- {
- pEventType = "eBroadcastBitQuitCommandReceived";
- const bool bForceExit = true;
- CMICmnLLDBDebugger::Instance().GetDriver().SetExitApplicationFlag(bForceExit);
- break;
- }
- case lldb::SBCommandInterpreter::eBroadcastBitAsynchronousOutputData:
- pEventType = "eBroadcastBitAsynchronousOutputData";
- break;
- case lldb::SBCommandInterpreter::eBroadcastBitAsynchronousErrorData:
- pEventType = "eBroadcastBitAsynchronousErrorData";
- break;
- default:
- {
- const CMIUtilString msg(
- CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), "SBCommandInterpreter", (MIuint)nEventType));
- SetErrorDescription(msg);
- return MIstatus::failure;
- }
- }
- m_pLog->WriteLog(CMIUtilString::Format("##### An SBCommandInterpreter event occurred: %s", pEventType));
-
- return MIstatus::success;
+bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBCommandInterpreter(
+ const lldb::SBEvent &vEvent) {
+ // This function is not used
+ // *** This function is under development
+
+ const char *pEventType = "";
+ const MIuint nEventType = vEvent.GetType();
+ switch (nEventType) {
+ case lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit:
+ pEventType = "eBroadcastBitThreadShouldExit";
+ // ToDo: IOR: Reminder to maybe handle this here
+ // const MIuint nEventType = event.GetType();
+ // if (nEventType &
+ // lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit)
+ //{
+ // m_pClientDriver->SetExitApplicationFlag();
+ // vrbYesExit = true;
+ // return MIstatus::success;
+ //}
+ break;
+ case lldb::SBCommandInterpreter::eBroadcastBitResetPrompt:
+ pEventType = "eBroadcastBitResetPrompt";
+ break;
+ case lldb::SBCommandInterpreter::eBroadcastBitQuitCommandReceived: {
+ pEventType = "eBroadcastBitQuitCommandReceived";
+ const bool bForceExit = true;
+ CMICmnLLDBDebugger::Instance().GetDriver().SetExitApplicationFlag(
+ bForceExit);
+ break;
+ }
+ case lldb::SBCommandInterpreter::eBroadcastBitAsynchronousOutputData:
+ pEventType = "eBroadcastBitAsynchronousOutputData";
+ break;
+ case lldb::SBCommandInterpreter::eBroadcastBitAsynchronousErrorData:
+ pEventType = "eBroadcastBitAsynchronousErrorData";
+ break;
+ default: {
+ const CMIUtilString msg(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT),
+ "SBCommandInterpreter", (MIuint)nEventType));
+ SetErrorDescription(msg);
+ return MIstatus::failure;
+ }
+ }
+ m_pLog->WriteLog(CMIUtilString::Format(
+ "##### An SBCommandInterpreter event occurred: %s", pEventType));
+
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Handle SBProcess event eBroadcastBitStateChanged.
// Type: Method.
// Args: vEvent - (R) An LLDB event object.
@@ -812,91 +844,94 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBCommandInterpreter(const lldb::SBEv
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventBroadcastBitStateChanged(const lldb::SBEvent &vEvent)
-{
- // Make sure the program hasn't been auto-restarted:
- if (lldb::SBProcess::GetRestartedFromEvent(vEvent))
- return MIstatus::success;
-
- bool bOk = ChkForStateChanges();
- bOk = bOk && GetProcessStdout();
- bOk = bOk && GetProcessStderr();
- if (!bOk)
- return MIstatus::failure;
-
- // Something changed in the process; get the event and report the process's current
- // status and location
- const lldb::StateType eEventState = lldb::SBProcess::GetStateFromEvent(vEvent);
- if (eEventState == lldb::eStateInvalid)
- return MIstatus::success;
-
- lldb::SBProcess process = lldb::SBProcess::GetProcessFromEvent(vEvent);
- if (!process.IsValid())
- {
- const CMIUtilString msg(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_PROCESS_INVALID), "SBProcess",
- "HandleProcessEventBroadcastBitStateChanged()"));
- SetErrorDescription(msg);
- return MIstatus::failure;
- }
-
- bool bShouldBrk = true;
- const char *pEventType = "";
- switch (eEventState)
- {
- case lldb::eStateUnloaded:
- pEventType = "eStateUnloaded";
- break;
- case lldb::eStateConnected:
- pEventType = "eStateConnected";
- break;
- case lldb::eStateAttaching:
- pEventType = "eStateAttaching";
- break;
- case lldb::eStateLaunching:
- pEventType = "eStateLaunching";
- break;
- case lldb::eStateStopped:
- pEventType = "eStateStopped";
- bOk = HandleProcessEventStateStopped(vEvent, bShouldBrk);
- if (bShouldBrk)
- break;
- case lldb::eStateCrashed:
- case lldb::eStateSuspended:
- pEventType = "eStateSuspended";
- bOk = HandleProcessEventStateSuspended(vEvent);
- break;
- case lldb::eStateRunning:
- pEventType = "eStateRunning";
- bOk = HandleProcessEventStateRunning();
- break;
- case lldb::eStateStepping:
- pEventType = "eStateStepping";
- break;
- case lldb::eStateDetached:
- pEventType = "eStateDetached";
- break;
- case lldb::eStateExited:
- // Don't exit from lldb-mi here. We should be able to re-run target.
- pEventType = "eStateExited";
- bOk = HandleProcessEventStateExited();
- break;
- default:
- {
- const CMIUtilString msg(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), "SBProcess BroadcastBitStateChanged",
- (MIuint)eEventState));
- SetErrorDescription(msg);
- return MIstatus::failure;
- }
- }
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventBroadcastBitStateChanged(
+ const lldb::SBEvent &vEvent) {
+ // Make sure the program hasn't been auto-restarted:
+ if (lldb::SBProcess::GetRestartedFromEvent(vEvent))
+ return MIstatus::success;
- // ToDo: Remove when finished coding application
- m_pLog->WriteLog(CMIUtilString::Format("##### An SB Process event BroadcastBitStateChanged occurred: %s", pEventType));
+ bool bOk = ChkForStateChanges();
+ bOk = bOk && GetProcessStdout();
+ bOk = bOk && GetProcessStderr();
+ if (!bOk)
+ return MIstatus::failure;
+
+ // Something changed in the process; get the event and report the process's
+ // current
+ // status and location
+ const lldb::StateType eEventState =
+ lldb::SBProcess::GetStateFromEvent(vEvent);
+ if (eEventState == lldb::eStateInvalid)
+ return MIstatus::success;
- return bOk;
+ lldb::SBProcess process = lldb::SBProcess::GetProcessFromEvent(vEvent);
+ if (!process.IsValid()) {
+ const CMIUtilString msg(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBOUTOFBAND_ERR_PROCESS_INVALID), "SBProcess",
+ "HandleProcessEventBroadcastBitStateChanged()"));
+ SetErrorDescription(msg);
+ return MIstatus::failure;
+ }
+
+ bool bShouldBrk = true;
+ const char *pEventType = "";
+ switch (eEventState) {
+ case lldb::eStateUnloaded:
+ pEventType = "eStateUnloaded";
+ break;
+ case lldb::eStateConnected:
+ pEventType = "eStateConnected";
+ break;
+ case lldb::eStateAttaching:
+ pEventType = "eStateAttaching";
+ break;
+ case lldb::eStateLaunching:
+ pEventType = "eStateLaunching";
+ break;
+ case lldb::eStateStopped:
+ pEventType = "eStateStopped";
+ bOk = HandleProcessEventStateStopped(vEvent, bShouldBrk);
+ if (bShouldBrk)
+ break;
+ case lldb::eStateCrashed:
+ case lldb::eStateSuspended:
+ pEventType = "eStateSuspended";
+ bOk = HandleProcessEventStateSuspended(vEvent);
+ break;
+ case lldb::eStateRunning:
+ pEventType = "eStateRunning";
+ bOk = HandleProcessEventStateRunning();
+ break;
+ case lldb::eStateStepping:
+ pEventType = "eStateStepping";
+ break;
+ case lldb::eStateDetached:
+ pEventType = "eStateDetached";
+ break;
+ case lldb::eStateExited:
+ // Don't exit from lldb-mi here. We should be able to re-run target.
+ pEventType = "eStateExited";
+ bOk = HandleProcessEventStateExited();
+ break;
+ default: {
+ const CMIUtilString msg(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT),
+ "SBProcess BroadcastBitStateChanged", (MIuint)eEventState));
+ SetErrorDescription(msg);
+ return MIstatus::failure;
+ }
+ }
+
+ // ToDo: Remove when finished coding application
+ m_pLog->WriteLog(CMIUtilString::Format(
+ "##### An SB Process event BroadcastBitStateChanged occurred: %s",
+ pEventType));
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Asynchronous event handler for LLDB Process state suspended.
// Type: Method.
// Args: vEvent - (R) An LLDB event object.
@@ -904,41 +939,42 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventBroadcastBitStateChanged(const
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateSuspended(const lldb::SBEvent &vEvent)
-{
- bool bOk = MIstatus::success;
- lldb::SBDebugger &rDebugger = CMICmnLLDBDebugSessionInfo::Instance().GetDebugger();
- lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- lldb::SBTarget target = sbProcess.GetTarget();
- if (rDebugger.GetSelectedTarget() == target)
- {
- if (!UpdateSelectedThread())
- return MIstatus::failure;
-
- lldb::SBCommandReturnObject result;
- const lldb::ReturnStatus status = rDebugger.GetCommandInterpreter().HandleCommand("process status", result, false);
- MIunused(status);
- bOk = TextToStderr(result.GetError());
- bOk = bOk && TextToStdout(result.GetOutput());
- }
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateSuspended(
+ const lldb::SBEvent &vEvent) {
+ bool bOk = MIstatus::success;
+ lldb::SBDebugger &rDebugger =
+ CMICmnLLDBDebugSessionInfo::Instance().GetDebugger();
+ lldb::SBProcess sbProcess =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ lldb::SBTarget target = sbProcess.GetTarget();
+ if (rDebugger.GetSelectedTarget() == target) {
+ if (!UpdateSelectedThread())
+ return MIstatus::failure;
+
+ lldb::SBCommandReturnObject result;
+ const lldb::ReturnStatus status =
+ rDebugger.GetCommandInterpreter().HandleCommand("process status",
+ result, false);
+ MIunused(status);
+ bOk = TextToStderr(result.GetError());
+ bOk = bOk && TextToStdout(result.GetOutput());
+ } else {
+ lldb::SBStream streamOut;
+ const MIuint nTargetIndex = rDebugger.GetIndexOfTarget(target);
+ if (nTargetIndex != UINT_MAX)
+ streamOut.Printf("Target %d: (", nTargetIndex);
else
- {
- lldb::SBStream streamOut;
- const MIuint nTargetIndex = rDebugger.GetIndexOfTarget(target);
- if (nTargetIndex != UINT_MAX)
- streamOut.Printf("Target %d: (", nTargetIndex);
- else
- streamOut.Printf("Target <unknown index>: (");
- target.GetDescription(streamOut, lldb::eDescriptionLevelBrief);
- streamOut.Printf(") stopped.\n");
- bOk = TextToStdout(streamOut.GetData());
- }
+ streamOut.Printf("Target <unknown index>: (");
+ target.GetDescription(streamOut, lldb::eDescriptionLevelBrief);
+ streamOut.Printf(") stopped.\n");
+ bOk = TextToStdout(streamOut.GetData());
+ }
- return bOk;
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Print to stdout MI formatted text to indicate process stopped.
// Type: Method.
// Args: vwrbShouldBrk - (W) True = Yes break, false = do not.
@@ -946,66 +982,68 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateSuspended(const lldb::SBE
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateStopped(const lldb::SBEvent &vrEvent, bool &vwrbShouldBrk)
-{
- if (!UpdateSelectedThread())
- return MIstatus::failure;
-
- const char *pEventType = "";
- bool bOk = MIstatus::success;
- lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- const lldb::StopReason eStoppedReason = sbProcess.GetSelectedThread().GetStopReason();
- switch (eStoppedReason)
- {
- case lldb::eStopReasonInvalid:
- pEventType = "eStopReasonInvalid";
- vwrbShouldBrk = false;
- break;
- case lldb::eStopReasonNone:
- pEventType = "eStopReasonNone";
- break;
- case lldb::eStopReasonTrace:
- pEventType = "eStopReasonTrace";
- bOk = HandleProcessEventStopReasonTrace();
- break;
- case lldb::eStopReasonBreakpoint:
- pEventType = "eStopReasonBreakpoint";
- bOk = HandleProcessEventStopReasonBreakpoint();
- break;
- case lldb::eStopReasonWatchpoint:
- pEventType = "eStopReasonWatchpoint";
- break;
- case lldb::eStopReasonSignal:
- pEventType = "eStopReasonSignal";
- bOk = HandleProcessEventStopSignal(vrEvent);
- break;
- case lldb::eStopReasonException:
- pEventType = "eStopReasonException";
- bOk = HandleProcessEventStopException();
- break;
- case lldb::eStopReasonExec:
- pEventType = "eStopReasonExec";
- break;
- case lldb::eStopReasonPlanComplete:
- pEventType = "eStopReasonPlanComplete";
- bOk = HandleProcessEventStopReasonTrace();
- break;
- case lldb::eStopReasonThreadExiting:
- pEventType = "eStopReasonThreadExiting";
- break;
- case lldb::eStopReasonInstrumentation:
- pEventType = "eStopReasonInstrumentation";
- break;
- }
-
- // ToDo: Remove when finished coding application
- m_pLog->WriteLog(CMIUtilString::Format("##### An SB Process event stop state occurred: %s", pEventType));
-
- return bOk;
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateStopped(
+ const lldb::SBEvent &vrEvent, bool &vwrbShouldBrk) {
+ if (!UpdateSelectedThread())
+ return MIstatus::failure;
+
+ const char *pEventType = "";
+ bool bOk = MIstatus::success;
+ lldb::SBProcess sbProcess =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ const lldb::StopReason eStoppedReason =
+ sbProcess.GetSelectedThread().GetStopReason();
+ switch (eStoppedReason) {
+ case lldb::eStopReasonInvalid:
+ pEventType = "eStopReasonInvalid";
+ vwrbShouldBrk = false;
+ break;
+ case lldb::eStopReasonNone:
+ pEventType = "eStopReasonNone";
+ break;
+ case lldb::eStopReasonTrace:
+ pEventType = "eStopReasonTrace";
+ bOk = HandleProcessEventStopReasonTrace();
+ break;
+ case lldb::eStopReasonBreakpoint:
+ pEventType = "eStopReasonBreakpoint";
+ bOk = HandleProcessEventStopReasonBreakpoint();
+ break;
+ case lldb::eStopReasonWatchpoint:
+ pEventType = "eStopReasonWatchpoint";
+ break;
+ case lldb::eStopReasonSignal:
+ pEventType = "eStopReasonSignal";
+ bOk = HandleProcessEventStopSignal(vrEvent);
+ break;
+ case lldb::eStopReasonException:
+ pEventType = "eStopReasonException";
+ bOk = HandleProcessEventStopException();
+ break;
+ case lldb::eStopReasonExec:
+ pEventType = "eStopReasonExec";
+ break;
+ case lldb::eStopReasonPlanComplete:
+ pEventType = "eStopReasonPlanComplete";
+ bOk = HandleProcessEventStopReasonTrace();
+ break;
+ case lldb::eStopReasonThreadExiting:
+ pEventType = "eStopReasonThreadExiting";
+ break;
+ case lldb::eStopReasonInstrumentation:
+ pEventType = "eStopReasonInstrumentation";
+ break;
+ }
+
+ // ToDo: Remove when finished coding application
+ m_pLog->WriteLog(CMIUtilString::Format(
+ "##### An SB Process event stop state occurred: %s", pEventType));
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Asynchronous event handler for LLDB Process stop signal.
// Type: Method.
// Args: vrEvent - (R) An LLDB broadcast event.
@@ -1013,147 +1051,150 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateStopped(const lldb::SBEve
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal(const lldb::SBEvent &vrEvent)
-{
- bool bOk = MIstatus::success;
-
- InitializeSignals ();
- lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- const MIuint64 nStopReason = sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0);
- const bool bInterrupted = lldb::SBProcess::GetInterruptedFromEvent(vrEvent);
- if (nStopReason == m_SIGINT || (nStopReason == m_SIGSTOP && bInterrupted))
- {
- // 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);
- const CMICmnMIValueConst miValueConst2("SIGINT");
- const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2);
- miOutOfBandRecord.Add(miValueResult2);
- const CMICmnMIValueConst miValueConst3("Interrupt");
- const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3);
- miOutOfBandRecord.Add(miValueResult3);
- CMICmnMIValueTuple miValueTuple;
- bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
- const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
- miOutOfBandRecord.Add(miValueResult4);
- const CMIUtilString strThreadId(CMIUtilString::Format("%" PRIu32, sbProcess.GetSelectedThread().GetIndexID()));
- const CMICmnMIValueConst miValueConst5(strThreadId);
- const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
- miOutOfBandRecord.Add(miValueResult5);
- const CMICmnMIValueConst miValueConst6("all");
- const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6);
- 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);
- miOutOfBandRecord.Add(miValueResult2);
- const CMICmnMIValueConst miValueConst3("Stop");
- const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3);
- miOutOfBandRecord.Add(miValueResult3);
- CMICmnMIValueTuple miValueTuple;
- bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
- const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
- miOutOfBandRecord.Add(miValueResult4);
- const CMIUtilString strThreadId(CMIUtilString::Format("%" PRIu32, sbProcess.GetSelectedThread().GetIndexID()));
- const CMICmnMIValueConst miValueConst5(strThreadId);
- const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
- miOutOfBandRecord.Add(miValueResult5);
- const CMICmnMIValueConst miValueConst6("all");
- const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6);
- miOutOfBandRecord.Add(miValueResult6);
- 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}"
- 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);
- miOutOfBandRecord.Add(miValueResult2);
- const CMICmnMIValueConst miValueConst3("Segmentation fault");
- const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3);
- miOutOfBandRecord.Add(miValueResult3);
- CMICmnMIValueTuple miValueTuple;
- bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
- const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
- miOutOfBandRecord.Add(miValueResult4);
- const CMIUtilString strThreadId(CMIUtilString::Format("%d", sbProcess.GetSelectedThread().GetIndexID()));
- const CMICmnMIValueConst miValueConst5(strThreadId);
- const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
- 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::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");
-
- if (CMIUtilString::Compare(threadCloneFn, fnName))
- {
- if (sbProcess.IsValid())
- sbProcess.Continue();
- }
- }
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal(
+ const lldb::SBEvent &vrEvent) {
+ bool bOk = MIstatus::success;
+
+ InitializeSignals();
+ lldb::SBProcess sbProcess =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ const MIuint64 nStopReason =
+ sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0);
+ const bool bInterrupted = lldb::SBProcess::GetInterruptedFromEvent(vrEvent);
+ if (nStopReason == m_SIGINT || (nStopReason == m_SIGSTOP && bInterrupted)) {
+ // 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);
+ const CMICmnMIValueConst miValueConst2("SIGINT");
+ const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2);
+ miOutOfBandRecord.Add(miValueResult2);
+ const CMICmnMIValueConst miValueConst3("Interrupt");
+ const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3);
+ miOutOfBandRecord.Add(miValueResult3);
+ CMICmnMIValueTuple miValueTuple;
+ bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
+ const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
+ miOutOfBandRecord.Add(miValueResult4);
+ const CMIUtilString strThreadId(CMIUtilString::Format(
+ "%" PRIu32, sbProcess.GetSelectedThread().GetIndexID()));
+ const CMICmnMIValueConst miValueConst5(strThreadId);
+ const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
+ miOutOfBandRecord.Add(miValueResult5);
+ const CMICmnMIValueConst miValueConst6("all");
+ const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6);
+ 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);
+ miOutOfBandRecord.Add(miValueResult2);
+ const CMICmnMIValueConst miValueConst3("Stop");
+ const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3);
+ miOutOfBandRecord.Add(miValueResult3);
+ CMICmnMIValueTuple miValueTuple;
+ bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
+ const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
+ miOutOfBandRecord.Add(miValueResult4);
+ const CMIUtilString strThreadId(CMIUtilString::Format(
+ "%" PRIu32, sbProcess.GetSelectedThread().GetIndexID()));
+ const CMICmnMIValueConst miValueConst5(strThreadId);
+ const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
+ miOutOfBandRecord.Add(miValueResult5);
+ const CMICmnMIValueConst miValueConst6("all");
+ const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6);
+ miOutOfBandRecord.Add(miValueResult6);
+ 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}"
+ 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);
+ miOutOfBandRecord.Add(miValueResult2);
+ const CMICmnMIValueConst miValueConst3("Segmentation fault");
+ const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3);
+ miOutOfBandRecord.Add(miValueResult3);
+ CMICmnMIValueTuple miValueTuple;
+ bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
+ const CMICmnMIValueResult miValueResult4("frame", miValueTuple);
+ miOutOfBandRecord.Add(miValueResult4);
+ const CMIUtilString strThreadId(CMIUtilString::Format(
+ "%d", sbProcess.GetSelectedThread().GetIndexID()));
+ const CMICmnMIValueConst miValueConst5(strThreadId);
+ const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
+ 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::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");
+
+ if (CMIUtilString::Compare(threadCloneFn, fnName)) {
+ if (sbProcess.IsValid())
+ sbProcess.Continue();
}
+ }
}
- else
- {
- // 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);
- lldb::SBUnixSignals sbUnixSignals = sbProcess.GetUnixSignals();
- const char *pSignal = sbUnixSignals.GetSignalAsCString(nStopReason);
- if (pSignal)
- {
- const CMICmnMIValueConst miValueConst2(pSignal);
- const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2);
- miOutOfBandRecord.Add(miValueResult2);
- }
- else
- {
- const CMIUtilString strSignal(CMIUtilString::Format("%" PRIu64, nStopReason));
- const CMICmnMIValueConst miValueConst2(strSignal);
- const CMICmnMIValueResult miValueResult2("signal", miValueConst2);
- miOutOfBandRecord.Add(miValueResult2);
- }
- const CMIUtilString strThreadId(CMIUtilString::Format("%d", sbProcess.GetSelectedThread().GetIndexID()));
- const CMICmnMIValueConst miValueConst3(strThreadId);
- const CMICmnMIValueResult miValueResult3("thread-id", miValueConst3);
- miOutOfBandRecord.Add(miValueResult3);
- const CMICmnMIValueConst miValueConst4("all");
- const CMICmnMIValueResult miValueResult4("stopped-threads", miValueConst4);
- miOutOfBandRecord.Add(miValueResult4);
- bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
+ } else {
+ // 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);
+ lldb::SBUnixSignals sbUnixSignals = sbProcess.GetUnixSignals();
+ const char *pSignal = sbUnixSignals.GetSignalAsCString(nStopReason);
+ if (pSignal) {
+ const CMICmnMIValueConst miValueConst2(pSignal);
+ const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2);
+ miOutOfBandRecord.Add(miValueResult2);
+ } else {
+ const CMIUtilString strSignal(
+ CMIUtilString::Format("%" PRIu64, nStopReason));
+ const CMICmnMIValueConst miValueConst2(strSignal);
+ const CMICmnMIValueResult miValueResult2("signal", miValueConst2);
+ miOutOfBandRecord.Add(miValueResult2);
}
- return bOk;
+ const CMIUtilString strThreadId(CMIUtilString::Format(
+ "%d", sbProcess.GetSelectedThread().GetIndexID()));
+ const CMICmnMIValueConst miValueConst3(strThreadId);
+ const CMICmnMIValueResult miValueResult3("thread-id", miValueConst3);
+ miOutOfBandRecord.Add(miValueResult3);
+ const CMICmnMIValueConst miValueConst4("all");
+ const CMICmnMIValueResult miValueResult4("stopped-threads", miValueConst4);
+ miOutOfBandRecord.Add(miValueResult4);
+ bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+ }
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Asynchronous event handler for LLDB Process stop exception.
// Type: Method.
// Args: None.
@@ -1161,37 +1202,40 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal(const lldb::SBEvent
// MIstatus::failure - Functional failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopException()
-{
- const lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- lldb::SBThread sbThread = sbProcess.GetSelectedThread();
- const size_t nStopDescriptionLen = sbThread.GetStopDescription(nullptr, 0);
- std::unique_ptr<char[]> apStopDescription(new char[nStopDescriptionLen]);
- sbThread.GetStopDescription(apStopDescription.get(), nStopDescriptionLen);
-
- // MI print "*stopped,reason=\"exception-received\",exception=\"%s\",thread-id=\"%d\",stopped-threads=\"all\""
- const CMICmnMIValueConst miValueConst("exception-received");
- const CMICmnMIValueResult miValueResult("reason", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
- const CMIUtilString strReason(apStopDescription.get());
- const CMICmnMIValueConst miValueConst2(strReason);
- const CMICmnMIValueResult miValueResult2("exception", miValueConst2);
- miOutOfBandRecord.Add(miValueResult2);
- const CMIUtilString strThreadId(CMIUtilString::Format("%d", sbThread.GetIndexID()));
- const CMICmnMIValueConst miValueConst3(strThreadId);
- const CMICmnMIValueResult miValueResult3("thread-id", miValueConst3);
- miOutOfBandRecord.Add(miValueResult3);
- const CMICmnMIValueConst miValueConst4("all");
- const CMICmnMIValueResult miValueResult4("stopped-threads", miValueConst4);
- miOutOfBandRecord.Add(miValueResult4);
- bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
-
- return bOk;
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopException() {
+ const lldb::SBProcess sbProcess =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ lldb::SBThread sbThread = sbProcess.GetSelectedThread();
+ const size_t nStopDescriptionLen = sbThread.GetStopDescription(nullptr, 0);
+ std::unique_ptr<char[]> apStopDescription(new char[nStopDescriptionLen]);
+ sbThread.GetStopDescription(apStopDescription.get(), nStopDescriptionLen);
+
+ // MI print
+ // "*stopped,reason=\"exception-received\",exception=\"%s\",thread-id=\"%d\",stopped-threads=\"all\""
+ const CMICmnMIValueConst miValueConst("exception-received");
+ const CMICmnMIValueResult miValueResult("reason", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
+ const CMIUtilString strReason(apStopDescription.get());
+ const CMICmnMIValueConst miValueConst2(strReason);
+ const CMICmnMIValueResult miValueResult2("exception", miValueConst2);
+ miOutOfBandRecord.Add(miValueResult2);
+ const CMIUtilString strThreadId(
+ CMIUtilString::Format("%d", sbThread.GetIndexID()));
+ const CMICmnMIValueConst miValueConst3(strThreadId);
+ const CMICmnMIValueResult miValueResult3("thread-id", miValueConst3);
+ miOutOfBandRecord.Add(miValueResult3);
+ const CMICmnMIValueConst miValueConst4("all");
+ const CMICmnMIValueResult miValueResult4("stopped-threads", miValueConst4);
+ miOutOfBandRecord.Add(miValueResult4);
+ bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Form partial MI response in a MI value tuple object.
// Type: Method.
// Args: vwrMiValueTuple - (W) MI value tuple object.
@@ -1199,46 +1243,50 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopException()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::MiHelpGetCurrentThreadFrame(CMICmnMIValueTuple &vwrMiValueTuple)
-{
- CMIUtilString strThreadFrame;
- lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- lldb::SBThread thread = sbProcess.GetSelectedThread();
- const MIuint nFrame = thread.GetNumFrames();
- if (nFrame == 0)
- {
- // MI print "addr=\"??\",func=\"??\",file=\"??\",fullname=\"??\",line=\"??\""
- const CMICmnMIValueConst miValueConst("??");
- const CMICmnMIValueResult miValueResult("addr", miValueConst);
- CMICmnMIValueTuple miValueTuple(miValueResult);
- const CMICmnMIValueResult miValueResult2("func", miValueConst);
- miValueTuple.Add(miValueResult2);
- const CMICmnMIValueResult miValueResult4("file", miValueConst);
- miValueTuple.Add(miValueResult4);
- const CMICmnMIValueResult miValueResult5("fullname", miValueConst);
- miValueTuple.Add(miValueResult5);
- const CMICmnMIValueResult miValueResult6("line", miValueConst);
- miValueTuple.Add(miValueResult6);
-
- vwrMiValueTuple = miValueTuple;
-
- return MIstatus::success;
- }
-
- CMICmnMIValueTuple miValueTuple;
- if (!CMICmnLLDBDebugSessionInfo::Instance().MIResponseFormFrameInfo(thread, 0, CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_NoArguments, miValueTuple))
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE), "MiHelpGetCurrentThreadFrame()"));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebuggerHandleEvents::MiHelpGetCurrentThreadFrame(
+ CMICmnMIValueTuple &vwrMiValueTuple) {
+ CMIUtilString strThreadFrame;
+ lldb::SBProcess sbProcess =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ lldb::SBThread thread = sbProcess.GetSelectedThread();
+ const MIuint nFrame = thread.GetNumFrames();
+ if (nFrame == 0) {
+ // MI print
+ // "addr=\"??\",func=\"??\",file=\"??\",fullname=\"??\",line=\"??\""
+ const CMICmnMIValueConst miValueConst("??");
+ const CMICmnMIValueResult miValueResult("addr", miValueConst);
+ CMICmnMIValueTuple miValueTuple(miValueResult);
+ const CMICmnMIValueResult miValueResult2("func", miValueConst);
+ miValueTuple.Add(miValueResult2);
+ const CMICmnMIValueResult miValueResult4("file", miValueConst);
+ miValueTuple.Add(miValueResult4);
+ const CMICmnMIValueResult miValueResult5("fullname", miValueConst);
+ miValueTuple.Add(miValueResult5);
+ const CMICmnMIValueResult miValueResult6("line", miValueConst);
+ miValueTuple.Add(miValueResult6);
vwrMiValueTuple = miValueTuple;
return MIstatus::success;
+ }
+
+ CMICmnMIValueTuple miValueTuple;
+ if (!CMICmnLLDBDebugSessionInfo::Instance().MIResponseFormFrameInfo(
+ thread, 0, CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_NoArguments,
+ miValueTuple)) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE),
+ "MiHelpGetCurrentThreadFrame()"));
+ return MIstatus::failure;
+ }
+
+ vwrMiValueTuple = miValueTuple;
+
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Asynchronous event handler for LLDB Process stop reason breakpoint.
// Type: Method.
// Args: None.
@@ -1246,27 +1294,31 @@ CMICmnLLDBDebuggerHandleEvents::MiHelpGetCurrentThreadFrame(CMICmnMIValueTuple &
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopReasonBreakpoint()
-{
- // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM
- if (!CMIDriver::Instance().SetDriverStateRunningNotDebugging())
- {
- const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription());
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_SETNEWDRIVERSTATE),
- "HandleProcessEventStopReasonBreakpoint()", rErrMsg.c_str()));
- return MIstatus::failure;
- }
-
- lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- const MIuint64 brkPtId = sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0);
- lldb::SBBreakpoint brkPt = CMICmnLLDBDebugSessionInfo::Instance().GetTarget().GetBreakpointAtIndex((MIuint)brkPtId);
-
- return MiStoppedAtBreakPoint(brkPtId, brkPt);
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopReasonBreakpoint() {
+ // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM
+ if (!CMIDriver::Instance().SetDriverStateRunningNotDebugging()) {
+ const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription());
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBOUTOFBAND_ERR_SETNEWDRIVERSTATE),
+ "HandleProcessEventStopReasonBreakpoint()", rErrMsg.c_str()));
+ return MIstatus::failure;
+ }
+
+ lldb::SBProcess sbProcess =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ const MIuint64 brkPtId =
+ sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0);
+ lldb::SBBreakpoint brkPt =
+ CMICmnLLDBDebugSessionInfo::Instance().GetTarget().GetBreakpointAtIndex(
+ (MIuint)brkPtId);
+
+ return MiStoppedAtBreakPoint(brkPtId, brkPt);
}
-//++ ------------------------------------------------------------------------------------
-// Details: Form the MI Out-of-band response for stopped reason on hitting a break point.
+//++
+//------------------------------------------------------------------------------------
+// Details: Form the MI Out-of-band response for stopped reason on hitting a
+// break point.
// Type: Method.
// Args: vBrkPtId - (R) The LLDB break point's ID
// vBrkPt - (R) THe LLDB break point object.
@@ -1274,87 +1326,97 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopReasonBreakpoint()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::MiStoppedAtBreakPoint(const MIuint64 vBrkPtId, const lldb::SBBreakpoint &vBrkPt)
-{
- bool bOk = MIstatus::success;
-
- lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- lldb::SBThread thread = sbProcess.GetSelectedThread();
- const MIuint nFrame = thread.GetNumFrames();
- if (nFrame == 0)
- {
- // MI print "*stopped,reason=\"breakpoint-hit\",disp=\"del\",bkptno=\"%d\",frame={},thread-id=\"%d\",stopped-threads=\"all\""
- const CMICmnMIValueConst miValueConst("breakpoint-hit");
- const CMICmnMIValueResult miValueResult("reason", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
- const CMICmnMIValueConst miValueConst2("del");
- const CMICmnMIValueResult miValueResult2("disp", miValueConst2);
- miOutOfBandRecord.Add(miValueResult2);
- const CMIUtilString strBkp(CMIUtilString::Format("%d", vBrkPtId));
- const CMICmnMIValueConst miValueConst3(strBkp);
- CMICmnMIValueResult miValueResult3("bkptno", miValueConst3);
- miOutOfBandRecord.Add(miValueResult3);
- const CMICmnMIValueConst miValueConst4("{}");
- const CMICmnMIValueResult miValueResult4("frame", miValueConst4);
- miOutOfBandRecord.Add(miValueResult4);
- const CMIUtilString strThreadId(CMIUtilString::Format("%d", vBrkPt.GetThreadIndex()));
- const CMICmnMIValueConst miValueConst5(strThreadId);
- const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
- miOutOfBandRecord.Add(miValueResult5);
- const CMICmnMIValueConst miValueConst6("all");
- const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6);
- miOutOfBandRecord.Add(miValueResult6);
- bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
- return bOk;
- }
-
- CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
-
+bool CMICmnLLDBDebuggerHandleEvents::MiStoppedAtBreakPoint(
+ const MIuint64 vBrkPtId, const lldb::SBBreakpoint &vBrkPt) {
+ bool bOk = MIstatus::success;
+
+ lldb::SBProcess sbProcess =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ lldb::SBThread thread = sbProcess.GetSelectedThread();
+ const MIuint nFrame = thread.GetNumFrames();
+ if (nFrame == 0) {
// MI print
- // "*stopped,reason=\"breakpoint-hit\",disp=\"del\",bkptno=\"%d\",frame={addr=\"0x%016" PRIx64 "\",func=\"%s\",args=[],file=\"%s\",fullname=\"%s\",line=\"%d\"},thread-id=\"%d\",stopped-threads=\"all\""
+ // "*stopped,reason=\"breakpoint-hit\",disp=\"del\",bkptno=\"%d\",frame={},thread-id=\"%d\",stopped-threads=\"all\""
const CMICmnMIValueConst miValueConst("breakpoint-hit");
const CMICmnMIValueResult miValueResult("reason", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
- const CMICmnMIValueConst miValueConstA("del");
- const CMICmnMIValueResult miValueResultA("disp", miValueConstA);
- miOutOfBandRecord.Add(miValueResultA);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
+ const CMICmnMIValueConst miValueConst2("del");
+ const CMICmnMIValueResult miValueResult2("disp", miValueConst2);
+ miOutOfBandRecord.Add(miValueResult2);
const CMIUtilString strBkp(CMIUtilString::Format("%d", vBrkPtId));
- const CMICmnMIValueConst miValueConstB(strBkp);
- CMICmnMIValueResult miValueResultB("bkptno", miValueConstB);
- miOutOfBandRecord.Add(miValueResultB);
-
- // frame={addr=\"0x%016" PRIx64 "\",func=\"%s\",args=[],file=\"%s\",fullname=\"%s\",line=\"%d\"}
- if (bOk)
- {
- CMICmnMIValueTuple miValueTuple;
- bOk = bOk && rSessionInfo.MIResponseFormFrameInfo(thread, 0, CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_AllArguments, miValueTuple);
- const CMICmnMIValueResult miValueResult8("frame", miValueTuple);
- miOutOfBandRecord.Add(miValueResult8);
- }
+ const CMICmnMIValueConst miValueConst3(strBkp);
+ CMICmnMIValueResult miValueResult3("bkptno", miValueConst3);
+ miOutOfBandRecord.Add(miValueResult3);
+ const CMICmnMIValueConst miValueConst4("{}");
+ const CMICmnMIValueResult miValueResult4("frame", miValueConst4);
+ miOutOfBandRecord.Add(miValueResult4);
+ const CMIUtilString strThreadId(
+ CMIUtilString::Format("%d", vBrkPt.GetThreadIndex()));
+ const CMICmnMIValueConst miValueConst5(strThreadId);
+ const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5);
+ miOutOfBandRecord.Add(miValueResult5);
+ const CMICmnMIValueConst miValueConst6("all");
+ const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6);
+ miOutOfBandRecord.Add(miValueResult6);
+ bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+ return bOk;
+ }
+
+ CMICmnLLDBDebugSessionInfo &rSessionInfo(
+ CMICmnLLDBDebugSessionInfo::Instance());
+
+ // MI print
+ // "*stopped,reason=\"breakpoint-hit\",disp=\"del\",bkptno=\"%d\",frame={addr=\"0x%016"
+ // PRIx64
+ // "\",func=\"%s\",args=[],file=\"%s\",fullname=\"%s\",line=\"%d\"},thread-id=\"%d\",stopped-threads=\"all\""
+ const CMICmnMIValueConst miValueConst("breakpoint-hit");
+ const CMICmnMIValueResult miValueResult("reason", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
+ const CMICmnMIValueConst miValueConstA("del");
+ const CMICmnMIValueResult miValueResultA("disp", miValueConstA);
+ miOutOfBandRecord.Add(miValueResultA);
+ const CMIUtilString strBkp(CMIUtilString::Format("%d", vBrkPtId));
+ const CMICmnMIValueConst miValueConstB(strBkp);
+ CMICmnMIValueResult miValueResultB("bkptno", miValueConstB);
+ miOutOfBandRecord.Add(miValueResultB);
+
+ // frame={addr=\"0x%016" PRIx64
+ // "\",func=\"%s\",args=[],file=\"%s\",fullname=\"%s\",line=\"%d\"}
+ if (bOk) {
+ CMICmnMIValueTuple miValueTuple;
+ bOk = bOk &&
+ rSessionInfo.MIResponseFormFrameInfo(
+ thread, 0,
+ CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_AllArguments,
+ miValueTuple);
+ const CMICmnMIValueResult miValueResult8("frame", miValueTuple);
+ miOutOfBandRecord.Add(miValueResult8);
+ }
- // Add to MI thread-id=\"%d\",stopped-threads=\"all\"
- if (bOk)
- {
- const CMIUtilString strThreadId(CMIUtilString::Format("%d", thread.GetIndexID()));
- const CMICmnMIValueConst miValueConst8(strThreadId);
- const CMICmnMIValueResult miValueResult8("thread-id", miValueConst8);
- miOutOfBandRecord.Add(miValueResult8);
- }
- if (bOk)
- {
- const CMICmnMIValueConst miValueConst9("all");
- const CMICmnMIValueResult miValueResult9("stopped-threads", miValueConst9);
- miOutOfBandRecord.Add(miValueResult9);
- bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
- }
+ // Add to MI thread-id=\"%d\",stopped-threads=\"all\"
+ if (bOk) {
+ const CMIUtilString strThreadId(
+ CMIUtilString::Format("%d", thread.GetIndexID()));
+ const CMICmnMIValueConst miValueConst8(strThreadId);
+ const CMICmnMIValueResult miValueResult8("thread-id", miValueConst8);
+ miOutOfBandRecord.Add(miValueResult8);
+ }
+ if (bOk) {
+ const CMICmnMIValueConst miValueConst9("all");
+ const CMICmnMIValueResult miValueResult9("stopped-threads", miValueConst9);
+ miOutOfBandRecord.Add(miValueResult9);
+ bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+ }
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Asynchronous event handler for LLDB Process stop reason trace.
// Type: Method.
// Args: None.
@@ -1362,59 +1424,65 @@ CMICmnLLDBDebuggerHandleEvents::MiStoppedAtBreakPoint(const MIuint64 vBrkPtId, c
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopReasonTrace()
-{
- bool bOk = true;
- lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- lldb::SBThread thread = sbProcess.GetSelectedThread();
- const MIuint nFrame = thread.GetNumFrames();
- if (nFrame == 0)
- {
- // MI print "*stopped,reason=\"trace\",stopped-threads=\"all\""
- const CMICmnMIValueConst miValueConst("trace");
- const CMICmnMIValueResult miValueResult("reason", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
- const CMICmnMIValueConst miValueConst2("all");
- const CMICmnMIValueResult miValueResult2("stopped-threads", miValueConst2);
- miOutOfBandRecord.Add(miValueResult2);
- bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
- return bOk;
- }
-
- CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
-
- // MI print
- // "*stopped,reason=\"end-stepping-range\",frame={addr=\"0x%016" PRIx64 "\",func=\"%s\",args=[\"%s\"],file=\"%s\",fullname=\"%s\",line=\"%d\"},thread-id=\"%d\",stopped-threads=\"all\""
-
- // Function args
- CMICmnMIValueTuple miValueTuple;
- if (!rSessionInfo.MIResponseFormFrameInfo(thread, 0, CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_AllArguments, miValueTuple))
- return MIstatus::failure;
-
- const CMICmnMIValueConst miValueConst("end-stepping-range");
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopReasonTrace() {
+ bool bOk = true;
+ lldb::SBProcess sbProcess =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ lldb::SBThread thread = sbProcess.GetSelectedThread();
+ const MIuint nFrame = thread.GetNumFrames();
+ if (nFrame == 0) {
+ // MI print "*stopped,reason=\"trace\",stopped-threads=\"all\""
+ const CMICmnMIValueConst miValueConst("trace");
const CMICmnMIValueResult miValueResult("reason", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
- const CMICmnMIValueResult miValueResult2("frame", miValueTuple);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
+ const CMICmnMIValueConst miValueConst2("all");
+ const CMICmnMIValueResult miValueResult2("stopped-threads", miValueConst2);
miOutOfBandRecord.Add(miValueResult2);
-
- // Add to MI thread-id=\"%d\",stopped-threads=\"all\"
- const CMIUtilString strThreadId(CMIUtilString::Format("%d", thread.GetIndexID()));
- const CMICmnMIValueConst miValueConst8(strThreadId);
- const CMICmnMIValueResult miValueResult8("thread-id", miValueConst8);
- miOutOfBandRecord.Add(miValueResult8);
-
- const CMICmnMIValueConst miValueConst9("all");
- const CMICmnMIValueResult miValueResult9("stopped-threads", miValueConst9);
- miOutOfBandRecord.Add(miValueResult9);
bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
bOk = bOk && CMICmnStreamStdout::WritePrompt();
-
return bOk;
+ }
+
+ CMICmnLLDBDebugSessionInfo &rSessionInfo(
+ CMICmnLLDBDebugSessionInfo::Instance());
+
+ // MI print
+ // "*stopped,reason=\"end-stepping-range\",frame={addr=\"0x%016" PRIx64
+ // "\",func=\"%s\",args=[\"%s\"],file=\"%s\",fullname=\"%s\",line=\"%d\"},thread-id=\"%d\",stopped-threads=\"all\""
+
+ // Function args
+ CMICmnMIValueTuple miValueTuple;
+ if (!rSessionInfo.MIResponseFormFrameInfo(
+ thread, 0, CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_AllArguments,
+ miValueTuple))
+ return MIstatus::failure;
+
+ const CMICmnMIValueConst miValueConst("end-stepping-range");
+ const CMICmnMIValueResult miValueResult("reason", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
+ const CMICmnMIValueResult miValueResult2("frame", miValueTuple);
+ miOutOfBandRecord.Add(miValueResult2);
+
+ // Add to MI thread-id=\"%d\",stopped-threads=\"all\"
+ const CMIUtilString strThreadId(
+ CMIUtilString::Format("%d", thread.GetIndexID()));
+ const CMICmnMIValueConst miValueConst8(strThreadId);
+ const CMICmnMIValueResult miValueResult8("thread-id", miValueConst8);
+ miOutOfBandRecord.Add(miValueResult8);
+
+ const CMICmnMIValueConst miValueConst9("all");
+ const CMICmnMIValueResult miValueResult9("stopped-threads", miValueConst9);
+ miOutOfBandRecord.Add(miValueResult9);
+ bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Asynchronous function update selected thread.
// Type: Method.
// Args: None.
@@ -1422,70 +1490,72 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopReasonTrace()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::UpdateSelectedThread()
-{
- lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance().GetDebugger().GetSelectedTarget().GetProcess();
- if (!process.IsValid())
- return MIstatus::success;
-
- lldb::SBThread currentThread = process.GetSelectedThread();
- lldb::SBThread thread;
- const lldb::StopReason eCurrentThreadStoppedReason = currentThread.GetStopReason();
- if (!currentThread.IsValid() || (eCurrentThreadStoppedReason == lldb::eStopReasonInvalid) ||
- (eCurrentThreadStoppedReason == lldb::eStopReasonNone))
- {
- // Prefer a thread that has just completed its plan over another thread as current thread
- lldb::SBThread planThread;
- lldb::SBThread otherThread;
- const size_t nThread = process.GetNumThreads();
- for (MIuint i = 0; i < nThread; i++)
- {
- // GetThreadAtIndex() uses a base 0 index
- // GetThreadByIndexID() uses a base 1 index
- thread = process.GetThreadAtIndex(i);
- const lldb::StopReason eThreadStopReason = thread.GetStopReason();
- switch (eThreadStopReason)
- {
- case lldb::eStopReasonTrace:
- case lldb::eStopReasonBreakpoint:
- case lldb::eStopReasonWatchpoint:
- case lldb::eStopReasonSignal:
- case lldb::eStopReasonException:
- if (!otherThread.IsValid())
- otherThread = thread;
- break;
- case lldb::eStopReasonPlanComplete:
- if (!planThread.IsValid())
- planThread = thread;
- break;
- case lldb::eStopReasonInvalid:
- case lldb::eStopReasonNone:
- default:
- break;
- }
- }
- if (planThread.IsValid())
- process.SetSelectedThread(planThread);
- else if (otherThread.IsValid())
- process.SetSelectedThread(otherThread);
- else
- {
- if (currentThread.IsValid())
- thread = currentThread;
- else
- thread = process.GetThreadAtIndex(0);
-
- if (thread.IsValid())
- process.SetSelectedThread(thread);
- }
- } // if( !currentThread.IsValid() || (eCurrentThreadStoppedReason == lldb::eStopReasonInvalid) || (eCurrentThreadStoppedReason ==
- // lldb::eStopReasonNone) )
-
+bool CMICmnLLDBDebuggerHandleEvents::UpdateSelectedThread() {
+ lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance()
+ .GetDebugger()
+ .GetSelectedTarget()
+ .GetProcess();
+ if (!process.IsValid())
return MIstatus::success;
+
+ lldb::SBThread currentThread = process.GetSelectedThread();
+ lldb::SBThread thread;
+ const lldb::StopReason eCurrentThreadStoppedReason =
+ currentThread.GetStopReason();
+ if (!currentThread.IsValid() ||
+ (eCurrentThreadStoppedReason == lldb::eStopReasonInvalid) ||
+ (eCurrentThreadStoppedReason == lldb::eStopReasonNone)) {
+ // Prefer a thread that has just completed its plan over another thread as
+ // current thread
+ lldb::SBThread planThread;
+ lldb::SBThread otherThread;
+ const size_t nThread = process.GetNumThreads();
+ for (MIuint i = 0; i < nThread; i++) {
+ // GetThreadAtIndex() uses a base 0 index
+ // GetThreadByIndexID() uses a base 1 index
+ thread = process.GetThreadAtIndex(i);
+ const lldb::StopReason eThreadStopReason = thread.GetStopReason();
+ switch (eThreadStopReason) {
+ case lldb::eStopReasonTrace:
+ case lldb::eStopReasonBreakpoint:
+ case lldb::eStopReasonWatchpoint:
+ case lldb::eStopReasonSignal:
+ case lldb::eStopReasonException:
+ if (!otherThread.IsValid())
+ otherThread = thread;
+ break;
+ case lldb::eStopReasonPlanComplete:
+ if (!planThread.IsValid())
+ planThread = thread;
+ break;
+ case lldb::eStopReasonInvalid:
+ case lldb::eStopReasonNone:
+ default:
+ break;
+ }
+ }
+ if (planThread.IsValid())
+ process.SetSelectedThread(planThread);
+ else if (otherThread.IsValid())
+ process.SetSelectedThread(otherThread);
+ else {
+ if (currentThread.IsValid())
+ thread = currentThread;
+ else
+ thread = process.GetThreadAtIndex(0);
+
+ if (thread.IsValid())
+ process.SetSelectedThread(thread);
+ }
+ } // if( !currentThread.IsValid() || (eCurrentThreadStoppedReason ==
+ // lldb::eStopReasonInvalid) || (eCurrentThreadStoppedReason ==
+ // lldb::eStopReasonNone) )
+
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Print to stdout "*running,thread-id=\"all\"", "(gdb)".
// Type: Method.
// Args: None.
@@ -1493,19 +1563,19 @@ CMICmnLLDBDebuggerHandleEvents::UpdateSelectedThread()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateRunning()
-{
- CMICmnMIValueConst miValueConst("all");
- CMICmnMIValueResult miValueResult("thread-id", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Running, miValueResult);
- bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
-
- return bOk;
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateRunning() {
+ CMICmnMIValueConst miValueConst("all");
+ CMICmnMIValueResult miValueResult("thread-id", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_Running, miValueResult);
+ bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Print to stdout "=thread-exited,id=\"%ld\",group-id=\"i1\"",
// "=thread-group-exited,id=\"i1\",exit-code=\"0\""),
// "*stopped,reason=\"exited-normally\"",
@@ -1516,42 +1586,44 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateRunning()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateExited()
-{
- const CMIUtilString strId(CMIUtilString::Format("%ld", 1));
- CMICmnMIValueConst miValueConst(strId);
- CMICmnMIValueResult miValueResult("id", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, miValueResult);
- CMICmnMIValueConst miValueConst2("i1");
- CMICmnMIValueResult miValueResult2("group-id", miValueConst2);
- miOutOfBandRecord.Add(miValueResult2);
- bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- if (bOk)
- {
- CMICmnMIValueConst miValueConst3("i1");
- CMICmnMIValueResult miValueResult3("id", miValueConst3);
- CMICmnMIOutOfBandRecord miOutOfBandRecord2(CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupExited, miValueResult3);
- CMICmnMIValueConst miValueConst2("0");
- CMICmnMIValueResult miValueResult2("exit-code", miValueConst2);
- miOutOfBandRecord2.Add(miValueResult2);
- bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord2);
- }
- if (bOk)
- {
- CMICmnMIValueConst miValueConst4("exited-normally");
- CMICmnMIValueResult miValueResult4("reason", miValueConst4);
- CMICmnMIOutOfBandRecord miOutOfBandRecord3(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult4);
- bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord3);
- }
- bOk = bOk && CMICmnStreamStdout::WritePrompt();
-
- return bOk;
+bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateExited() {
+ const CMIUtilString strId(CMIUtilString::Format("%ld", 1));
+ CMICmnMIValueConst miValueConst(strId);
+ CMICmnMIValueResult miValueResult("id", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, miValueResult);
+ CMICmnMIValueConst miValueConst2("i1");
+ CMICmnMIValueResult miValueResult2("group-id", miValueConst2);
+ miOutOfBandRecord.Add(miValueResult2);
+ bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ if (bOk) {
+ CMICmnMIValueConst miValueConst3("i1");
+ CMICmnMIValueResult miValueResult3("id", miValueConst3);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord2(
+ CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupExited, miValueResult3);
+ CMICmnMIValueConst miValueConst2("0");
+ CMICmnMIValueResult miValueResult2("exit-code", miValueConst2);
+ miOutOfBandRecord2.Add(miValueResult2);
+ bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord2);
+ }
+ if (bOk) {
+ CMICmnMIValueConst miValueConst4("exited-normally");
+ CMICmnMIValueResult miValueResult4("reason", miValueConst4);
+ CMICmnMIOutOfBandRecord miOutOfBandRecord3(
+ CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult4);
+ bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord3);
+ }
+ bOk = bOk && CMICmnStreamStdout::WritePrompt();
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Drain all stdout so we don't see any output come after we print our prompts.
-// The process has stuff waiting for stdout; get it and write it out to the
+//++
+//------------------------------------------------------------------------------------
+// Details: Drain all stdout so we don't see any output come after we print our
+// prompts.
+// The process has stuff waiting for stdout; get it and write it out to
+// the
// appropriate place.
// Type: Method.
// Args: None.
@@ -1559,52 +1631,55 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateExited()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::GetProcessStdout()
-{
- CMIUtilString text;
- std::unique_ptr<char[]> apStdoutBuffer(new char[1024]);
- lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance().GetDebugger().GetSelectedTarget().GetProcess();
- while (1)
- {
- const size_t nBytes = process.GetSTDOUT(apStdoutBuffer.get(), 1024);
- text.append(apStdoutBuffer.get(), nBytes);
-
- while (1)
- {
- const size_t nNewLine = text.find('\n');
- if (nNewLine == std::string::npos)
- break;
-
- const CMIUtilString line(text.substr(0, nNewLine + 1));
- text.erase(0, nNewLine + 1);
- const bool bEscapeQuotes(true);
- CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes));
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, miValueConst);
- const bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- if (!bOk)
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebuggerHandleEvents::GetProcessStdout() {
+ CMIUtilString text;
+ std::unique_ptr<char[]> apStdoutBuffer(new char[1024]);
+ lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance()
+ .GetDebugger()
+ .GetSelectedTarget()
+ .GetProcess();
+ while (1) {
+ const size_t nBytes = process.GetSTDOUT(apStdoutBuffer.get(), 1024);
+ text.append(apStdoutBuffer.get(), nBytes);
+
+ while (1) {
+ const size_t nNewLine = text.find('\n');
+ if (nNewLine == std::string::npos)
+ break;
+
+ const CMIUtilString line(text.substr(0, nNewLine + 1));
+ text.erase(0, nNewLine + 1);
+ const bool bEscapeQuotes(true);
+ CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes));
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, miValueConst);
+ const bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ if (!bOk)
+ return MIstatus::failure;
+ }
- if (nBytes == 0)
- {
- if (!text.empty())
- {
- const bool bEscapeQuotes(true);
- CMICmnMIValueConst miValueConst(text.Escape(bEscapeQuotes));
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, miValueConst);
- return MiOutOfBandRecordToStdout(miOutOfBandRecord);
- }
- break;
- }
+ if (nBytes == 0) {
+ if (!text.empty()) {
+ const bool bEscapeQuotes(true);
+ CMICmnMIValueConst miValueConst(text.Escape(bEscapeQuotes));
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput,
+ miValueConst);
+ return MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ }
+ break;
}
+ }
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Drain all stderr so we don't see any output come after we print our prompts.
-// The process has stuff waiting for stderr; get it and write it out to the
+//++
+//------------------------------------------------------------------------------------
+// Details: Drain all stderr so we don't see any output come after we print our
+// prompts.
+// The process has stuff waiting for stderr; get it and write it out to
+// the
// appropriate place.
// Type: Method.
// Args: None.
@@ -1612,49 +1687,50 @@ CMICmnLLDBDebuggerHandleEvents::GetProcessStdout()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::GetProcessStderr()
-{
- CMIUtilString text;
- std::unique_ptr<char[]> apStderrBuffer(new char[1024]);
- lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance().GetDebugger().GetSelectedTarget().GetProcess();
- while (1)
- {
- const size_t nBytes = process.GetSTDERR(apStderrBuffer.get(), 1024);
- text.append(apStderrBuffer.get(), nBytes);
-
- while (1)
- {
- const size_t nNewLine = text.find('\n');
- if (nNewLine == std::string::npos)
- break;
-
- const CMIUtilString line(text.substr(0, nNewLine + 1));
- const bool bEscapeQuotes(true);
- CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes));
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, miValueConst);
- const bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
- if (!bOk)
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebuggerHandleEvents::GetProcessStderr() {
+ CMIUtilString text;
+ std::unique_ptr<char[]> apStderrBuffer(new char[1024]);
+ lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance()
+ .GetDebugger()
+ .GetSelectedTarget()
+ .GetProcess();
+ while (1) {
+ const size_t nBytes = process.GetSTDERR(apStderrBuffer.get(), 1024);
+ text.append(apStderrBuffer.get(), nBytes);
+
+ while (1) {
+ const size_t nNewLine = text.find('\n');
+ if (nNewLine == std::string::npos)
+ break;
+
+ const CMIUtilString line(text.substr(0, nNewLine + 1));
+ const bool bEscapeQuotes(true);
+ CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes));
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, miValueConst);
+ const bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ if (!bOk)
+ return MIstatus::failure;
+ }
- if (nBytes == 0)
- {
- if (!text.empty())
- {
- const bool bEscapeQuotes(true);
- CMICmnMIValueConst miValueConst(text.Escape(bEscapeQuotes));
- CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, miValueConst);
- return MiOutOfBandRecordToStdout(miOutOfBandRecord);
- }
- break;
- }
+ if (nBytes == 0) {
+ if (!text.empty()) {
+ const bool bEscapeQuotes(true);
+ CMICmnMIValueConst miValueConst(text.Escape(bEscapeQuotes));
+ CMICmnMIOutOfBandRecord miOutOfBandRecord(
+ CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput,
+ miValueConst);
+ return MiOutOfBandRecordToStdout(miOutOfBandRecord);
+ }
+ break;
}
+ }
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Asynchronous event function check for state changes.
// Type: Method.
// Args: None.
@@ -1662,94 +1738,95 @@ CMICmnLLDBDebuggerHandleEvents::GetProcessStderr()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::ChkForStateChanges()
-{
- CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
- lldb::SBProcess sbProcess = rSessionInfo.GetProcess();
- if (!sbProcess.IsValid())
- return MIstatus::success;
-
- // Check for created threads
- const MIuint nThread = sbProcess.GetNumThreads();
- for (MIuint i = 0; i < nThread; i++)
- {
- // GetThreadAtIndex() uses a base 0 index
- // GetThreadByIndexID() uses a base 1 index
- lldb::SBThread thread = sbProcess.GetThreadAtIndex(i);
- if (!thread.IsValid())
- continue;
-
- const MIuint threadIndexID = thread.GetIndexID();
- const bool bFound = std::find(rSessionInfo.m_vecActiveThreadId.cbegin(), rSessionInfo.m_vecActiveThreadId.cend(), threadIndexID) != rSessionInfo.m_vecActiveThreadId.end();
- if (!bFound)
- {
- rSessionInfo.m_vecActiveThreadId.push_back(threadIndexID);
-
- // Form MI "=thread-created,id=\"%d\",group-id=\"i1\""
- const CMIUtilString strValue(CMIUtilString::Format("%d", threadIndexID));
- const CMICmnMIValueConst miValueConst(strValue);
- const CMICmnMIValueResult miValueResult("id", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBand(CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated, miValueResult);
- const CMICmnMIValueConst miValueConst2("i1");
- const CMICmnMIValueResult miValueResult2("group-id", miValueConst2);
- miOutOfBand.Add(miValueResult2);
- bool bOk = MiOutOfBandRecordToStdout(miOutOfBand);
- if (!bOk)
- return MIstatus::failure;
- }
- }
+bool CMICmnLLDBDebuggerHandleEvents::ChkForStateChanges() {
+ CMICmnLLDBDebugSessionInfo &rSessionInfo(
+ CMICmnLLDBDebugSessionInfo::Instance());
+ lldb::SBProcess sbProcess = rSessionInfo.GetProcess();
+ if (!sbProcess.IsValid())
+ return MIstatus::success;
- lldb::SBThread currentThread = sbProcess.GetSelectedThread();
- if (currentThread.IsValid())
- {
- const MIuint currentThreadIndexID = currentThread.GetIndexID();
- if (rSessionInfo.m_currentSelectedThread != currentThreadIndexID)
- {
- rSessionInfo.m_currentSelectedThread = currentThreadIndexID;
-
- // Form MI "=thread-selected,id=\"%d\""
- const CMIUtilString strValue(CMIUtilString::Format("%d", currentThreadIndexID));
- const CMICmnMIValueConst miValueConst(strValue);
- const CMICmnMIValueResult miValueResult("id", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBand(CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, miValueResult);
- if (!MiOutOfBandRecordToStdout(miOutOfBand))
- return MIstatus::failure;
- }
+ // Check for created threads
+ const MIuint nThread = sbProcess.GetNumThreads();
+ for (MIuint i = 0; i < nThread; i++) {
+ // GetThreadAtIndex() uses a base 0 index
+ // GetThreadByIndexID() uses a base 1 index
+ lldb::SBThread thread = sbProcess.GetThreadAtIndex(i);
+ if (!thread.IsValid())
+ continue;
+
+ const MIuint threadIndexID = thread.GetIndexID();
+ const bool bFound =
+ std::find(rSessionInfo.m_vecActiveThreadId.cbegin(),
+ rSessionInfo.m_vecActiveThreadId.cend(),
+ threadIndexID) != rSessionInfo.m_vecActiveThreadId.end();
+ if (!bFound) {
+ rSessionInfo.m_vecActiveThreadId.push_back(threadIndexID);
+
+ // Form MI "=thread-created,id=\"%d\",group-id=\"i1\""
+ const CMIUtilString strValue(CMIUtilString::Format("%d", threadIndexID));
+ const CMICmnMIValueConst miValueConst(strValue);
+ const CMICmnMIValueResult miValueResult("id", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBand(
+ CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated, miValueResult);
+ const CMICmnMIValueConst miValueConst2("i1");
+ const CMICmnMIValueResult miValueResult2("group-id", miValueConst2);
+ miOutOfBand.Add(miValueResult2);
+ bool bOk = MiOutOfBandRecordToStdout(miOutOfBand);
+ if (!bOk)
+ return MIstatus::failure;
}
-
- // Check for invalid (removed) threads
- CMICmnLLDBDebugSessionInfo::VecActiveThreadId_t::iterator it = rSessionInfo.m_vecActiveThreadId.begin();
- while (it != rSessionInfo.m_vecActiveThreadId.end())
- {
- const MIuint threadIndexID = *it;
- lldb::SBThread thread = sbProcess.GetThreadByIndexID(threadIndexID);
- if (!thread.IsValid())
- {
- // Form MI "=thread-exited,id=\"%ld\",group-id=\"i1\""
- const CMIUtilString strValue(CMIUtilString::Format("%ld", threadIndexID));
- const CMICmnMIValueConst miValueConst(strValue);
- const CMICmnMIValueResult miValueResult("id", miValueConst);
- CMICmnMIOutOfBandRecord miOutOfBand(CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, miValueResult);
- const CMICmnMIValueConst miValueConst2("i1");
- const CMICmnMIValueResult miValueResult2("group-id", miValueConst2);
- miOutOfBand.Add(miValueResult2);
- bool bOk = MiOutOfBandRecordToStdout(miOutOfBand);
- if (!bOk)
- return MIstatus::failure;
-
- // Remove current thread from cache and get next
- it = rSessionInfo.m_vecActiveThreadId.erase(it);
- }
- else
- // Next
- ++it;
+ }
+
+ lldb::SBThread currentThread = sbProcess.GetSelectedThread();
+ if (currentThread.IsValid()) {
+ const MIuint currentThreadIndexID = currentThread.GetIndexID();
+ if (rSessionInfo.m_currentSelectedThread != currentThreadIndexID) {
+ rSessionInfo.m_currentSelectedThread = currentThreadIndexID;
+
+ // Form MI "=thread-selected,id=\"%d\""
+ const CMIUtilString strValue(
+ CMIUtilString::Format("%d", currentThreadIndexID));
+ const CMICmnMIValueConst miValueConst(strValue);
+ const CMICmnMIValueResult miValueResult("id", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBand(
+ CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, miValueResult);
+ if (!MiOutOfBandRecordToStdout(miOutOfBand))
+ return MIstatus::failure;
}
+ }
+
+ // Check for invalid (removed) threads
+ CMICmnLLDBDebugSessionInfo::VecActiveThreadId_t::iterator it =
+ rSessionInfo.m_vecActiveThreadId.begin();
+ while (it != rSessionInfo.m_vecActiveThreadId.end()) {
+ const MIuint threadIndexID = *it;
+ lldb::SBThread thread = sbProcess.GetThreadByIndexID(threadIndexID);
+ if (!thread.IsValid()) {
+ // Form MI "=thread-exited,id=\"%ld\",group-id=\"i1\""
+ const CMIUtilString strValue(CMIUtilString::Format("%ld", threadIndexID));
+ const CMICmnMIValueConst miValueConst(strValue);
+ const CMICmnMIValueResult miValueResult("id", miValueConst);
+ CMICmnMIOutOfBandRecord miOutOfBand(
+ CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, miValueResult);
+ const CMICmnMIValueConst miValueConst2("i1");
+ const CMICmnMIValueResult miValueResult2("group-id", miValueConst2);
+ miOutOfBand.Add(miValueResult2);
+ bool bOk = MiOutOfBandRecordToStdout(miOutOfBand);
+ if (!bOk)
+ return MIstatus::failure;
- return CMICmnStreamStdout::WritePrompt();
+ // Remove current thread from cache and get next
+ it = rSessionInfo.m_vecActiveThreadId.erase(it);
+ } else
+ // Next
+ ++it;
+ }
+
+ return CMICmnStreamStdout::WritePrompt();
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Take a fully formed MI result record and send to the stdout stream.
// Also output to the MI Log file.
// Type: Method.
@@ -1758,14 +1835,15 @@ CMICmnLLDBDebuggerHandleEvents::ChkForStateChanges()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::MiResultRecordToStdout(const CMICmnMIResultRecord &vrMiResultRecord)
-{
- return TextToStdout(vrMiResultRecord.GetString());
+bool CMICmnLLDBDebuggerHandleEvents::MiResultRecordToStdout(
+ const CMICmnMIResultRecord &vrMiResultRecord) {
+ return TextToStdout(vrMiResultRecord.GetString());
}
-//++ ------------------------------------------------------------------------------------
-// Details: Take a fully formed MI Out-of-band record and send to the stdout stream.
+//++
+//------------------------------------------------------------------------------------
+// Details: Take a fully formed MI Out-of-band record and send to the stdout
+// stream.
// Also output to the MI Log file.
// Type: Method.
// Args: vrMiOutOfBandRecord - (R) MI Out-of-band record object.
@@ -1773,14 +1851,15 @@ CMICmnLLDBDebuggerHandleEvents::MiResultRecordToStdout(const CMICmnMIResultRecor
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::MiOutOfBandRecordToStdout(const CMICmnMIOutOfBandRecord &vrMiOutOfBandRecord)
-{
- return TextToStdout(vrMiOutOfBandRecord.GetString());
+bool CMICmnLLDBDebuggerHandleEvents::MiOutOfBandRecordToStdout(
+ const CMICmnMIOutOfBandRecord &vrMiOutOfBandRecord) {
+ return TextToStdout(vrMiOutOfBandRecord.GetString());
}
-//++ ------------------------------------------------------------------------------------
-// Details: Take a text data and send to the stdout stream. Also output to the MI Log
+//++
+//------------------------------------------------------------------------------------
+// Details: Take a text data and send to the stdout stream. Also output to the
+// MI Log
// file.
// Type: Method.
// Args: vrTxt - (R) Text.
@@ -1788,14 +1867,14 @@ CMICmnLLDBDebuggerHandleEvents::MiOutOfBandRecordToStdout(const CMICmnMIOutOfBan
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::TextToStdout(const CMIUtilString &vrTxt)
-{
- return CMICmnStreamStdout::TextToStdout(vrTxt);
+bool CMICmnLLDBDebuggerHandleEvents::TextToStdout(const CMIUtilString &vrTxt) {
+ return CMICmnStreamStdout::TextToStdout(vrTxt);
}
-//++ ------------------------------------------------------------------------------------
-// Details: Take a text data and send to the stderr stream. Also output to the MI Log
+//++
+//------------------------------------------------------------------------------------
+// Details: Take a text data and send to the stderr stream. Also output to the
+// MI Log
// file.
// Type: Method.
// Args: vrTxt - (R) Text.
@@ -1803,34 +1882,31 @@ CMICmnLLDBDebuggerHandleEvents::TextToStdout(const CMIUtilString &vrTxt)
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebuggerHandleEvents::TextToStderr(const CMIUtilString &vrTxt)
-{
- return CMICmnStreamStderr::TextToStderr(vrTxt);
+bool CMICmnLLDBDebuggerHandleEvents::TextToStderr(const CMIUtilString &vrTxt) {
+ return CMICmnStreamStderr::TextToStderr(vrTxt);
}
-//++ ------------------------------------------------------------------------------------
-// Details: Initialize the member variables with the signal values in this process
+//++
+//------------------------------------------------------------------------------------
+// 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;
- }
+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;
}
+ }
}
OpenPOWER on IntegriCloud