* breakpoint.c (update_watchpoint): Create a sentinel location if
	the software watchpoint isn't watching any memory.
	(breakpoint_address_bits): Skip dummy software watchpoint locations.

	gdb/testsuite/
	* gdb.base/watch-non-mem.c, gdb.base/watch-non-mem.exp: New.
This commit is contained in:
Pedro Alves 2010-03-04 15:37:26 +00:00
parent 58dadb1bdf
commit c7437ca6e4
5 changed files with 98 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2010-03-04 Pedro Alves <pedro@codesourcery.com>
* breakpoint.c (update_watchpoint): Create a sentinel location if
the software watchpoint isn't watching any memory.
(breakpoint_address_bits): Skip dummy software watchpoint locations.
2010-03-04 Pedro Alves <pedro@codesourcery.com>
* utils.c (fputs_maybe_filtered): Check if there's already a top

View File

@ -1237,6 +1237,19 @@ update_watchpoint (struct breakpoint *b, int reparse)
value_free (v);
}
/* If a software watchpoint is not watching any memory, then the
above left it without any location set up. But,
bpstat_stop_status requires a location to be able to report
stops, so make sure there's at least a dummy one. */
if (b->type == bp_watchpoint && b->loc == NULL)
{
b->loc = allocate_bp_location (b);
b->loc->pspace = frame_pspace;
b->loc->address = -1;
b->loc->length = -1;
b->loc->watchpoint_type = -1;
}
/* We just regenerated the list of breakpoint locations.
The new location does not have its condition field set to anything
and therefore, we must always reparse the cond_string, independently
@ -4516,7 +4529,14 @@ breakpoint_address_bits (struct breakpoint *b)
for (loc = b->loc; loc; loc = loc->next)
{
int addr_bit = gdbarch_addr_bit (loc->gdbarch);
int addr_bit;
/* Software watchpoints that aren't watching memory don't have
an address to print. */
if (b->type == bp_watchpoint && loc->watchpoint_type == -1)
continue;
addr_bit = gdbarch_addr_bit (loc->gdbarch);
if (addr_bit > print_address_bits)
print_address_bits = addr_bit;
}

View File

@ -1,3 +1,7 @@
2010-03-04 Pedro Alves <pedro@codesourcery.com>
* gdb.base/watch-non-mem.c, gdb.base/watch-non-mem.exp: New.
2010-03-03 Doug Evans <dje@google.com>
* lib/gdb.exp (gdb_compile_pthreads): Handle case where

View File

@ -0,0 +1,27 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
int global = 0;
int main()
{
global++;
global++;
global++;
return 0;
}

View File

@ -0,0 +1,40 @@
# Copyright 2010 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Tests watchpoints that watch expressions that don't involve memory.
#
set testfile "watch-non-mem"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
untested ${testfile}.exp
return -1
}
if ![runto_main] then {
fail "Can't run to main"
return
}
gdb_test "watch \$pc" \
"Watchpoint .*: .pc" \
"set write watchpoint on \$pc"
gdb_test "continue" \
"Watchpoint 2: .pc.*Old value = .*New value = .*" \
"watchpoint on \$pc works"