2011-05-24 Pedro Alves <pedro@codesourcery.com>

gdb/
	* 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.

	gdb/testsuite/
	* gdb.base/commands.exp (watchpoint_command_test): Check that the
	watchpoint's command list didn't execute when the watchpoint went
	out of scope.
This commit is contained in:
Pedro Alves
2011-05-24 15:03:30 +00:00
parent 91d4fe3f85
commit cdac0397bf
4 changed files with 31 additions and 22 deletions

View File

@ -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> 2011-05-24 Tom Tromey <tromey@redhat.com>
* MAINTAINERS: Move Jim Blandy to past maintainers. * MAINTAINERS: Move Jim Blandy to past maintainers.

View File

@ -3866,6 +3866,8 @@ watchpoint_check (void *p)
" deleted because the program has left the block in\n\ " deleted because the program has left the block in\n\
which its expression is valid.\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); watchpoint_del_at_next_stop (b);
return WP_DELETED; return WP_DELETED;
@ -11585,25 +11587,8 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *,
ALL_BREAKPOINTS_SAFE (b, tmp) ALL_BREAKPOINTS_SAFE (b, tmp)
if (b->number == num) if (b->number == num)
{ {
struct breakpoint *related_breakpoint;
match = 1; match = 1;
related_breakpoint = b; function (b, data);
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);
break; break;
} }
if (match == 0) if (match == 0)

View File

@ -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> 2011-05-24 Pierre Muller <muller@ics.u-strasbg.fr>
Centralize -DSYMBOL_PREFIX=\"_\" additional flags in gdb.exp. Centralize -DSYMBOL_PREFIX=\"_\" additional flags in gdb.exp.
@ -30,7 +36,6 @@
Cope with async mode. Cope with async mode.
gdb/testsuite/
* gdb.mi/mi-break.exp (test_breakpoint_commands): Split gdb_test * gdb.mi/mi-break.exp (test_breakpoint_commands): Split gdb_test
into gdb_test + mi_expect_stop. into gdb_test + mi_expect_stop.

View File

@ -294,6 +294,9 @@ proc watchpoint_command_test {} {
pass "begin commands on watch" 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" { gdb_test_multiple "print value" "add print command to watch" {
-re ">$" { -re ">$" {
pass "add print command to watch" pass "add print command to watch"
@ -308,9 +311,18 @@ proc watchpoint_command_test {} {
"" \ "" \
"end commands on watch" "end commands on watch"
gdb_test "continue" \ set test "continue with watch"
"Continuing.*\[Ww\]atchpoint $wp_id deleted because the program has left the block in.*which its expression is valid.*run.c:(57|82).*" \ gdb_test_multiple "continue" "$test" {
"continue with watch" -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 {} { proc test_command_prompt_position {} {