aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/breakpoint.c21
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.base/commands.exp18
4 files changed, 31 insertions, 22 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4a2e64b..35012d2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2011-05-24 Pedro Alves <pedro@codesourcery.com>
+
+ * breakpoint.c (watchpoint_check): If the watchpoint went out of
+ scope, clear its command list.
+ (map_breakpoint_numbers): Don't walk the related breakpoints list
+ of each breakpoint.
+
2011-05-24 Tom Tromey <tromey@redhat.com>
* MAINTAINERS: Move Jim Blandy to past maintainers.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index c1e0013..1da1f9c 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -3866,6 +3866,8 @@ watchpoint_check (void *p)
" deleted because the program has left the block in\n\
which its expression is valid.\n");
+ /* Make sure the watchpoint's commands aren't executed. */
+ decref_counted_command_line (&b->commands);
watchpoint_del_at_next_stop (b);
return WP_DELETED;
@@ -11585,25 +11587,8 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *,
ALL_BREAKPOINTS_SAFE (b, tmp)
if (b->number == num)
{
- struct breakpoint *related_breakpoint;
-
match = 1;
- related_breakpoint = b;
- do
- {
- struct breakpoint *next_related_b;
-
- /* FUNCTION can be also delete_breakpoint. */
- next_related_b = related_breakpoint->related_breakpoint;
- function (related_breakpoint, data);
-
- /* For delete_breakpoint of the last entry of the ring we
- were traversing we would never get back to B. */
- if (next_related_b == related_breakpoint)
- break;
- related_breakpoint = next_related_b;
- }
- while (related_breakpoint != b);
+ function (b, data);
break;
}
if (match == 0)
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index fad1f65..0c2a6aa 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2011-05-24 Pedro Alves <pedro@codesourcery.com>
+
+ * gdb.base/commands.exp (watchpoint_command_test): Check that the
+ watchpoint's command list didn't execute when the watchpoint went
+ out of scope.
+
2011-05-24 Pierre Muller <muller@ics.u-strasbg.fr>
Centralize -DSYMBOL_PREFIX=\"_\" additional flags in gdb.exp.
@@ -30,7 +36,6 @@
Cope with async mode.
- gdb/testsuite/
* gdb.mi/mi-break.exp (test_breakpoint_commands): Split gdb_test
into gdb_test + mi_expect_stop.
diff --git a/gdb/testsuite/gdb.base/commands.exp b/gdb/testsuite/gdb.base/commands.exp
index a0ac25b..fb9cf4e 100644
--- a/gdb/testsuite/gdb.base/commands.exp
+++ b/gdb/testsuite/gdb.base/commands.exp
@@ -294,6 +294,9 @@ proc watchpoint_command_test {} {
pass "begin commands on watch"
}
}
+ # See the 'No symbol "value...' fail below. This command will
+ # fail if it's executed in the wrong frame. If adjusting the
+ # test, make sure this property holds.
gdb_test_multiple "print value" "add print command to watch" {
-re ">$" {
pass "add print command to watch"
@@ -308,9 +311,18 @@ proc watchpoint_command_test {} {
"" \
"end commands on watch"
- gdb_test "continue" \
- "Continuing.*\[Ww\]atchpoint $wp_id deleted because the program has left the block in.*which its expression is valid.*run.c:(57|82).*" \
- "continue with watch"
+ set test "continue with watch"
+ gdb_test_multiple "continue" "$test" {
+ -re "No symbol \"value\" in current context.\r\n$gdb_prompt $" {
+ # Happens if GDB actually runs the watchpoints commands,
+ # even though the watchpoint was deleted for not being in
+ # scope.
+ fail $test
+ }
+ -re "Continuing.*\[Ww\]atchpoint $wp_id deleted because the program has left the block in.*which its expression is valid.*run.c:(57|82).*$gdb_prompt $" {
+ pass $test
+ }
+ }
}
proc test_command_prompt_position {} {