2008-06-08 Jan Kratochvil * breakpoint.c (watch_command_1): New variable VAL_RESULT. Fill in VAL_RESULT by the existing FETCH_WATCHPOINT_VALUE call. Ask user for constant list VAL_RESULT. 2008-06-08 Jan Kratochvil * gdb.texinfo (Set Watchpoints): Document constant value watchpoints. 2008-06-08 Jan Kratochvil * gdb.base/watchpoint.exp: New test for constant value watchpoints. --- gdb/breakpoint.c 6 Jun 2008 20:58:08 -0000 1.324 +++ gdb/breakpoint.c 8 Jun 2008 15:18:38 -0000 @@ -5818,7 +5818,7 @@ watch_command_1 (char *arg, int accessfl struct symtab_and_line sal; struct expression *exp; struct block *exp_valid_block; - struct value *val, *mark; + struct value *val, *mark, *val_result; struct frame_info *frame; struct frame_info *prev_frame = NULL; char *exp_start = NULL; @@ -5903,10 +5903,23 @@ watch_command_1 (char *arg, int accessfl exp_end = arg; exp_valid_block = innermost_block; mark = value_mark (); - fetch_watchpoint_value (exp, &val, NULL, NULL); + fetch_watchpoint_value (exp, &val, &val_result, NULL); if (val != NULL) release_value (val); + if (from_tty) + { + struct value *v; + + /* VAL may be unset for unreachable final values. */ + for (v = val_result; v; v = value_next (v)) + if (VALUE_LVAL (v) == lval_memory || VALUE_LVAL (v) == lval_register) + break; + if (v == NULL && !query + (_("Do you insist on this watchpoint with a constant value? "))) + error (_("Watchpoint with a constant value was cancelled.")); + } + tok = arg; while (*tok == ' ' || *tok == '\t') tok++; --- gdb/doc/gdb.texinfo 6 Jun 2008 20:58:08 -0000 1.503 +++ gdb/doc/gdb.texinfo 8 Jun 2008 15:19:53 -0000 @@ -3375,6 +3426,18 @@ This command prints a list of watchpoint it is the same as @code{info break} (@pxref{Set Breaks}). @end table +If you watch for a change in a numerically entered address you need to +dereference it as the address itself is just a constant number which will never +change: + +@smallexample +(@value{GDBP}) watch 0x600850 +Do you insist on this watchpoint with a constant value? (y or n) n +Watchpoint with a constant value was cancelled. +(@value{GDBP}) watch *(int *) 0x600850 +Watchpoint 1: *(int *) 6293584 +@end smallexample + @value{GDBN} sets a @dfn{hardware watchpoint} if possible. Hardware watchpoints execute very quickly, and the debugger reports a change in value at the exact instruction where the change occurs. If @value{GDBN} --- gdb/testsuite/gdb.base/watchpoint.exp 15 Apr 2008 14:33:54 -0000 1.18 +++ gdb/testsuite/gdb.base/watchpoint.exp 8 Jun 2008 15:19:55 -0000 @@ -679,6 +679,18 @@ set prev_timeout $timeout set timeout 600 verbose "Timeout now 600 sec.\n" +# Test constant-value watchpoints. +gdb_test "watch 123" "Watchpoint with a constant value was cancelled." \ + "constant watchpoint" \ + "Do you insist on this watchpoint with a constant value\\? \\(y or n\\) " \ + "n" +# For unsupported constant-value watchpoints catching we need to reset the +# breakpoints counter. +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + if [initialize] then { test_simple_watchpoint