Add some more commands to the CLI.
- Added 'frame' command for setting/printing the context's current stack frame within the active stack trace. - Added 'variables' command for printing the list of variables visible within the current frame.
This commit is contained in:
@@ -193,11 +193,13 @@ Application Debugger :
|
|||||||
CliContext.cpp
|
CliContext.cpp
|
||||||
CliContinueCommand.cpp
|
CliContinueCommand.cpp
|
||||||
CliDebugReportCommand.cpp
|
CliDebugReportCommand.cpp
|
||||||
|
CliStackFrameCommand.cpp
|
||||||
CliStackTraceCommand.cpp
|
CliStackTraceCommand.cpp
|
||||||
CliStopCommand.cpp
|
CliStopCommand.cpp
|
||||||
CliThreadCommand.cpp
|
CliThreadCommand.cpp
|
||||||
CliThreadsCommand.cpp
|
CliThreadsCommand.cpp
|
||||||
CliQuitCommand.cpp
|
CliQuitCommand.cpp
|
||||||
|
CliVariablesCommand.cpp
|
||||||
CommandLineUserInterface.cpp
|
CommandLineUserInterface.cpp
|
||||||
|
|
||||||
# user_interface/gui
|
# user_interface/gui
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012, Rene Gollent, [email protected].
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "CliStackFrameCommand.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <AutoLocker.h>
|
||||||
|
|
||||||
|
#include "CliContext.h"
|
||||||
|
#include "FunctionInstance.h"
|
||||||
|
#include "StackFrame.h"
|
||||||
|
#include "StackTrace.h"
|
||||||
|
#include "Team.h"
|
||||||
|
|
||||||
|
|
||||||
|
CliStackFrameCommand::CliStackFrameCommand()
|
||||||
|
:
|
||||||
|
CliCommand("set current stack frame",
|
||||||
|
"%s [ <frame number> ]\n"
|
||||||
|
"Sets the current stack frame to <frame number>, if supplied. "
|
||||||
|
"Otherwise\n prints the current frame.")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
CliStackFrameCommand::Execute(int argc, const char* const* argv,
|
||||||
|
CliContext& context)
|
||||||
|
{
|
||||||
|
if (argc > 2) {
|
||||||
|
PrintUsage(argv[0]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StackTrace* stackTrace = context.GetStackTrace();
|
||||||
|
if (argc == 1) {
|
||||||
|
int32 currentFrameIndex = context.CurrentStackFrameIndex();
|
||||||
|
if (currentFrameIndex < 0)
|
||||||
|
printf("No current frame.\n");
|
||||||
|
else {
|
||||||
|
StackFrame* frame = stackTrace->FrameAt(currentFrameIndex);
|
||||||
|
printf("Current frame: %" B_PRId32 ": %s\n", currentFrameIndex,
|
||||||
|
frame->Function()->PrettyName().String());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// parse the argument
|
||||||
|
char* endPointer;
|
||||||
|
int32 frameNumber = strtol(argv[1], &endPointer, 0);
|
||||||
|
if (*endPointer != '\0' || frameNumber < 0) {
|
||||||
|
printf("Error: Invalid parameter \"%s\"\n", argv[1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stackTrace == NULL || frameNumber >= stackTrace->CountFrames()) {
|
||||||
|
printf("Error: Index %" B_PRId32 " out of range\n", frameNumber);
|
||||||
|
return;
|
||||||
|
} else
|
||||||
|
context.SetCurrentStackFrameIndex(frameNumber);
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012, Rene Gollent, [email protected].
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef CLI_STACK_FRAME_COMMAND_H
|
||||||
|
#define CLI_STACK_FRAME_COMMAND_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "CliCommand.h"
|
||||||
|
|
||||||
|
|
||||||
|
class CliStackFrameCommand : public CliCommand {
|
||||||
|
public:
|
||||||
|
CliStackFrameCommand();
|
||||||
|
virtual void Execute(int argc, const char* const* argv,
|
||||||
|
CliContext& context);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // CLI_STACK_FRAME_COMMAND_H
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012, Rene Gollent, [email protected].
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "CliVariablesCommand.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <AutoLocker.h>
|
||||||
|
|
||||||
|
#include "CliContext.h"
|
||||||
|
#include "Team.h"
|
||||||
|
#include "ValueNode.h"
|
||||||
|
#include "ValueNodeContainer.h"
|
||||||
|
#include "ValueNodeManager.h"
|
||||||
|
|
||||||
|
|
||||||
|
CliVariablesCommand::CliVariablesCommand()
|
||||||
|
:
|
||||||
|
CliCommand("show current frame variables",
|
||||||
|
"%s\n"
|
||||||
|
"Prints the parameters and variables of the current frame, if "
|
||||||
|
" available.")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
CliVariablesCommand::Execute(int argc, const char* const* argv,
|
||||||
|
CliContext& context)
|
||||||
|
{
|
||||||
|
if (argc > 1) {
|
||||||
|
PrintUsage(argv[0]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueNodeManager* manager = context.GetValueNodeManager();
|
||||||
|
|
||||||
|
ValueNodeContainer* container = manager->GetContainer();
|
||||||
|
AutoLocker<ValueNodeContainer> containerLocker(container);
|
||||||
|
if (container == NULL || container->CountChildren() == 0) {
|
||||||
|
printf("No variables available.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Variables:\n");
|
||||||
|
for (int32 i = 0; ValueNodeChild* child = container->ChildAt(i); i++) {
|
||||||
|
printf(" %s\n", child->Name().String());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,10 +19,12 @@
|
|||||||
#include "CliContinueCommand.h"
|
#include "CliContinueCommand.h"
|
||||||
#include "CliDebugReportCommand.h"
|
#include "CliDebugReportCommand.h"
|
||||||
#include "CliQuitCommand.h"
|
#include "CliQuitCommand.h"
|
||||||
|
#include "CliStackFrameCommand.h"
|
||||||
#include "CliStackTraceCommand.h"
|
#include "CliStackTraceCommand.h"
|
||||||
#include "CliStopCommand.h"
|
#include "CliStopCommand.h"
|
||||||
#include "CliThreadCommand.h"
|
#include "CliThreadCommand.h"
|
||||||
#include "CliThreadsCommand.h"
|
#include "CliThreadsCommand.h"
|
||||||
|
#include "CliVariablesCommand.h"
|
||||||
|
|
||||||
|
|
||||||
static const char* kDebuggerPrompt = "debugger> ";
|
static const char* kDebuggerPrompt = "debugger> ";
|
||||||
@@ -309,6 +311,7 @@ CommandLineUserInterface::_RegisterCommands()
|
|||||||
|
|
||||||
if (_RegisterCommand("bt", stackTraceCommandReference.Detach())
|
if (_RegisterCommand("bt", stackTraceCommandReference.Detach())
|
||||||
&& _RegisterCommand("continue", new(std::nothrow) CliContinueCommand)
|
&& _RegisterCommand("continue", new(std::nothrow) CliContinueCommand)
|
||||||
|
&& _RegisterCommand("frame", new(std::nothrow) CliStackFrameCommand)
|
||||||
&& _RegisterCommand("help", new(std::nothrow) HelpCommand(this))
|
&& _RegisterCommand("help", new(std::nothrow) HelpCommand(this))
|
||||||
&& _RegisterCommand("quit", new(std::nothrow) CliQuitCommand)
|
&& _RegisterCommand("quit", new(std::nothrow) CliQuitCommand)
|
||||||
&& _RegisterCommand("save-report",
|
&& _RegisterCommand("save-report",
|
||||||
@@ -316,7 +319,9 @@ CommandLineUserInterface::_RegisterCommands()
|
|||||||
&& _RegisterCommand("sc", stackTraceCommandReference2.Detach())
|
&& _RegisterCommand("sc", stackTraceCommandReference2.Detach())
|
||||||
&& _RegisterCommand("stop", new(std::nothrow) CliStopCommand)
|
&& _RegisterCommand("stop", new(std::nothrow) CliStopCommand)
|
||||||
&& _RegisterCommand("thread", new(std::nothrow) CliThreadCommand)
|
&& _RegisterCommand("thread", new(std::nothrow) CliThreadCommand)
|
||||||
&& _RegisterCommand("threads", new(std::nothrow) CliThreadsCommand)) {
|
&& _RegisterCommand("threads", new(std::nothrow) CliThreadsCommand)
|
||||||
|
&& _RegisterCommand("variables",
|
||||||
|
new(std::nothrow) CliVariablesCommand)) {
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user