Extend displays: now one can add displays active only in specified

function; displays now can be enabled/disabled like in gdb.
This commit is contained in:
Michal Janusz Miroslaw 2003-10-14 20:25:16 +00:00 committed by Alexandre Julliard
parent d004059538
commit f3ed10a246
6 changed files with 192 additions and 130 deletions

View File

@ -52,8 +52,6 @@ int yyerror(const char *);
%token tCONT tPASS tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK tUP tDOWN %token tCONT tPASS tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK tUP tDOWN
%token tENABLE tDISABLE tBREAK tWATCH tDELETE tSET tMODE tPRINT tEXAM tABORT tVM86 %token tENABLE tDISABLE tBREAK tWATCH tDELETE tSET tMODE tPRINT tEXAM tABORT tVM86
%token tCLASS tMAPS tMODULE tSTACK tSEGMENTS tSYMBOL tREGS tWND tLOCAL tEXCEPTION
%token tPROCESS tTHREAD tEOL tEOF
%token tCLASS tMAPS tMODULE tSTACK tSEGMENTS tSYMBOL tREGS tWND tQUEUE tLOCAL tEXCEPTION %token tCLASS tMAPS tMODULE tSTACK tSEGMENTS tSYMBOL tREGS tWND tQUEUE tLOCAL tEXCEPTION
%token tPROCESS tTHREAD tMODREF tEOL tEOF %token tPROCESS tTHREAD tMODREF tEOL tEOF
%token tFRAME tSHARE tCOND tDISPLAY tUNDISPLAY tDISASSEMBLE %token tFRAME tSHARE tCOND tDISPLAY tUNDISPLAY tDISASSEMBLE
@ -124,9 +122,6 @@ command:
| tABORT tEOL { abort(); } | tABORT tEOL { abort(); }
| tMODE tNUM tEOL { mode_command($2); } | tMODE tNUM tEOL { mode_command($2); }
| tMODE tVM86 tEOL { DEBUG_CurrThread->dbg_mode = MODE_VM86; } | tMODE tVM86 tEOL { DEBUG_CurrThread->dbg_mode = MODE_VM86; }
| tENABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, TRUE ); }
| tDISABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, FALSE ); }
| tDELETE tBREAK tNUM tEOL { DEBUG_DelBreakpoint( $3 ); }
| tBACKTRACE tEOL { DEBUG_BackTrace(DEBUG_CurrTid, TRUE); } | tBACKTRACE tEOL { DEBUG_BackTrace(DEBUG_CurrTid, TRUE); }
| tBACKTRACE tNUM tEOL { DEBUG_BackTrace($2, TRUE); } | tBACKTRACE tNUM tEOL { DEBUG_BackTrace($2, TRUE); }
| tUP tEOL { DEBUG_SetFrame( curr_frame + 1 ); } | tUP tEOL { DEBUG_SetFrame( curr_frame + 1 ); }
@ -137,13 +132,6 @@ command:
| tSHOW tDIR tEOL { DEBUG_ShowDir(); } | tSHOW tDIR tEOL { DEBUG_ShowDir(); }
| tDIR pathname tEOL { DEBUG_AddPath( $2 ); } | tDIR pathname tEOL { DEBUG_AddPath( $2 ); }
| tDIR tEOL { DEBUG_NukePath(); } | tDIR tEOL { DEBUG_NukePath(); }
| tDISPLAY tEOL { DEBUG_InfoDisplay(); }
| tDISPLAY expr tEOL { DEBUG_AddDisplay($2, 1, 0); }
| tDISPLAY tFORMAT expr tEOL{ DEBUG_AddDisplay($3, $2 >> 8, $2 & 0xff); }
| tDELETE tDISPLAY tNUM tEOL{ DEBUG_DelDisplay( $3 ); }
| tDELETE tDISPLAY tEOL { DEBUG_DelDisplay( -1 ); }
| tUNDISPLAY tNUM tEOL { DEBUG_DelDisplay( $2 ); }
| tUNDISPLAY tEOL { DEBUG_DelDisplay( -1 ); }
| tCOND tNUM tEOL { DEBUG_AddBPCondition($2, NULL); } | tCOND tNUM tEOL { DEBUG_AddBPCondition($2, NULL); }
| tCOND tNUM expr tEOL { DEBUG_AddBPCondition($2, $3); } | tCOND tNUM expr tEOL { DEBUG_AddBPCondition($2, $3); }
| tSOURCE pathname tEOL { DEBUG_Parser($2); } | tSOURCE pathname tEOL { DEBUG_Parser($2); }
@ -157,7 +145,8 @@ command:
| set_command | set_command
| x_command | x_command
| print_command | print_command
| break_command | break_commands
| display_commands
| watch_command | watch_command
| info_command | info_command
| walk_command | walk_command
@ -165,6 +154,20 @@ command:
| noprocess_state | noprocess_state
; ;
display_commands:
| tDISPLAY tEOL { DEBUG_InfoDisplay(); }
| tDISPLAY expr tEOL { DEBUG_AddDisplay($2, 1, 0, FALSE); }
| tDISPLAY tFORMAT expr tEOL{ DEBUG_AddDisplay($3, $2 >> 8, $2 & 0xff, FALSE); }
| tLOCAL tDISPLAY expr tEOL { DEBUG_AddDisplay($3, 1, 0, TRUE); }
| tLOCAL tDISPLAY tFORMAT expr tEOL { DEBUG_AddDisplay($4, $3 >> 8, $3 & 0xff, TRUE); }
| tENABLE tDISPLAY tNUM tEOL{ DEBUG_EnableDisplay( $3, TRUE ); }
| tDISABLE tDISPLAY tNUM tEOL { DEBUG_EnableDisplay( $3, FALSE ); }
| tDELETE tDISPLAY tNUM tEOL{ DEBUG_DelDisplay( $3 ); }
| tDELETE tDISPLAY tEOL { DEBUG_DelDisplay( -1 ); }
| tUNDISPLAY tNUM tEOL { DEBUG_DelDisplay( $2 ); }
| tUNDISPLAY tEOL { DEBUG_DelDisplay( -1 ); }
;
set_command: set_command:
tSET lval_addr '=' expr_value tEOL { DEBUG_WriteMemory(&$2, $4); } tSET lval_addr '=' expr_value tEOL { DEBUG_WriteMemory(&$2, $4); }
| tSET '+' tIDENTIFIER tEOL { DEBUG_DbgChannel(TRUE, NULL, $3); } | tSET '+' tIDENTIFIER tEOL { DEBUG_DbgChannel(TRUE, NULL, $3); }
@ -210,12 +213,18 @@ print_command:
| tPRINT tFORMAT expr_addr tEOL { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff, 0 ); } | tPRINT tFORMAT expr_addr tEOL { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff, 0 ); }
; ;
break_command: break_commands:
tBREAK '*' expr_addr tEOL{ DEBUG_AddBreakpointFromValue( &$3 ); } tBREAK '*' expr_addr tEOL{ DEBUG_AddBreakpointFromValue( &$3 ); }
| tBREAK identifier tEOL { DEBUG_AddBreakpointFromId($2, -1); } | tBREAK identifier tEOL { DEBUG_AddBreakpointFromId($2, -1); }
| tBREAK identifier ':' tNUM tEOL { DEBUG_AddBreakpointFromId($2, $4); } | tBREAK identifier ':' tNUM tEOL { DEBUG_AddBreakpointFromId($2, $4); }
| tBREAK tNUM tEOL { DEBUG_AddBreakpointFromLineno($2); } | tBREAK tNUM tEOL { DEBUG_AddBreakpointFromLineno($2); }
| tBREAK tEOL { DEBUG_AddBreakpointFromLineno(-1); } | tBREAK tEOL { DEBUG_AddBreakpointFromLineno(-1); }
| tENABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, TRUE ); }
| tENABLE tBREAK tNUM tEOL { DEBUG_EnableBreakpoint( $3, TRUE ); }
| tDISABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, FALSE ); }
| tDISABLE tBREAK tNUM tEOL { DEBUG_EnableBreakpoint( $3, FALSE ); }
| tDELETE tNUM tEOL { DEBUG_DelBreakpoint( $2 ); }
| tDELETE tBREAK tNUM tEOL { DEBUG_DelBreakpoint( $3 ); }
; ;
watch_command: watch_command:

