Index: lit/tools/lldb-mi/exec/exec-next.test =================================================================== --- /dev/null +++ lit/tools/lldb-mi/exec/exec-next.test @@ -0,0 +1,26 @@ +# XFAIL: windows +# -> llvm.org/pr24452 +# +# RUN: %cc -o %t %p/inputs/main.c -g +# RUN: %lldbmi %t < %s | FileCheck %s + +# Test lldb-mi -exec-next command. + +# Check that we have a valid target created via '%lldbmi %t'. +# CHECK: ^done + +-break-insert main +# CHECK: ^done,bkpt={number="1" + +-exec-run +# CHECK: ^running +# CHECK: *stopped,reason="breakpoint-hit" + +-exec-next --thread 0 +# Check that exec-next can process the case of invalid thread ID. +# CHECK: ^error,msg="Command 'exec-next'. Thread ID invalid" + +-exec-next +# Check that exec-next can step over in a selected thread. +# CHECK: ^running +# CHECK: *stopped,reason="end-stepping-range" Index: lit/tools/lldb-mi/exec/inputs/main.c =================================================================== --- /dev/null +++ lit/tools/lldb-mi/exec/inputs/main.c @@ -0,0 +1,4 @@ +int main(void) { + int x = 0; + return x; +} Index: tools/lldb-mi/MICmdCmdExec.cpp =================================================================== --- tools/lldb-mi/MICmdCmdExec.cpp +++ tools/lldb-mi/MICmdCmdExec.cpp @@ -22,6 +22,7 @@ #include "lldb/API/SBCommandInterpreter.h" #include "lldb/API/SBProcess.h" #include "lldb/API/SBStream.h" +#include "lldb/API/SBThread.h" #include "lldb/lldb-enumerations.h" // In-house headers: @@ -378,12 +379,18 @@ CMICmnLLDBDebugSessionInfo &rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBDebugger &rDebugger = rSessionInfo.GetDebugger(); - CMIUtilString strCmd("thread step-over"); - if (nThreadId != UINT64_MAX) - strCmd += CMIUtilString::Format(" %llu", nThreadId); - rDebugger.GetCommandInterpreter().HandleCommand(strCmd.c_str(), m_lldbResult, - false); + + if (nThreadId != UINT64_MAX) { + lldb::SBThread sbThread = rSessionInfo.GetProcess().GetThreadByID(nThreadId); + if (sbThread.IsValid()) + sbThread.StepOver(); + else { + SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), + m_cmdData.strMiCmd.c_str(), + m_constStrArgThread.c_str())); + return MIstatus::failure; + } + } else rSessionInfo.GetProcess().GetSelectedThread().StepOver(); return MIstatus::success; }