[RFA] Solve the watchpoint failures on second run.

Pierre Muller muller@ics.u-strasbg.fr
Thu Jun 20 02:44:00 GMT 2002


This bug is related to bug 515 of database.
(This patch, together with the previous RFA that I sent today,
fixes the problem for both statically and dynamically linked 
programs).

If you use my previous patch and compile the test program
of the 515 bug with --static option,
you will still miss the change of x value on the second run.
This comes from the fact that the val field of the watchpoint is 
not reset correctly when the program is restarted.

  I first tried to fix this problem by using evaluate_expression 
in the breakpoint_init_inferior function. But, while this fixes the problem for
the win32 native debugger, it leads to problems for linux,
beacuse the program is not yet loaded into memory
when this function is called: instead, the bash used for launch the debuggee
seems to be in memory...

So the only way I found to fix that error was to reset val field to NULL
so that the val field is computed again
correctly at the first insert_breakpoint call.



2002-06-19  Pierre Muller  <muller@ics.u-strasbg.fr>

	* breakpoint.c (breakpoint_init_inferior): Reset the val field of
	watchpoints to NULL.
	(insert_breakpoints): set val field of watchpoints if NULL.


Index: breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.77
diff -u -p -r1.77 breakpoint.c
--- breakpoint.c	18 Jun 2002 21:58:55 -0000	1.77
+++ breakpoint.c	19 Jun 2002 15:20:39 -0000
@@ -725,7 +725,18 @@ insert_breakpoints (void)
      if (b->enable_state == bp_permanent)
        /* Permanent breakpoints cannot be inserted or removed.  */
        continue;
-    else if (b->type != bp_watchpoint
+    if ((b->type == bp_watchpoint
+	|| b->type == bp_hardware_watchpoint
+	|| b->type == bp_read_watchpoint
+	|| b->type == bp_access_watchpoint) && (!b->val)) {
+	struct value *val;
+	val = evaluate_expression (b->exp);
+	release_value (val);
+	if (VALUE_LAZY (val))
+	  value_fetch_lazy (val);
+	b->val = val;
+      } 
+    if (b->type != bp_watchpoint
  	&& b->type != bp_hardware_watchpoint
  	&& b->type != bp_read_watchpoint
  	&& b->type != bp_access_watchpoint
@@ -1520,6 +1531,14 @@ breakpoint_init_inferior (enum inf_conte
  	/* Likewise for watchpoints on local expressions.  */
  	if (b->exp_valid_block != NULL)
  	  delete_breakpoint (b);
+	if (context == inf_starting) 
+	  {
+	    /* Reset val field to force reread of starting value
+	       in insert_breakpoints.  */
+	    if (b->val)
+	      value_free (b->val);
+	    b->val = NULL;
+	  }
  	break;
        default:
  	/* Likewise for exception catchpoints in dynamic-linked 


Pierre Muller
Institut Charles Sadron
6,rue Boussingault
F 67083 STRASBOURG CEDEX (France)
mailto:muller@ics.u-strasbg.fr
Phone : (33)-3-88-41-40-07  Fax : (33)-3-88-41-40-99



More information about the Gdb-patches mailing list