Index: lit/tools/lldb-mi/exec/exec-step.test =================================================================== --- /dev/null +++ lit/tools/lldb-mi/exec/exec-step.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-step 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-step --thread 0 +# Check that exec-step can process the case of invalid thread ID. +# CHECK: ^error,msg="Command 'exec-step'. Thread ID invalid" + +-exec-step +# Check that exec-step can step-in in a selected thread. +# CHECK: ^running +# CHECK: *stopped,reason="end-stepping-range" Index: tools/lldb-mi/MICmdCmdExec.cpp =================================================================== --- tools/lldb-mi/MICmdCmdExec.cpp +++ tools/lldb-mi/MICmdCmdExec.cpp @@ -510,14 +510,28 @@ CMICmnLLDBDebugSessionInfo &rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBDebugger &rDebugger = rSessionInfo.GetDebugger(); - CMIUtilString strCmd("thread step-in"); - if (nThreadId != UINT64_MAX) - strCmd += CMIUtilString::Format(" %llu", nThreadId); - rDebugger.GetCommandInterpreter().HandleCommand(strCmd.c_str(), m_lldbResult, - false); - return MIstatus::success; + lldb::SBError error; + if (nThreadId != UINT64_MAX) { + lldb::SBThread sbThread = rSessionInfo.GetProcess().GetThreadByID(nThreadId); + if (sbThread.IsValid()) + sbThread.StepInto(nullptr, LLDB_INVALID_LINE_NUMBER, error); + 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().StepInto( + nullptr, LLDB_INVALID_LINE_NUMBER, error); + + if (error.Success()) + return MIstatus::success; + + SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FNFAILED), + m_cmdData.strMiCmd.c_str(), + error.GetCString())); + return MIstatus::failure; } //++