* Removed the DEBUG_DEBUGGER_COMMANDS define again, and followed Ingo's
suggestion by adding a "faults" command that now sets the gInvokeCommandDirectly variable as wished. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28382 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -313,6 +313,23 @@ cmd_wc(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
cmd_faults(int argc, char** argv)
|
||||||
|
{
|
||||||
|
if (argc > 2) {
|
||||||
|
print_debugger_command_usage(argv[0]);
|
||||||
|
return B_KDEBUG_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
gInvokeCommandDirectly = parse_expression(argv[1]) == 0;
|
||||||
|
|
||||||
|
kprintf("Fault handling is %s%s.\n", argc == 2 ? "now " : "",
|
||||||
|
gInvokeCommandDirectly ? "off" : "on");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
@@ -347,6 +364,10 @@ debug_builtin_commands_init()
|
|||||||
"Prints a human-readable description for the given numeric error\n"
|
"Prints a human-readable description for the given numeric error\n"
|
||||||
"code.\n"
|
"code.\n"
|
||||||
" <error> - The numeric error code.\n", 0);
|
" <error> - The numeric error code.\n", 0);
|
||||||
|
add_debugger_command_etc("faults", &cmd_faults, "Toggles fault handling "
|
||||||
|
"for debugger commands",
|
||||||
|
"[0|1]\n"
|
||||||
|
"Toggles fault handling on (1) or off (0).\n", 0);
|
||||||
add_debugger_command_etc("head", &cmd_head,
|
add_debugger_command_etc("head", &cmd_head,
|
||||||
"Prints only the first lines of output from another command",
|
"Prints only the first lines of output from another command",
|
||||||
"<maxLines>\n"
|
"<maxLines>\n"
|
||||||
|
|||||||
@@ -24,23 +24,22 @@
|
|||||||
#include "debug_variables.h"
|
#include "debug_variables.h"
|
||||||
|
|
||||||
|
|
||||||
#define DEBUG_DEBUGGER_COMMANDS 0
|
|
||||||
// Turns off the "FAULT" message to get a stack crawl
|
|
||||||
// of the failing debugger command.
|
|
||||||
|
|
||||||
#define INVOKE_COMMAND_FAULT 1
|
#define INVOKE_COMMAND_FAULT 1
|
||||||
#define INVOKE_COMMAND_ERROR 2
|
#define INVOKE_COMMAND_ERROR 2
|
||||||
|
|
||||||
|
|
||||||
static const int32 kMaxInvokeCommandDepth = 5;
|
static const int32 kMaxInvokeCommandDepth = 5;
|
||||||
static const int32 kOutputBufferSize = 1024;
|
static const int32 kOutputBufferSize = 1024;
|
||||||
|
|
||||||
|
|
||||||
|
bool gInvokeCommandDirectly = false;
|
||||||
|
|
||||||
static spinlock sSpinlock = B_SPINLOCK_INITIALIZER;
|
static spinlock sSpinlock = B_SPINLOCK_INITIALIZER;
|
||||||
|
|
||||||
static struct debugger_command *sCommands;
|
static struct debugger_command *sCommands;
|
||||||
|
|
||||||
static jmp_buf sInvokeCommandEnv[kMaxInvokeCommandDepth];
|
static jmp_buf sInvokeCommandEnv[kMaxInvokeCommandDepth];
|
||||||
static int32 sInvokeCommandLevel = 0;
|
static int32 sInvokeCommandLevel = 0;
|
||||||
static bool sInvokeCommandDirectly = false;
|
|
||||||
static bool sInCommand = false;
|
static bool sInCommand = false;
|
||||||
static char sOutputBuffers[MAX_DEBUGGER_COMMAND_PIPE_LENGTH][kOutputBufferSize];
|
static char sOutputBuffers[MAX_DEBUGGER_COMMAND_PIPE_LENGTH][kOutputBufferSize];
|
||||||
static debugger_command_pipe* sCurrentPipe;
|
static debugger_command_pipe* sCurrentPipe;
|
||||||
@@ -276,7 +275,7 @@ invoke_debugger_command(struct debugger_command *command, int argc, char** argv)
|
|||||||
|
|
||||||
// Invoking the command directly might be useful when debugging debugger
|
// Invoking the command directly might be useful when debugging debugger
|
||||||
// commands.
|
// commands.
|
||||||
if (sInvokeCommandDirectly)
|
if (gInvokeCommandDirectly)
|
||||||
return command->func(argc, argv);
|
return command->func(argc, argv);
|
||||||
|
|
||||||
sInCommand = true;
|
sInCommand = true;
|
||||||
@@ -284,13 +283,11 @@ invoke_debugger_command(struct debugger_command *command, int argc, char** argv)
|
|||||||
switch (setjmp(sInvokeCommandEnv[sInvokeCommandLevel++])) {
|
switch (setjmp(sInvokeCommandEnv[sInvokeCommandLevel++])) {
|
||||||
case 0:
|
case 0:
|
||||||
int result;
|
int result;
|
||||||
#if DEBUG_DEBUGGER_COMMANDS
|
|
||||||
thread->fault_handler = (addr_t)&&error;
|
thread->fault_handler = (addr_t)&&error;
|
||||||
// Fake goto to trick the compiler not to optimize the code at the
|
// Fake goto to trick the compiler not to optimize the code at the
|
||||||
// label away.
|
// label away.
|
||||||
if (!thread)
|
if (!thread)
|
||||||
goto error;
|
goto error;
|
||||||
#endif
|
|
||||||
|
|
||||||
result = command->func(argc, argv);
|
result = command->func(argc, argv);
|
||||||
|
|
||||||
@@ -299,12 +296,11 @@ invoke_debugger_command(struct debugger_command *command, int argc, char** argv)
|
|||||||
sInCommand = false;
|
sInCommand = false;
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
#if DEBUG_DEBUGGER_COMMANDS
|
|
||||||
error:
|
error:
|
||||||
// jump to INVOKE_COMMAND_FAULT case, cleaning up the stack
|
// jump to INVOKE_COMMAND_FAULT case, cleaning up the stack
|
||||||
longjmp(sInvokeCommandEnv[--sInvokeCommandLevel],
|
longjmp(sInvokeCommandEnv[--sInvokeCommandLevel],
|
||||||
INVOKE_COMMAND_FAULT);
|
INVOKE_COMMAND_FAULT);
|
||||||
#endif
|
|
||||||
case INVOKE_COMMAND_FAULT:
|
case INVOKE_COMMAND_FAULT:
|
||||||
{
|
{
|
||||||
debug_page_fault_info* info = debug_get_page_fault_info();
|
debug_page_fault_info* info = debug_get_page_fault_info();
|
||||||
@@ -337,7 +333,7 @@ invoke_debugger_command(struct debugger_command *command, int argc, char** argv)
|
|||||||
void
|
void
|
||||||
abort_debugger_command()
|
abort_debugger_command()
|
||||||
{
|
{
|
||||||
if (!sInvokeCommandDirectly && sInvokeCommandLevel > 0) {
|
if (!gInvokeCommandDirectly && sInvokeCommandLevel > 0) {
|
||||||
longjmp(sInvokeCommandEnv[--sInvokeCommandLevel],
|
longjmp(sInvokeCommandEnv[--sInvokeCommandLevel],
|
||||||
INVOKE_COMMAND_ERROR);
|
INVOKE_COMMAND_ERROR);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ typedef struct debugger_command_pipe {
|
|||||||
bool broken;
|
bool broken;
|
||||||
} debugger_command_pipe;
|
} debugger_command_pipe;
|
||||||
|
|
||||||
|
extern bool gInvokeCommandDirectly;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
Reference in New Issue
Block a user