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