KLapshin created this revision.
KLapshin added reviewers: dawn, ki.stfu, abidh.
KLapshin added a subscriber: lldb-commits.
KLapshin set the repository for this revision to rL LLVM.
This patch fixes lldb core crash in Listener waiting for process ended and
operates with already invalid data if lldb-mi requested process destroy in
-exec-abort command handler without getting process stopped at first.
To avoid crash in existing code MI user should do process stop explicitly:
-exec-interrupt
-exec-abort
With this patch MI ExecAbort handler make sure process stopped safely, then
process destroyed, so MI user can invoke just -exec-abort MI command to finish
debug session regardless of process running or stopped already.
-exec-abort use "process interrupt" command via command interpreter class.
Repository:
rL LLVM
http://reviews.llvm.org/D12968
Files:
tools/lldb-mi/MICmdCmdExec.cpp
tools/lldb-mi/MICmdCmdExec.h
Index: tools/lldb-mi/MICmdCmdExec.h
===================================================================
--- tools/lldb-mi/MICmdCmdExec.h
+++ tools/lldb-mi/MICmdCmdExec.h
@@ -328,4 +328,7 @@
bool Acknowledge() override;
// From CMICmnBase
/* dtor */ ~CMICmdCmdExecAbort() override;
+ // Attributes:
+ private:
+ lldb::SBCommandReturnObject m_lldbResult;
};
Index: tools/lldb-mi/MICmdCmdExec.cpp
===================================================================
--- tools/lldb-mi/MICmdCmdExec.cpp
+++ tools/lldb-mi/MICmdCmdExec.cpp
@@ -1167,6 +1167,18 @@
{
CMICmnLLDBDebugSessionInfo
&rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
lldb::SBProcess sbProcess = rSessionInfo.GetProcess();
+ lldb::SBDebugger &rDebugger = rSessionInfo.GetDebugger();
+ CMIUtilString strCmd("process interrupt");
+ const lldb::ReturnStatus status =
rDebugger.GetCommandInterpreter().HandleCommand(strCmd.c_str(), m_lldbResult,
false);
+ MIunused(status);
+
+ if (!CMIDriver::Instance().SetDriverStateRunningNotDebugging())
+ {
+ const CMIUtilString
&rErrMsg(CMIDriver::Instance().GetErrorDescription());
+
SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE),
strCmd.c_str(), rErrMsg.c_str()));
+ return MIstatus::failure;
+ }
+
if (!sbProcess.IsValid())
{
SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS),
m_cmdData.strMiCmd.c_str()));
Index: tools/lldb-mi/MICmdCmdExec.h
===================================================================
--- tools/lldb-mi/MICmdCmdExec.h
+++ tools/lldb-mi/MICmdCmdExec.h
@@ -328,4 +328,7 @@
bool Acknowledge() override;
// From CMICmnBase
/* dtor */ ~CMICmdCmdExecAbort() override;
+ // Attributes:
+ private:
+ lldb::SBCommandReturnObject m_lldbResult;
};
Index: tools/lldb-mi/MICmdCmdExec.cpp
===================================================================
--- tools/lldb-mi/MICmdCmdExec.cpp
+++ tools/lldb-mi/MICmdCmdExec.cpp
@@ -1167,6 +1167,18 @@
{
CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
lldb::SBProcess sbProcess = rSessionInfo.GetProcess();
+ lldb::SBDebugger &rDebugger = rSessionInfo.GetDebugger();
+ CMIUtilString strCmd("process interrupt");
+ const lldb::ReturnStatus status = rDebugger.GetCommandInterpreter().HandleCommand(strCmd.c_str(), m_lldbResult, false);
+ MIunused(status);
+
+ if (!CMIDriver::Instance().SetDriverStateRunningNotDebugging())
+ {
+ const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription());
+ SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE), strCmd.c_str(), rErrMsg.c_str()));
+ return MIstatus::failure;
+ }
+
if (!sbProcess.IsValid())
{
SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), m_cmdData.strMiCmd.c_str()));
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits