From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26567 invoked by alias); 8 Jun 2008 15:53:26 -0000 Received: (qmail 26559 invoked by uid 22791); 8 Jun 2008 15:53:25 -0000 X-Spam-Check-By: sourceware.org Received: from host0.dyn.jankratochvil.net (HELO host0.dyn.jankratochvil.net) (89.250.240.59) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 08 Jun 2008 15:53:06 +0000 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.2/8.14.2) with ESMTP id m58Fr3QB028119 for ; Sun, 8 Jun 2008 17:53:03 +0200 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.2/8.14.2/Submit) id m58Fr293028104 for gdb-patches@sourceware.org; Sun, 8 Jun 2008 17:53:02 +0200 Date: Sun, 08 Jun 2008 15:53:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patch] Warn on constant value watchpoints Message-ID: <20080608155302.GA25486@host0.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="tKW2IUtsqtDRztdT" Content-Disposition: inline User-Agent: Mutt/1.5.17 (2007-11-01) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-06/txt/msg00138.txt.bz2 --tKW2IUtsqtDRztdT Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 201 Hi, idea came from a discussion with the Firefox maintainer Martin Stransky who had disfunctional watchpoint on the address of a variable: (gdb) watch 0x4343548 Watchpoint 1: 70530376 Regards, Jan --tKW2IUtsqtDRztdT Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="gdb-constant-watchpoint.patch" Content-length: 3291 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 --tKW2IUtsqtDRztdT--