This is the mail archive of the
gdb-patches@sourceware.cygnus.com
mailing list for the GDB project.
Re: Problems with hardware watchpoint on ia32.
- To: hjl at lucon dot org
- Subject: Re: Problems with hardware watchpoint on ia32.
- From: Eli Zaretskii <eliz at delorie dot com>
- Date: Thu, 9 Mar 2000 07:11:23 -0500 (EST)
- CC: gdb at sourceware dot cygnus dot com, gdb-patches at sourceware dot cygnus dot com
- References: <20000307132401.A20282@valinux.com> <200003081008.FAA16481@indy.delorie.com> <20000308084304.A3150@lucon.org>
- Reply-to: Eli Zaretskii <eliz at is dot elta dot co dot il>
Problem no.2: Read watchpoints break when they shouldn't.
Example (slightly modified test program posted by H.J. Lu):
$ cat wp.c
int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
unsigned long long ulla1 = 0;
double da2 = 0;
int main (void)
{
a2 = 12;
a3 = 13;
a4 = 14;
a5 = 15;
a6 = 16;
a1 = 11;
a2 = a4;
ulla1 = 0x00000000ffffffffLL;
da2 = 12;
ulla1 = 0xffffffff00000000LL;
return 0;
}
$ gcc -g -o wp wp.c
$ gdb wp
(gdb) watch a5
Hardware watchpoint 2: a5
(gdb) rwatch a5
Hardware read watchpoint 3: a5
(gdb) run
Starting program g:/gdbsnap/gdb-0222/gdb/wp
Hardware watchpoint 2: a5
Old value = 0
New value = 15
Hardware read watchpoint 3: a5
Value = 15
main () at wp.c: 16
16 a5 = 15;
(gdb)
Now, it might seem like a strange idea to put two watchpoints on the
same variable, but it is a very useful feature when each watchpoint
has a different condition.
Here's the patch:
2000-03-08 Eli Zaretskii <eliz@is.elta.co.il>
* breakpoint.c (bpstat_stop_status): Don't stop if a read
watchpoint appears to break, but the watched value changed.
--- gdb/breakpoint.c~2 Wed Mar 8 19:20:28 2000
+++ gdb/breakpoint.c Wed Mar 8 20:02:20 2000
@@ -2620,6 +2620,17 @@ bpstat_stop_status (pc, not_a_breakpoint
/* Stop. */
break;
case WP_VALUE_CHANGED:
+ if (b->type == bp_read_watchpoint)
+ {
+ /* Don't stop: read watchpoints shouldn't fire if
+ the value has changed. This is for targets which
+ cannot set read-only watchpoints. */
+ bs->print_it = print_it_noop;
+ bs->stop = 0;
+ continue;
+ }
+ ++(b->hit_count);
+ break;
case WP_VALUE_NOT_CHANGED:
/* Stop. */
++(b->hit_count);