Module: wine Branch: stable Commit: e235edcdad5768bd53ddf5b871be0a5e87b52b59 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e235edcdad5768bd53ddf5b871...
Author: Peter Schlaile peter@schlaile.de Date: Sun Dec 5 17:35:55 2010 +0100
winedbg: Adds an rwatch command to winedbg. (cherry picked from commit 95a3cd8e30f72434a8ae3f71a97b5679937fdbf3)
---
programs/winedbg/break.c | 8 ++++---- programs/winedbg/dbg.y | 9 ++++++--- programs/winedbg/debug.l | 1 + programs/winedbg/debugger.h | 4 ++-- programs/winedbg/info.c | 2 +- programs/winedbg/winedbg.man.in | 5 +++++ 6 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/programs/winedbg/break.c b/programs/winedbg/break.c index b1cef6a..75969a5 100644 --- a/programs/winedbg/break.c +++ b/programs/winedbg/break.c @@ -415,14 +415,14 @@ static void break_add_watch(const struct dbg_lvalue* lvalue, BOOL is_write) * * Adds a watch point from an address (stored in a lvalue) */ -void break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue) +void break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue,BOOL is_write) { struct dbg_lvalue lval;
types_extract_as_address(lvalue, &lval.addr); lval.type.id = dbg_itype_none;
- break_add_watch(&lval, TRUE); + break_add_watch(&lval, is_write); }
/*********************************************************************** @@ -430,14 +430,14 @@ void break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue) * * Add a watchpoint from a symbol name */ -void break_add_watch_from_id(const char *name) +void break_add_watch_from_id(const char *name, BOOL is_write) { struct dbg_lvalue lvalue;
switch (symbol_get_lvalue(name, -1, &lvalue, TRUE)) { case sglv_found: - break_add_watch(&lvalue, 1); + break_add_watch(&lvalue, is_write); break; case sglv_unknown: dbg_printf("Unable to add watchpoint\n"); diff --git a/programs/winedbg/dbg.y b/programs/winedbg/dbg.y index 336f993..73188b9 100644 --- a/programs/winedbg/dbg.y +++ b/programs/winedbg/dbg.y @@ -52,7 +52,7 @@ static void parser(const char*); }
%token tCONT tPASS tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tALL tINFO tUP tDOWN -%token tENABLE tDISABLE tBREAK tHBREAK tWATCH tDELETE tSET tPRINT tEXAM +%token tENABLE tDISABLE tBREAK tHBREAK tWATCH tRWATCH tDELETE tSET tPRINT tEXAM %token tABORT tECHO %token tCLASS tMAPS tSTACK tSEGMENTS tSYMBOL tREGS tALLREGS tWND tLOCAL tEXCEPTION %token tPROCESS tTHREAD tEOL tEOF @@ -250,10 +250,13 @@ break_command: ;
watch_command: - tWATCH '*' expr_lvalue { break_add_watch_from_lvalue(&$3); } - | tWATCH identifier { break_add_watch_from_id($2); } + tWATCH '*' expr_lvalue { break_add_watch_from_lvalue(&$3, TRUE); } + | tWATCH identifier { break_add_watch_from_id($2, TRUE); } + | tRWATCH '*' expr_lvalue { break_add_watch_from_lvalue(&$3, FALSE); } + | tRWATCH identifier { break_add_watch_from_id($2, FALSE); } ;
+ display_command: tDISPLAY { display_print(); } | tDISPLAY expr { display_add($2, 1, 0); } diff --git a/programs/winedbg/debug.l b/programs/winedbg/debug.l index 2e87ddb..7ae77b2 100644 --- a/programs/winedbg/debug.l +++ b/programs/winedbg/debug.l @@ -203,6 +203,7 @@ STRING "[^\n"]+" <INITIAL,INFO_CMD,BD_CMD>break|brea|bre|br|b { BEGIN(NOCMD); return tBREAK; } <INITIAL,INFO_CMD,BD_CMD>hbreak|hbrea|hbre|hbr|hb { BEGIN(NOCMD); return tHBREAK; } <INITIAL>watch|watc|wat { BEGIN(NOCMD); return tWATCH; } +<INITIAL>rwatch|rwatc|rwat { BEGIN(NOCMD); return tRWATCH; } <INITIAL>whatis|whati|what { BEGIN(NOCMD); return tWHATIS; } <INITIAL,NOPROCESS>run|ru|r { BEGIN(ASTRING_EXPECTED); return tRUN;} <INITIAL>detach|detac|deta|det { BEGIN(NOCMD); return tDETACH; } diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h index ae949f2..7492274 100644 --- a/programs/winedbg/debugger.h +++ b/programs/winedbg/debugger.h @@ -291,8 +291,8 @@ extern BOOL break_add_break(const ADDRESS64* addr, BOOL verbose, BOO extern BOOL break_add_break_from_lvalue(const struct dbg_lvalue* value, BOOL swbp); extern void break_add_break_from_id(const char* name, int lineno, BOOL swbp); extern void break_add_break_from_lineno(int lineno, BOOL swbp); -extern void break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue); -extern void break_add_watch_from_id(const char* name); +extern void break_add_watch_from_lvalue(const struct dbg_lvalue* lvalue, BOOL is_write); +extern void break_add_watch_from_id(const char* name, BOOL is_write); extern void break_check_delayed_bp(void); extern void break_delete_xpoint(int num); extern void break_delete_xpoints_from_module(DWORD64 base); diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c index a09af5d..c0db6e6 100644 --- a/programs/winedbg/info.c +++ b/programs/winedbg/info.c @@ -48,7 +48,7 @@ void print_help(void) "subset of the commands that gdb accepts.", "The commands currently are:", " help quit", - " break [*<addr>] watch *<addr>", + " break [*<addr>] watch | rwatch *<addr>", " delete break bpnum disable bpnum", " enable bpnum condition <bpnum> [<expr>]", " finish cont [N]", diff --git a/programs/winedbg/winedbg.man.in b/programs/winedbg/winedbg.man.in index fb91d6b..44f9d19 100644 --- a/programs/winedbg/winedbg.man.in +++ b/programs/winedbg/winedbg.man.in @@ -185,6 +185,11 @@ Adds a watch command (on write) at address \fBN\fR (on 4 bytes). .IP \fBwatch\ <id>\fR Adds a watch command (on write) at the address of symbol \fB<id>\fR. Size depends on size of \fB<id>\fR. +.IP \fBrwatch\ *\ N\fR +Adds a watch command (on read) at address \fBN\fR (on 4 bytes). +.IP \fBrwatch\ <id>\fR +Adds a watch command (on read) at the address of symbol +\fB<id>\fR. Size depends on size of \fB<id>\fR. .IP \fBinfo\ break\fR Lists all (break|watch)-points (with their state). .PP