View File

@ -57,7 +57,8 @@ STRING \"[^\n"]+\"
%s PATH_EXPECTED %s PATH_EXPECTED
%s INFO_CMD %s INFO_CMD
%s HELP_CMD %s HELP_CMD
%s DEL_CMD %s BD_CMD
%s LOCAL_CMD
%s WALK_CMD %s WALK_CMD
%s SHOW_CMD %s SHOW_CMD
%s MODE_CMD %s MODE_CMD
@ -105,12 +106,14 @@ STRING \"[^\n"]+\"
<INITIAL>down|dow|do { BEGIN(NOCMD); return tDOWN; } <INITIAL>down|dow|do { BEGIN(NOCMD); return tDOWN; }
<INITIAL>frame|fram|fra|fr { BEGIN(NOCMD); return tFRAME; } <INITIAL>frame|fram|fra|fr { BEGIN(NOCMD); return tFRAME; }
<INITIAL>list|lis|li|l { BEGIN(PATH_EXPECTED); return tLIST; } <INITIAL>list|lis|li|l { BEGIN(PATH_EXPECTED); return tLIST; }
<INITIAL>enable|enabl|enab|ena { BEGIN(NOCMD); return tENABLE;} <INITIAL>enable|enabl|enab|ena { BEGIN(BD_CMD); return tENABLE;}
<INITIAL>disable|disabl|disab|disa|dis { BEGIN(NOCMD); return tDISABLE; } <INITIAL>disable|disabl|disab|disa|dis { BEGIN(BD_CMD); return tDISABLE; }
<INITIAL>disassemble|disassembl|disassemb|disassem|disasse|disass|disas { BEGIN(NOCMD); return tDISASSEMBLE; } <INITIAL>disassemble|disassembl|disassemb|disassem|disasse|disass|disas { BEGIN(NOCMD); return tDISASSEMBLE; }
<INITIAL,INFO_CMD,DEL_CMD>display|displa|displ|disp { BEGIN(FORMAT_EXPECTED); return tDISPLAY; } <INITIAL>locally|local { BEGIN(LOCAL_CMD); return tLOCAL; }
<INITIAL,LOCAL_CMD>display|displa|displ|disp { BEGIN(FORMAT_EXPECTED); return tDISPLAY; }
<INFO_CMD,BD_CMD>display|displa|displ|disp|dis|di|d { BEGIN(NOCMD); return tDISPLAY; }
<INITIAL>undisplay|undispla|undispl|undisp|undis|undi|und { BEGIN(NOCMD); return tUNDISPLAY; } <INITIAL>undisplay|undispla|undispl|undisp|undis|undi|und { BEGIN(NOCMD); return tUNDISPLAY; }
<INITIAL>delete|delet|dele|del { BEGIN(DEL_CMD); return tDELETE; } <INITIAL>delete|delet|dele|del { BEGIN(BD_CMD); return tDELETE; }
<INITIAL,NOPROCESS>quit|qui|qu|q { BEGIN(NOCMD); return tQUIT; } <INITIAL,NOPROCESS>quit|qui|qu|q { BEGIN(NOCMD); return tQUIT; }
<INITIAL>set|se { BEGIN(NOCMD); return tSET; } <INITIAL>set|se { BEGIN(NOCMD); return tSET; }
<INITIAL,NOPROCESS>walk|w { BEGIN(WALK_CMD); return tWALK; } <INITIAL,NOPROCESS>walk|w { BEGIN(WALK_CMD); return tWALK; }
@ -137,7 +140,7 @@ STRING \"[^\n"]+\"
<INITIAL,NOPROCESS>source|sourc|sour|src { BEGIN(PATH_EXPECTED); return tSOURCE; } <INITIAL,NOPROCESS>source|sourc|sour|src { BEGIN(PATH_EXPECTED); return tSOURCE; }
<INITIAL>symbolfile|symbols|symbol|sf { BEGIN(PATH_EXPECTED); return tSYMBOLFILE; } <INITIAL>symbolfile|symbols|symbol|sf { BEGIN(PATH_EXPECTED); return tSYMBOLFILE; }
<INITIAL,INFO_CMD,DEL_CMD>break|brea|bre|br|b { BEGIN(NOCMD); return tBREAK; } <INITIAL,INFO_CMD,BD_CMD>break|brea|bre|br|b { BEGIN(NOCMD); return tBREAK; }
<INITIAL>watch|watc|wat { BEGIN(NOCMD); return tWATCH; } <INITIAL>watch|watc|wat { BEGIN(NOCMD); return tWATCH; }
<INITIAL>whatis|whati|what { BEGIN(NOCMD); return tWHATIS; } <INITIAL>whatis|whati|what { BEGIN(NOCMD); return tWHATIS; }
<INITIAL,NOPROCESS>run|ru|r { BEGIN(ASTRING_EXPECTED); return tRUN;} <INITIAL,NOPROCESS>run|ru|r { BEGIN(ASTRING_EXPECTED); return tRUN;}

View File

@ -331,9 +331,10 @@ extern int DEBUG_ReadLine(const char* pfx, char* buffer, int size);
/* debugger/display.c */ /* debugger/display.c */
extern int DEBUG_DoDisplay(void); extern int DEBUG_DoDisplay(void);
extern int DEBUG_AddDisplay(struct expr * exp, int count, char format); extern int DEBUG_AddDisplay(struct expr * exp, int count, char format, int local_frame);
extern int DEBUG_DelDisplay(int displaynum); extern int DEBUG_DelDisplay(int displaynum);
extern int DEBUG_InfoDisplay(void); extern int DEBUG_InfoDisplay(void);
extern int DEBUG_EnableDisplay(int displaynum, int enable);
/* debugger/expr.c */ /* debugger/expr.c */
extern void DEBUG_FreeExprMem(void); extern void DEBUG_FreeExprMem(void);
@ -389,6 +390,7 @@ extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
struct datatype * type); struct datatype * type);
extern BOOL DEBUG_Normalize(struct name_hash * nh ); extern BOOL DEBUG_Normalize(struct name_hash * nh );
void DEBUG_InfoSymbols(const char* str); void DEBUG_InfoSymbols(const char* str);
const char *DEBUG_GetSymbolName(const struct name_hash *);
/* debugger/info.c */ /* debugger/info.c */
extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format ); extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );

