This is the mail archive of the
gdb@sourceware.cygnus.com
mailing list for the GDB project.
Re: Problems with hardware watchpoint on ia32.
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);