(lldb) help frame dump
Dump the current stack frame
Syntax: frame dump
(lldb) frame dump
frame #0: 0x000050dc hello`foo + 4 at hello.c:10
0x041100e0: 1f 1f 1f 1f
0x041100e4: 1f 1f 1f 1f
sp>0x041100e8: ef be be ba
0x041100ec: ef be be ba
fp> 0x041100f0: 28 01 11 04
0x041100f4: 1c 51 00 00 hello`main + 40 at hello.c:17
0x041100f8: ef be be ba
(lldb)
http://reviews.llvm.org/D4640
Files:
source/Commands/CommandObjectFrame.cpp
source/Commands/CommandObjectRegister.cpp
Index: source/Commands/CommandObjectFrame.cpp
===================================================================
--- source/Commands/CommandObjectFrame.cpp
+++ source/Commands/CommandObjectFrame.cpp
@@ -45,6 +45,8 @@
#include "lldb/Target/StackFrame.h"
#include "lldb/Target/Thread.h"
#include "lldb/Target/Target.h"
+#include "lldb/Target/RegisterContext.h"
+#include "lldb/Target/SectionLoadList.h"
using namespace lldb;
using namespace lldb_private;
@@ -602,6 +604,122 @@
OptionGroupValueObjectDisplay m_varobj_options;
};
+class CommandObjectFrameDump : public CommandObjectParsed
+{
+public:
+
+ CommandObjectFrameDump (CommandInterpreter &interpreter) :
+ CommandObjectParsed ( interpreter,
+ "frame dump",
+ "Dump the current stack frame",
+ "frame dump",
+ eFlagRequiresTarget |
+ eFlagRequiresFrame |
+ eFlagTryTargetAPILock |
+ eFlagProcessMustBeLaunched |
+ eFlagProcessMustBePaused )
+ {
+ }
+
+ ~CommandObjectFrameDump ()
+ {
+ }
+
+protected:
+ bool
+ DoExecute (Args& command, CommandReturnObject &result)
+ {
+ result.SetStatus (eReturnStatusSuccessFinishResult);
+ lldb_private::Error error;
+
+ // get the current target
+ Target *target = m_exe_ctx.GetTargetPtr();
+
+ // get the architecture bit size
+ int archBits = target->GetArchitecture( ).GetAddressByteSize( );
+
+ lldb_private::Stream &output = result.GetOutputStream( );
+ lldb_private::StackFrame *frame = m_exe_ctx.GetFramePtr( );
+ lldb_private::RegisterContext *reg = frame->GetRegisterContext( ).get( );
+
+ // find the frame extent
+ uint64_t r_sp = reg->GetSP( );
+ uint64_t r_fp = reg->GetFP( );
+ uint64_t start = r_sp - archBits*2; // pad out a little
+ uint64_t end = r_fp + archBits*3;
+ int64_t size = (end - start);
+
+ // check we have something to read
+ if ( size <= 0 )
+ return result.Succeeded();
+
+ // allocate space for the memory read
+ uint8_t * data = new uint8_t[ size ];
+ assert( data != nullptr );
+
+ // read in the stack data
+ Address memAddr = Address( start );
+ size_t read = target->ReadMemory( memAddr, false, data, size, error );
+
+ // only dump as much as we have
+ if ( read < size ) size = read;
+
+ // display the current frame index
+ uint32_t fidx = frame->GetFrameIndex( );
+ m_exe_ctx.GetFrameRef().DumpUsingSettingsFormat( &output );
+
+ //
+ uint64_t value = 0;
+
+ // print out the stack
+ for ( int i = 0; i < size; i++ )
+ {
+ // start of aligned address
+ if ( start % archBits == 0 )
+ {
+ if ( i > 0 )
+ {
+ // dump symbol for this stack entry
+ Address so_reg_addr;
+ if ( target->GetSectionLoadList().ResolveLoadAddress( value, so_reg_addr) )
+ {
+ output.PutCString (" ");
+ so_reg_addr.Dump(&output, m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
+ }
+ output.Printf( "\n" );
+ }
+
+ // label the sp and fp
+ if ( start == r_sp ) output.Printf( "sp> " );
+ else if ( start == r_fp ) output.Printf( "fp> " );
+ else output.Printf( " " );
+
+ // output the address
+ output.Printf( "0x%08x: ", start );
+
+ // clear the current value
+ value = 0;
+ }
+
+ // push data into values high byte
+ value = ( value >> 8 );
+ value |= ( data[i] << 24 ); // sets sign bit for ? reason
+ value &= 0xffffffff; // so have to mask
+
+ // output one byte of data
+ output.Printf( "%02x ", data[i] );
+ start += 1;
+ }
+
+ // clean up and release the memory
+ if ( data != nullptr )
+ delete[] data;
+ data = nullptr;
+
+ output.Printf( "\n" );
+ return result.Succeeded();
+ }
+};
#pragma mark CommandObjectMultiwordFrame
@@ -615,9 +733,10 @@
"A set of commands for operating on the current thread's frames.",
"frame <subcommand> [<subcommand-options>]")
{
- LoadSubCommand ("info", CommandObjectSP (new CommandObjectFrameInfo (interpreter)));
- LoadSubCommand ("select", CommandObjectSP (new CommandObjectFrameSelect (interpreter)));
- LoadSubCommand ("variable", CommandObjectSP (new CommandObjectFrameVariable (interpreter)));
+ LoadSubCommand ("info" , CommandObjectSP (new CommandObjectFrameInfo (interpreter)));
+ LoadSubCommand ("select" , CommandObjectSP (new CommandObjectFrameSelect (interpreter)));
+ LoadSubCommand ("variable", CommandObjectSP (new CommandObjectFrameVariable(interpreter)));
+ LoadSubCommand ("dump ", CommandObjectSP (new CommandObjectFrameDump (interpreter)));
}
CommandObjectMultiwordFrame::~CommandObjectMultiwordFrame ()
Index: source/Commands/CommandObjectRegister.cpp
===================================================================
--- source/Commands/CommandObjectRegister.cpp
+++ source/Commands/CommandObjectRegister.cpp
@@ -154,6 +154,10 @@
if (primitive_only && reg_info && reg_info->value_regs)
continue;
+ // dont dump invalid (padding) registers
+ if (reg_info->format == eFormatInvalid && reg_info->encoding == eEncodingInvalid)
+ continue;
+
if (DumpRegister (exe_ctx, strm, reg_ctx, reg_info))
++available_count;
else
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits