1*30fdc8d8SChris Lattner //===-- CommandObjectFrame.cpp ----------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner 10*30fdc8d8SChris Lattner #include "CommandObjectFrame.h" 11*30fdc8d8SChris Lattner 12*30fdc8d8SChris Lattner // C Includes 13*30fdc8d8SChris Lattner // C++ Includes 14*30fdc8d8SChris Lattner // Other libraries and framework includes 15*30fdc8d8SChris Lattner // Project includes 16*30fdc8d8SChris Lattner #include "lldb/Core/Args.h" 17*30fdc8d8SChris Lattner #include "lldb/Core/Debugger.h" 18*30fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 19*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandContext.h" 20*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h" 21*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 22*30fdc8d8SChris Lattner #include "lldb/Target/Process.h" 23*30fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h" 24*30fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 25*30fdc8d8SChris Lattner 26*30fdc8d8SChris Lattner #include "CommandObjectThread.h" 27*30fdc8d8SChris Lattner 28*30fdc8d8SChris Lattner using namespace lldb; 29*30fdc8d8SChris Lattner using namespace lldb_private; 30*30fdc8d8SChris Lattner 31*30fdc8d8SChris Lattner #pragma mark CommandObjectFrameInfo 32*30fdc8d8SChris Lattner 33*30fdc8d8SChris Lattner //------------------------------------------------------------------------- 34*30fdc8d8SChris Lattner // CommandObjectFrameInfo 35*30fdc8d8SChris Lattner //------------------------------------------------------------------------- 36*30fdc8d8SChris Lattner 37*30fdc8d8SChris Lattner class CommandObjectFrameInfo : public CommandObject 38*30fdc8d8SChris Lattner { 39*30fdc8d8SChris Lattner public: 40*30fdc8d8SChris Lattner 41*30fdc8d8SChris Lattner CommandObjectFrameInfo () : 42*30fdc8d8SChris Lattner CommandObject ("frame info", 43*30fdc8d8SChris Lattner "Lists information about the currently selected frame in the current thread.", 44*30fdc8d8SChris Lattner "frame info", 45*30fdc8d8SChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused) 46*30fdc8d8SChris Lattner { 47*30fdc8d8SChris Lattner } 48*30fdc8d8SChris Lattner 49*30fdc8d8SChris Lattner ~CommandObjectFrameInfo () 50*30fdc8d8SChris Lattner { 51*30fdc8d8SChris Lattner } 52*30fdc8d8SChris Lattner 53*30fdc8d8SChris Lattner bool 54*30fdc8d8SChris Lattner Execute (Args& command, 55*30fdc8d8SChris Lattner CommandContext *context, 56*30fdc8d8SChris Lattner CommandInterpreter *interpreter, 57*30fdc8d8SChris Lattner CommandReturnObject &result) 58*30fdc8d8SChris Lattner { 59*30fdc8d8SChris Lattner ExecutionContext exe_ctx(context->GetExecutionContext()); 60*30fdc8d8SChris Lattner if (exe_ctx.frame) 61*30fdc8d8SChris Lattner { 62*30fdc8d8SChris Lattner exe_ctx.frame->Dump (&result.GetOutputStream(), true); 63*30fdc8d8SChris Lattner result.GetOutputStream().EOL(); 64*30fdc8d8SChris Lattner result.SetStatus (eReturnStatusSuccessFinishResult); 65*30fdc8d8SChris Lattner } 66*30fdc8d8SChris Lattner else 67*30fdc8d8SChris Lattner { 68*30fdc8d8SChris Lattner result.AppendError ("no current frame"); 69*30fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 70*30fdc8d8SChris Lattner } 71*30fdc8d8SChris Lattner return result.Succeeded(); 72*30fdc8d8SChris Lattner } 73*30fdc8d8SChris Lattner }; 74*30fdc8d8SChris Lattner 75*30fdc8d8SChris Lattner #pragma mark CommandObjectFrameSelect 76*30fdc8d8SChris Lattner 77*30fdc8d8SChris Lattner //------------------------------------------------------------------------- 78*30fdc8d8SChris Lattner // CommandObjectFrameSelect 79*30fdc8d8SChris Lattner //------------------------------------------------------------------------- 80*30fdc8d8SChris Lattner 81*30fdc8d8SChris Lattner class CommandObjectFrameSelect : public CommandObject 82*30fdc8d8SChris Lattner { 83*30fdc8d8SChris Lattner public: 84*30fdc8d8SChris Lattner 85*30fdc8d8SChris Lattner CommandObjectFrameSelect () : 86*30fdc8d8SChris Lattner CommandObject ("frame select", 87*30fdc8d8SChris Lattner "Select the current frame by index in the current thread.", 88*30fdc8d8SChris Lattner "frame select <frame-index>", 89*30fdc8d8SChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused) 90*30fdc8d8SChris Lattner { 91*30fdc8d8SChris Lattner } 92*30fdc8d8SChris Lattner 93*30fdc8d8SChris Lattner ~CommandObjectFrameSelect () 94*30fdc8d8SChris Lattner { 95*30fdc8d8SChris Lattner } 96*30fdc8d8SChris Lattner 97*30fdc8d8SChris Lattner bool 98*30fdc8d8SChris Lattner Execute (Args& command, 99*30fdc8d8SChris Lattner CommandContext *context, 100*30fdc8d8SChris Lattner CommandInterpreter *interpreter, 101*30fdc8d8SChris Lattner CommandReturnObject &result) 102*30fdc8d8SChris Lattner { 103*30fdc8d8SChris Lattner ExecutionContext exe_ctx (context->GetExecutionContext()); 104*30fdc8d8SChris Lattner if (exe_ctx.thread) 105*30fdc8d8SChris Lattner { 106*30fdc8d8SChris Lattner if (command.GetArgumentCount() == 1) 107*30fdc8d8SChris Lattner { 108*30fdc8d8SChris Lattner const char *frame_idx_cstr = command.GetArgumentAtIndex(0); 109*30fdc8d8SChris Lattner 110*30fdc8d8SChris Lattner const uint32_t num_frames = exe_ctx.thread->GetStackFrameCount(); 111*30fdc8d8SChris Lattner const uint32_t frame_idx = Args::StringToUInt32 (frame_idx_cstr, UINT32_MAX, 0); 112*30fdc8d8SChris Lattner if (frame_idx < num_frames) 113*30fdc8d8SChris Lattner { 114*30fdc8d8SChris Lattner exe_ctx.thread->SetCurrentFrameByIndex (frame_idx); 115*30fdc8d8SChris Lattner exe_ctx.frame = exe_ctx.thread->GetCurrentFrame ().get(); 116*30fdc8d8SChris Lattner 117*30fdc8d8SChris Lattner if (exe_ctx.frame) 118*30fdc8d8SChris Lattner { 119*30fdc8d8SChris Lattner if (DisplayFrameForExecutionContext (exe_ctx.thread, 120*30fdc8d8SChris Lattner exe_ctx.frame, 121*30fdc8d8SChris Lattner interpreter, 122*30fdc8d8SChris Lattner result.GetOutputStream(), 123*30fdc8d8SChris Lattner true, 124*30fdc8d8SChris Lattner true, 125*30fdc8d8SChris Lattner 3, 126*30fdc8d8SChris Lattner 3)) 127*30fdc8d8SChris Lattner { 128*30fdc8d8SChris Lattner result.SetStatus (eReturnStatusSuccessFinishResult); 129*30fdc8d8SChris Lattner return result.Succeeded(); 130*30fdc8d8SChris Lattner } 131*30fdc8d8SChris Lattner } 132*30fdc8d8SChris Lattner } 133*30fdc8d8SChris Lattner if (frame_idx == UINT32_MAX) 134*30fdc8d8SChris Lattner result.AppendErrorWithFormat ("Invalid frame index: %s.\n", frame_idx_cstr); 135*30fdc8d8SChris Lattner else 136*30fdc8d8SChris Lattner result.AppendErrorWithFormat ("Frame index (%u) out of range.\n", frame_idx); 137*30fdc8d8SChris Lattner } 138*30fdc8d8SChris Lattner else 139*30fdc8d8SChris Lattner { 140*30fdc8d8SChris Lattner result.AppendError ("invalid arguments"); 141*30fdc8d8SChris Lattner result.AppendErrorWithFormat ("Usage: %s\n", m_cmd_syntax.c_str()); 142*30fdc8d8SChris Lattner } 143*30fdc8d8SChris Lattner } 144*30fdc8d8SChris Lattner else 145*30fdc8d8SChris Lattner { 146*30fdc8d8SChris Lattner result.AppendError ("no current thread"); 147*30fdc8d8SChris Lattner } 148*30fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 149*30fdc8d8SChris Lattner return false; 150*30fdc8d8SChris Lattner } 151*30fdc8d8SChris Lattner }; 152*30fdc8d8SChris Lattner 153*30fdc8d8SChris Lattner #pragma mark CommandObjectMultiwordFrame 154*30fdc8d8SChris Lattner 155*30fdc8d8SChris Lattner //------------------------------------------------------------------------- 156*30fdc8d8SChris Lattner // CommandObjectMultiwordFrame 157*30fdc8d8SChris Lattner //------------------------------------------------------------------------- 158*30fdc8d8SChris Lattner 159*30fdc8d8SChris Lattner CommandObjectMultiwordFrame::CommandObjectMultiwordFrame (CommandInterpreter *interpreter) : 160*30fdc8d8SChris Lattner CommandObjectMultiword ("frame", 161*30fdc8d8SChris Lattner "A set of commands for operating on the current thread's frames.", 162*30fdc8d8SChris Lattner "frame <subcommand> [<subcommand-options>]") 163*30fdc8d8SChris Lattner { 164*30fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectFrameInfo ()), "info", interpreter); 165*30fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectFrameSelect ()), "select", interpreter); 166*30fdc8d8SChris Lattner } 167*30fdc8d8SChris Lattner 168*30fdc8d8SChris Lattner CommandObjectMultiwordFrame::~CommandObjectMultiwordFrame () 169*30fdc8d8SChris Lattner { 170*30fdc8d8SChris Lattner } 171*30fdc8d8SChris Lattner 172