gdb/
* 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:
parent
58dadb1bdf
commit
c7437ca6e4
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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"
|
Loading…
Reference in New Issue