2006-11-22 Vladimir Prus <vladimir@codesourcery.com>
* breakpoint.c: Include "memattr.h". (automatic_hardware_breakpoints): New. (show_automatic_hardware_breakpoints): New. (insert_bp_location): Automatically use hardware breakpoints. (_initialize_breakpoint): Register the "auto-hw" variable. * Makefile.in (breakpoint.o): Update dependencies.
This commit is contained in:
parent
221ca4668b
commit
765dc01564
5 changed files with 130 additions and 1 deletions
|
@ -1,3 +1,14 @@
|
||||||
|
2006-11-22 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
|
* breakpoint.c: Include "memattr.h".
|
||||||
|
(automatic_hardware_breakpoints): New.
|
||||||
|
(show_automatic_hardware_breakpoints): New.
|
||||||
|
(insert_bp_location): Automatically use
|
||||||
|
hardware breakpoints.
|
||||||
|
(_initialize_breakpoint): Register the "auto-hw"
|
||||||
|
variable.
|
||||||
|
* Makefile.in (breakpoint.o): Update dependencies.
|
||||||
|
|
||||||
2006-11-21 Vladimir Prus <vladimir@codesourcery.com>
|
2006-11-21 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
* memattr.h (enum mem_access_mode): New value
|
* memattr.h (enum mem_access_mode): New value
|
||||||
|
|
|
@ -1834,7 +1834,8 @@ breakpoint.o: breakpoint.c $(defs_h) $(symtab_h) $(frame_h) $(breakpoint_h) \
|
||||||
$(gdb_string_h) $(demangle_h) $(annotate_h) $(symfile_h) \
|
$(gdb_string_h) $(demangle_h) $(annotate_h) $(symfile_h) \
|
||||||
$(objfiles_h) $(source_h) $(linespec_h) $(completer_h) $(gdb_h) \
|
$(objfiles_h) $(source_h) $(linespec_h) $(completer_h) $(gdb_h) \
|
||||||
$(ui_out_h) $(cli_script_h) $(gdb_assert_h) $(block_h) $(solib_h) \
|
$(ui_out_h) $(cli_script_h) $(gdb_assert_h) $(block_h) $(solib_h) \
|
||||||
$(solist_h) $(observer_h) $(exceptions_h) $(gdb_events_h) $(mi_common_h)
|
$(solist_h) $(observer_h) $(exceptions_h) $(gdb_events_h) $(mi_common_h) \
|
||||||
|
$(memattr_h)
|
||||||
bsd-kvm.o: bsd-kvm.c $(defs_h) $(cli_cmds_h) $(command_h) $(frame_h) \
|
bsd-kvm.o: bsd-kvm.c $(defs_h) $(cli_cmds_h) $(command_h) $(frame_h) \
|
||||||
$(regcache_h) $(target_h) $(value_h) $(gdbcore_h) $(gdb_assert_h) \
|
$(regcache_h) $(target_h) $(value_h) $(gdbcore_h) $(gdb_assert_h) \
|
||||||
$(readline_h) $(bsd_kvm_h)
|
$(readline_h) $(bsd_kvm_h)
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
#include "solist.h"
|
#include "solist.h"
|
||||||
#include "observer.h"
|
#include "observer.h"
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
|
#include "memattr.h"
|
||||||
|
|
||||||
#include "gdb-events.h"
|
#include "gdb-events.h"
|
||||||
#include "mi/mi-common.h"
|
#include "mi/mi-common.h"
|
||||||
|
@ -231,6 +232,22 @@ Debugger's behavior regarding pending breakpoints is %s.\n"),
|
||||||
value);
|
value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If 1, gdb will automatically use hardware breakpoints for breakpoints
|
||||||
|
set with "break" but falling in read-only memory.
|
||||||
|
If 0, gdb will warn about such breakpoints, but won't automatically
|
||||||
|
use hardware breakpoints. */
|
||||||
|
static int automatic_hardware_breakpoints;
|
||||||
|
static void
|
||||||
|
show_automatic_hardware_breakpoints (struct ui_file *file, int from_tty,
|
||||||
|
struct cmd_list_element *c,
|
||||||
|
const char *value)
|
||||||
|
{
|
||||||
|
fprintf_filtered (file, _("\
|
||||||
|
Automatic usage of hardware breakpoints is %s.\n"),
|
||||||
|
value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void _initialize_breakpoint (void);
|
void _initialize_breakpoint (void);
|
||||||
|
|
||||||
extern int addressprint; /* Print machine addresses? */
|
extern int addressprint; /* Print machine addresses? */
|
||||||
|
@ -794,6 +811,57 @@ insert_bp_location (struct bp_location *bpt,
|
||||||
if (bpt->loc_type == bp_loc_software_breakpoint
|
if (bpt->loc_type == bp_loc_software_breakpoint
|
||||||
|| bpt->loc_type == bp_loc_hardware_breakpoint)
|
|| bpt->loc_type == bp_loc_hardware_breakpoint)
|
||||||
{
|
{
|
||||||
|
if (bpt->owner->type != bp_hardware_breakpoint)
|
||||||
|
{
|
||||||
|
/* If the explicitly specified breakpoint type
|
||||||
|
is not hardware breakpoint, check the memory map to see
|
||||||
|
if the breakpoint address is in read only memory or not.
|
||||||
|
Two important cases are:
|
||||||
|
- location type is not hardware breakpoint, memory
|
||||||
|
is readonly. We change the type of the location to
|
||||||
|
hardware breakpoint.
|
||||||
|
- location type is hardware breakpoint, memory is read-write.
|
||||||
|
This means we've previously made the location hardware one, but
|
||||||
|
then the memory map changed, so we undo.
|
||||||
|
|
||||||
|
When breakpoints are removed, remove_breakpoints will
|
||||||
|
use location types we've just set here, the only possible
|
||||||
|
problem is that memory map has changed during running program,
|
||||||
|
but it's not going to work anyway with current gdb. */
|
||||||
|
struct mem_region *mr
|
||||||
|
= lookup_mem_region (bpt->target_info.placed_address);
|
||||||
|
|
||||||
|
if (mr)
|
||||||
|
{
|
||||||
|
if (automatic_hardware_breakpoints)
|
||||||
|
{
|
||||||
|
int changed = 0;
|
||||||
|
enum bp_loc_type new_type;
|
||||||
|
|
||||||
|
if (mr->attrib.mode != MEM_RW)
|
||||||
|
new_type = bp_loc_hardware_breakpoint;
|
||||||
|
else
|
||||||
|
new_type = bp_loc_software_breakpoint;
|
||||||
|
|
||||||
|
if (new_type != bpt->loc_type)
|
||||||
|
{
|
||||||
|
static int said = 0;
|
||||||
|
bpt->loc_type = new_type;
|
||||||
|
if (!said)
|
||||||
|
{
|
||||||
|
fprintf_filtered (gdb_stdout, _("\
|
||||||
|
Note: automatically using hardware breakpoints for read-only addresses."));
|
||||||
|
said = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (bpt->loc_type == bp_loc_software_breakpoint
|
||||||
|
&& mr->attrib.mode != MEM_RW)
|
||||||
|
warning (_("cannot set software breakpoint at readonly address %s"),
|
||||||
|
paddr (bpt->address));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* First check to see if we have to handle an overlay. */
|
/* First check to see if we have to handle an overlay. */
|
||||||
if (overlay_debugging == ovly_off
|
if (overlay_debugging == ovly_off
|
||||||
|| bpt->section == NULL
|
|| bpt->section == NULL
|
||||||
|
@ -1235,6 +1303,9 @@ reattach_breakpoints (int pid)
|
||||||
if (b->inserted)
|
if (b->inserted)
|
||||||
{
|
{
|
||||||
remove_breakpoint (b, mark_inserted);
|
remove_breakpoint (b, mark_inserted);
|
||||||
|
/* Note: since we insert a breakpoint right after removing,
|
||||||
|
any decisions about automatically using hardware breakpoints
|
||||||
|
made in insert_bp_location are preserved. */
|
||||||
if (b->loc_type == bp_loc_hardware_breakpoint)
|
if (b->loc_type == bp_loc_hardware_breakpoint)
|
||||||
val = target_insert_hw_breakpoint (&b->target_info);
|
val = target_insert_hw_breakpoint (&b->target_info);
|
||||||
else
|
else
|
||||||
|
@ -8127,4 +8198,18 @@ user-query to see if a pending breakpoint should be created."),
|
||||||
&breakpoint_show_cmdlist);
|
&breakpoint_show_cmdlist);
|
||||||
|
|
||||||
pending_break_support = AUTO_BOOLEAN_AUTO;
|
pending_break_support = AUTO_BOOLEAN_AUTO;
|
||||||
|
|
||||||
|
add_setshow_boolean_cmd ("auto-hw", no_class,
|
||||||
|
&automatic_hardware_breakpoints, _("\
|
||||||
|
Set automatic usage of hardware breakpoints."), _("\
|
||||||
|
Show automatic usage of hardware breakpoints."), _("\
|
||||||
|
If set, the debugger will automatically use hardware breakpoints for\n\
|
||||||
|
breakpoints set with \"break\" but falling in read-only memory. If not set,\n\
|
||||||
|
a warning will be emitted for such breakpoints."),
|
||||||
|
NULL,
|
||||||
|
show_automatic_hardware_breakpoints,
|
||||||
|
&breakpoint_set_cmdlist,
|
||||||
|
&breakpoint_show_cmdlist);
|
||||||
|
|
||||||
|
automatic_hardware_breakpoints = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
2006-11-22 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
|
* gdb.texinfo (Setting breakpoints): Document
|
||||||
|
automatic software/hardware breakpoint usage and
|
||||||
|
the "set breakpoint auto-hw" command.
|
||||||
|
|
||||||
2006-11-21 Vladimir Prus <vladimir@codesourcery.com>
|
2006-11-21 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
* gdb.texinfo (Memory Access Checking): New.
|
* gdb.texinfo (Memory Access Checking): New.
|
||||||
|
|
|
@ -3099,6 +3099,32 @@ This is done because any number of shared library loads could have
|
||||||
occurred since the time the breakpoint was disabled and one or more
|
occurred since the time the breakpoint was disabled and one or more
|
||||||
of these loads could resolve the location.
|
of these loads could resolve the location.
|
||||||
|
|
||||||
|
@cindex automatic hardware breakpoints
|
||||||
|
For some targets, @value{GDBN} can automatically decide if hardware or
|
||||||
|
software breakpoints should be used, depending on whether the
|
||||||
|
breakpoint address is read-only or read-write. This applies to
|
||||||
|
breakpoints set with the @code{break} command as well as to internal
|
||||||
|
breakpoints set by commands like @code{next} and @code{finish}. For
|
||||||
|
breakpoints set with @code{hbreak}, @value{GDBN} will always use hardware
|
||||||
|
breakpoints.
|
||||||
|
|
||||||
|
You can control this automatic behaviour with the following commands::
|
||||||
|
|
||||||
|
@kindex set breakpoint auto-hw
|
||||||
|
@kindex show breakpoint auto-hw
|
||||||
|
@table @code
|
||||||
|
@item set breakpoint auto-hw on
|
||||||
|
This is the default behavior. When @value{GDBN} sets a breakpoint, it
|
||||||
|
will try to use the target memory map to decide if software or hardware
|
||||||
|
breakpoint must be used.
|
||||||
|
|
||||||
|
@item set breakpoint auto-hw off
|
||||||
|
This indicates @value{GDBN} should not automatically select breakpoint
|
||||||
|
type. If the target provides a memory map, @value{GDBN} will warn when
|
||||||
|
trying to set software breakpoint at a read-only address.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
|
||||||
@cindex negative breakpoint numbers
|
@cindex negative breakpoint numbers
|
||||||
@cindex internal @value{GDBN} breakpoints
|
@cindex internal @value{GDBN} breakpoints
|
||||||
@value{GDBN} itself sometimes sets breakpoints in your program for
|
@value{GDBN} itself sometimes sets breakpoints in your program for
|
||||||
|
|
Loading…
Add table
Reference in a new issue