View File

@ -2,6 +2,7 @@
* File display.c - display handling for Wine internal debugger. * File display.c - display handling for Wine internal debugger.
* *
* Copyright (C) 1997, Eric Youngdale. * Copyright (C) 1997, Eric Youngdale.
* Copyright (C) 2003, Michal Miroslaw
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -27,130 +28,171 @@
#include <stdarg.h> #include <stdarg.h>
#define MAX_DISPLAY 25 #define DISPTAB_DELTA 8 /* needs to be power of 2, search for MARK to see why :) */
struct display struct display {
{
struct expr *exp; struct expr *exp;
int count; int count;
char format; char format;
char enabled;
struct name_hash *function_name;
}; };
static struct display displaypoints[MAX_DISPLAY]; static struct display *displaypoints = NULL;
static unsigned int maxdisplays = 0, ndisplays = 0;
int static struct name_hash *DEBUG_GetCurrentFrameFunctionName(void)
DEBUG_AddDisplay(struct expr * exp, int count, char format) {
struct name_hash *name;
unsigned int eip, ebp;
if (DEBUG_GetCurrentFrame(&name, &eip, &ebp))
return name;
return NULL;
}
int DEBUG_AddDisplay(struct expr *exp, int count, char format, int in_frame)
{ {
int i; int i;
/* for (i = 0; i < ndisplays; i++)
* First find a slot where we can store this display.
*/
for(i=0; i < MAX_DISPLAY; i++ )
{
if (displaypoints[i].exp == NULL) if (displaypoints[i].exp == NULL)
{ break;
if (i == maxdisplays) /* no space left - expand */
displaypoints = DBG_realloc(displaypoints,
(maxdisplays += DISPTAB_DELTA) * sizeof(*displaypoints));
if (i == ndisplays)
++ndisplays;
displaypoints[i].exp = DEBUG_CloneExpr(exp); displaypoints[i].exp = DEBUG_CloneExpr(exp);
displaypoints[i].count = count; displaypoints[i].count = count;
displaypoints[i].format = format; displaypoints[i].format = format;
break; displaypoints[i].enabled = TRUE;
} displaypoints[i].function_name =
} (in_frame ? DEBUG_GetCurrentFrameFunctionName() : NULL);
return TRUE; return TRUE;
} }
int int DEBUG_InfoDisplay(void)
DEBUG_InfoDisplay(void)
{ {
int i; int i;
/* for (i = 0; i < ndisplays; i++) {
* First find a slot where we can store this display. if (displaypoints[i].exp == NULL)
*/ continue;
for(i=0; i < MAX_DISPLAY; i++ )
{ if (displaypoints[i].function_name)
if( displaypoints[i].exp != NULL ) DEBUG_Printf(DBG_CHN_MESG, "%d in %s%s : ", i + 1,
{ DEBUG_GetSymbolName(displaypoints[i].function_name),
DEBUG_Printf(DBG_CHN_MESG, "%d : ", i+1); (displaypoints[i].enabled ?
(displaypoints[i].function_name != DEBUG_GetCurrentFrameFunctionName() ?
" (out of scope)" : "")
: " (disabled)")
);
else
DEBUG_Printf(DBG_CHN_MESG, "%d%s : ", i + 1,
(displaypoints[i].enabled ? "" : " (disabled)"));
DEBUG_DisplayExpr(displaypoints[i].exp); DEBUG_DisplayExpr(displaypoints[i].exp);
DEBUG_Printf(DBG_CHN_MESG, "\n"); DEBUG_Printf(DBG_CHN_MESG, "\n");
} }
}
return TRUE; return TRUE;
} }
int void DEBUG_PrintOneDisplay(int i)
DEBUG_DoDisplay(void)
{ {
DBG_VALUE value; DBG_VALUE value;
int i;
/* if (displaypoints[i].enabled) {
* First find a slot where we can store this display.
*/
for(i=0; i < MAX_DISPLAY; i++ )
{
if( displaypoints[i].exp != NULL )
{
value = DEBUG_EvalExpr(displaypoints[i].exp); value = DEBUG_EvalExpr(displaypoints[i].exp);
if( value.type == NULL ) if (value.type == NULL) {
{
DEBUG_Printf(DBG_CHN_MESG, "Unable to evaluate expression "); DEBUG_Printf(DBG_CHN_MESG, "Unable to evaluate expression ");
DEBUG_DisplayExpr(displaypoints[i].exp); DEBUG_DisplayExpr(displaypoints[i].exp);
DEBUG_Printf(DBG_CHN_MESG, "\nDisabling...\n"); DEBUG_Printf(DBG_CHN_MESG, "\nDisabling display %d ...\n", i + 1);
DEBUG_DelDisplay(i); displaypoints[i].enabled = FALSE;
return;
} }
else }
{
DEBUG_Printf(DBG_CHN_MESG, "%d : ", i + 1); DEBUG_Printf(DBG_CHN_MESG, "%d : ", i + 1);
DEBUG_DisplayExpr(displaypoints[i].exp); DEBUG_DisplayExpr(displaypoints[i].exp);
DEBUG_Printf(DBG_CHN_MESG, " = "); DEBUG_Printf(DBG_CHN_MESG, " = ");
if( displaypoints[i].format == 'i' ) if (!displaypoints[i].enabled)
{ DEBUG_Printf(DBG_CHN_MESG, "(disabled)\n");
DEBUG_ExamineMemory( &value,
displaypoints[i].count,
displaypoints[i].format);
}
else else
if (displaypoints[i].format == 'i')
DEBUG_ExamineMemory(&value, displaypoints[i].count, displaypoints[i].format);
else
DEBUG_Print(&value, displaypoints[i].count, displaypoints[i].format, 0);
}
int DEBUG_DoDisplay(void)
{ {
DEBUG_Print( &value, int i;
displaypoints[i].count, struct name_hash *cur_function_name = DEBUG_GetCurrentFrameFunctionName();
displaypoints[i].format, 0);
} for (i = 0; i < ndisplays; i++) {
} if (displaypoints[i].exp == NULL || !displaypoints[i].enabled)
} continue;
if (displaypoints[i].function_name
&& displaypoints[i].function_name != cur_function_name)
continue;
DEBUG_PrintOneDisplay(i);
} }
return TRUE; return TRUE;
} }
int int DEBUG_DelDisplay(int displaynum)
DEBUG_DelDisplay(int displaynum)
{ {
int i; int i;
if( displaynum >= MAX_DISPLAY || displaynum == 0 || displaynum < -1 ) if (displaynum > ndisplays || displaynum == 0 || displaynum < -1
{ || displaypoints[displaynum - 1].exp == NULL) {
DEBUG_Printf(DBG_CHN_MESG, "Invalid display number\n"); DEBUG_Printf(DBG_CHN_MESG, "Invalid display number\n");
return TRUE; return TRUE;
} }
if( displaynum == -1 )
{ if (displaynum == -1) {
for(i=0; i < MAX_DISPLAY; i++ ) for (i = 0; i < ndisplays; i++) {
{ if (displaypoints[i].exp != NULL) {
if( displaypoints[i].exp != NULL )
{
DEBUG_FreeExpr(displaypoints[i].exp); DEBUG_FreeExpr(displaypoints[i].exp);
displaypoints[i].exp = NULL; displaypoints[i].exp = NULL;
} }
} }
displaypoints = DBG_realloc(displaypoints,
(maxdisplays = DISPTAB_DELTA) * sizeof(*displaypoints));
ndisplays = 0;
} else if (displaypoints[--displaynum].exp != NULL) {
DEBUG_FreeExpr(displaypoints[displaynum].exp);
displaypoints[displaynum].exp = NULL;
while (displaynum == ndisplays - 1
&& displaypoints[displaynum].exp == NULL)
--ndisplays, --displaynum;
if (maxdisplays - ndisplays >= 2 * DISPTAB_DELTA) {
maxdisplays = (ndisplays + DISPTAB_DELTA - 1) & ~(DISPTAB_DELTA - 1); /* MARK */
displaypoints = DBG_realloc(displaypoints,
maxdisplays * sizeof(*displaypoints));
} }
else if( displaypoints[displaynum - 1].exp != NULL )
{
DEBUG_FreeExpr(displaypoints[displaynum - 1].exp);
displaypoints[displaynum - 1].exp = NULL;
} }
return TRUE; return TRUE;
} }
int DEBUG_EnableDisplay(int displaynum, int enable)
{
--displaynum;
if (displaynum >= ndisplays || displaynum < 0 || displaypoints[displaynum].exp == NULL) {
DEBUG_Printf(DBG_CHN_MESG, "Invalid display number\n");
return TRUE;
}
displaypoints[displaynum].enabled = enable;
if (!displaypoints[displaynum].function_name
|| displaypoints[displaynum].function_name == DEBUG_GetCurrentFrameFunctionName())
DEBUG_PrintOneDisplay(displaynum);
return TRUE;
}

View File

@ -1305,6 +1305,11 @@ int DEBUG_SetLocalSymbolType(struct wine_locals * sym, struct datatype * type)
return TRUE; return TRUE;
} }
const char *DEBUG_GetSymbolName(const struct name_hash * sym)
{
return sym->name;
}
#ifdef HAVE_REGEX_H #ifdef HAVE_REGEX_H
static int cmp_sym_by_name(const void * p1, const void * p2) static int cmp_sym_by_name(const void * p1, const void * p2)

View File

@ -218,15 +218,16 @@ void DEBUG_Help(void)
" stepi [N] nexti [N]", " stepi [N] nexti [N]",
" x <addr> print <expr>", " x <addr> print <expr>",
" display <expr> undisplay <disnum>", " display <expr> undisplay <disnum>",
" delete display <disnum> pass", " local display <expr> delete display <disnum>",
" enable display <disnum> disable display <disnum>",
" bt frame <n>", " bt frame <n>",
" up down", " up down",
" list <lines> disassemble [<addr>][,<addr>]", " list <lines> disassemble [<addr>][,<addr>]",
" show dir dir <path>", " show dir dir <path>",
" set <reg> = <expr> set *<addr> = <expr>", " set <reg> = <expr> set *<addr> = <expr>",
" mode [16,32,vm86] walk [wnd,class,module,maps,", " mode [16,32,vm86] pass",
" whatis process,thread,exception]", " whatis walk [wnd,class,module,maps,",
" info (see 'help info' for options)", " info (see 'help info' for options) process,thread,exception]",
"The 'x' command accepts repeat counts and formats (including 'i') in the", "The 'x' command accepts repeat counts and formats (including 'i') in the",
"same way that gdb does.\n", "same way that gdb does.\n",
@ -234,8 +235,8 @@ void DEBUG_Help(void)
" The following are examples of legal expressions:", " The following are examples of legal expressions:",
" $eax $eax+0x3 0x1000 ($eip + 256) *$eax *($esp + 3)", " $eax $eax+0x3 0x1000 ($eip + 256) *$eax *($esp + 3)",
" Also, a nm format symbol table can be read from a file using the", " Also, a nm format symbol table can be read from a file using the",
" symbolfile command. Symbols can also be defined individually with", " symbolfile command.", /* Symbols can also be defined individually with",
" the define command.", " the define command.", */
"", "",
NULL NULL
}; };