* breakpoint.c (do_restore_lang_radix_cleanup): Remove.
(resolve_pending_breakpoint): Remove. (re_enable_breakpoints_in_shlibs): Remove. (unlink_locations_from_global_list): New. (update_breakpoint_locations): New. (breakpoint_re_set_one): Don't bail out on pending breakpoints. Use parse_condition and update_breakpoint_location to reset breakpoint. Ignore 'symbol not found' error from decode_line_1. (breakpoint_re_set): Don't emit newline before the reason why breakpoint is not reset. (do_enable_breakpoint): Don't specially process pending breakpoints. (free_bp_location): New. (break_command_1): For pending breakpoints, initialize all fields of a sal with zeroes. * breakpoint.h (re_enable_breakpoints_in_shlibs): Remove. * infcmd.c (post_create_inferior): Don't call re_enable_breakpoints_in_shlibs. * infrun.c (handle_inferior_event): Likewise. * solib-irix.c (irix_solib_create_inferior_hook): Likewise. * solib-osf.c (osf_solib_create_inferior_hook): Likewise. * win32-nat.c (get_win32_debug_event): Likewise.
This commit is contained in:
parent
018d34a46b
commit
fe3f5fa8f9
11 changed files with 242 additions and 284 deletions
|
@ -1,3 +1,29 @@
|
||||||
|
2007-09-22 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
|
* breakpoint.c (do_restore_lang_radix_cleanup): Remove.
|
||||||
|
(resolve_pending_breakpoint): Remove.
|
||||||
|
(re_enable_breakpoints_in_shlibs): Remove.
|
||||||
|
(unlink_locations_from_global_list): New.
|
||||||
|
(update_breakpoint_locations): New.
|
||||||
|
(breakpoint_re_set_one): Don't bail out on pending breakpoints.
|
||||||
|
Use parse_condition and update_breakpoint_location to
|
||||||
|
reset breakpoint. Ignore 'symbol not found' error from
|
||||||
|
decode_line_1.
|
||||||
|
(breakpoint_re_set): Don't emit newline before the
|
||||||
|
reason why breakpoint is not reset.
|
||||||
|
(do_enable_breakpoint): Don't specially process pending
|
||||||
|
breakpoints.
|
||||||
|
(free_bp_location): New.
|
||||||
|
(break_command_1): For pending breakpoints, initialize
|
||||||
|
all fields of a sal with zeroes.
|
||||||
|
* breakpoint.h (re_enable_breakpoints_in_shlibs): Remove.
|
||||||
|
* infcmd.c (post_create_inferior): Don't call
|
||||||
|
re_enable_breakpoints_in_shlibs.
|
||||||
|
* infrun.c (handle_inferior_event): Likewise.
|
||||||
|
* solib-irix.c (irix_solib_create_inferior_hook): Likewise.
|
||||||
|
* solib-osf.c (osf_solib_create_inferior_hook): Likewise.
|
||||||
|
* win32-nat.c (get_win32_debug_event): Likewise.
|
||||||
|
|
||||||
2007-09-22 Vladimir Prus <vladimir@codesourcery.com>
|
2007-09-22 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
* breakpoint.c (create_breakpoint): Split from
|
* breakpoint.c (create_breakpoint): Split from
|
||||||
|
|
348
gdb/breakpoint.c
348
gdb/breakpoint.c
|
@ -203,6 +203,8 @@ static void ep_skip_leading_whitespace (char **s);
|
||||||
|
|
||||||
static int single_step_breakpoint_inserted_here_p (CORE_ADDR pc);
|
static int single_step_breakpoint_inserted_here_p (CORE_ADDR pc);
|
||||||
|
|
||||||
|
static void free_bp_location (struct bp_location *loc);
|
||||||
|
|
||||||
/* Prototypes for exported functions. */
|
/* Prototypes for exported functions. */
|
||||||
|
|
||||||
/* If FALSE, gdb will not use hardware support for watchpoints, even
|
/* If FALSE, gdb will not use hardware support for watchpoints, even
|
||||||
|
@ -4140,6 +4142,13 @@ allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type)
|
||||||
return loc;
|
return loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void free_bp_location (struct bp_location *loc)
|
||||||
|
{
|
||||||
|
if (loc->cond)
|
||||||
|
xfree (loc->cond);
|
||||||
|
xfree (loc);
|
||||||
|
}
|
||||||
|
|
||||||
/* set_raw_breakpoint() is a low level routine for allocating and
|
/* set_raw_breakpoint() is a low level routine for allocating and
|
||||||
partially initializing a breakpoint of type BPTYPE. The newly
|
partially initializing a breakpoint of type BPTYPE. The newly
|
||||||
created breakpoint's address, section, source file name, and line
|
created breakpoint's address, section, source file name, and line
|
||||||
|
@ -4396,51 +4405,6 @@ struct lang_and_radix
|
||||||
int radix;
|
int radix;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Cleanup helper routine to restore the current language and
|
|
||||||
input radix. */
|
|
||||||
static void
|
|
||||||
do_restore_lang_radix_cleanup (void *old)
|
|
||||||
{
|
|
||||||
struct lang_and_radix *p = old;
|
|
||||||
set_language (p->lang);
|
|
||||||
input_radix = p->radix;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try and resolve a pending breakpoint. */
|
|
||||||
static int
|
|
||||||
resolve_pending_breakpoint (struct breakpoint *b)
|
|
||||||
{
|
|
||||||
/* Try and reparse the breakpoint in case the shared library
|
|
||||||
is now loaded. */
|
|
||||||
struct symtabs_and_lines sals;
|
|
||||||
struct symtab_and_line pending_sal;
|
|
||||||
char **cond_string = (char **) NULL;
|
|
||||||
char *copy_arg = b->addr_string;
|
|
||||||
char **addr_string;
|
|
||||||
char *errmsg;
|
|
||||||
int rc;
|
|
||||||
int not_found = 0;
|
|
||||||
struct ui_file *old_gdb_stderr;
|
|
||||||
struct lang_and_radix old_lr;
|
|
||||||
struct cleanup *old_chain;
|
|
||||||
|
|
||||||
/* Set language, input-radix, then reissue breakpoint command.
|
|
||||||
Ensure the language and input-radix are restored afterwards. */
|
|
||||||
old_lr.lang = current_language->la_language;
|
|
||||||
old_lr.radix = input_radix;
|
|
||||||
old_chain = make_cleanup (do_restore_lang_radix_cleanup, &old_lr);
|
|
||||||
|
|
||||||
set_language (b->language);
|
|
||||||
input_radix = b->input_radix;
|
|
||||||
rc = break_command_1 (b->addr_string, b->flag, b->from_tty, b);
|
|
||||||
|
|
||||||
if (rc == GDB_RC_OK)
|
|
||||||
/* Pending breakpoint has been resolved. */
|
|
||||||
printf_filtered (_("Pending breakpoint \"%s\" resolved\n"), b->addr_string);
|
|
||||||
|
|
||||||
do_cleanups (old_chain);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
remove_solib_event_breakpoints (void)
|
remove_solib_event_breakpoints (void)
|
||||||
|
@ -4523,37 +4487,6 @@ disable_breakpoints_in_unloaded_shlib (struct so_list *solib)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to reenable any breakpoints in shared libraries. */
|
|
||||||
void
|
|
||||||
re_enable_breakpoints_in_shlibs (void)
|
|
||||||
{
|
|
||||||
struct breakpoint *b, *tmp;
|
|
||||||
|
|
||||||
ALL_BREAKPOINTS_SAFE (b, tmp)
|
|
||||||
{
|
|
||||||
if (b->enable_state == bp_shlib_disabled)
|
|
||||||
{
|
|
||||||
gdb_byte buf[1];
|
|
||||||
char *lib;
|
|
||||||
|
|
||||||
/* Do not reenable the breakpoint if the shared library is
|
|
||||||
still not mapped in. */
|
|
||||||
#ifdef PC_SOLIB
|
|
||||||
lib = PC_SOLIB (b->loc->address);
|
|
||||||
#else
|
|
||||||
lib = solib_address (b->loc->address);
|
|
||||||
#endif
|
|
||||||
if (lib != NULL && target_read_memory (b->loc->address, buf, 1) == 0)
|
|
||||||
b->enable_state = bp_enabled;
|
|
||||||
}
|
|
||||||
else if (b->pending && (b->enable_state == bp_enabled))
|
|
||||||
{
|
|
||||||
if (resolve_pending_breakpoint (b) == GDB_RC_OK)
|
|
||||||
delete_breakpoint (b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
solib_load_unload_1 (char *hookname, int tempflag, char *dll_pathname,
|
solib_load_unload_1 (char *hookname, int tempflag, char *dll_pathname,
|
||||||
char *cond_string, enum bptype bp_kind)
|
char *cond_string, enum bptype bp_kind)
|
||||||
|
@ -5422,12 +5355,9 @@ break_command_1 (char *arg, int flag, int from_tty, struct breakpoint *pending_b
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct symtab_and_line sal;
|
struct symtab_and_line sal = {0};
|
||||||
struct breakpoint *b;
|
struct breakpoint *b;
|
||||||
|
|
||||||
sal.symtab = NULL;
|
|
||||||
sal.pc = 0;
|
|
||||||
|
|
||||||
make_cleanup (xfree, copy_arg);
|
make_cleanup (xfree, copy_arg);
|
||||||
|
|
||||||
b = set_raw_breakpoint (sal, hardwareflag ? bp_hardware_breakpoint
|
b = set_raw_breakpoint (sal, hardwareflag ? bp_hardware_breakpoint
|
||||||
|
@ -7153,6 +7083,97 @@ delete_command (char *arg, int from_tty)
|
||||||
map_breakpoint_numbers (arg, delete_breakpoint);
|
map_breakpoint_numbers (arg, delete_breakpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
unlink_locations_from_global_list (struct breakpoint *bpt)
|
||||||
|
/* Remove locations of this breakpoint from the list of
|
||||||
|
all breakpoint locations. */
|
||||||
|
{
|
||||||
|
struct bp_location **tmp = &bp_location_chain;
|
||||||
|
struct bp_location *here = bpt->loc;
|
||||||
|
|
||||||
|
if (here == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (; *tmp && *tmp != here; tmp = &((*tmp)->next));
|
||||||
|
gdb_assert (*tmp);
|
||||||
|
|
||||||
|
*tmp = here->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_breakpoint_location (struct breakpoint *b,
|
||||||
|
struct symtabs_and_lines sals)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *s;
|
||||||
|
/* FIXME: memleak. */
|
||||||
|
struct bp_location *existing = b->loc;
|
||||||
|
struct bp_location *loc;
|
||||||
|
struct symtab_and_line sal;
|
||||||
|
|
||||||
|
if (b->enable_state == bp_shlib_disabled && sals.nelts == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
unlink_locations_from_global_list (b);
|
||||||
|
b->loc = NULL;
|
||||||
|
|
||||||
|
gdb_assert (sals.nelts == 0 || sals.nelts == 1);
|
||||||
|
if (sals.nelts == 0)
|
||||||
|
return;
|
||||||
|
sal = sals.sals[0];
|
||||||
|
|
||||||
|
loc = allocate_bp_location (b, b->type);
|
||||||
|
loc->requested_address = sal.pc;
|
||||||
|
loc->address = adjust_breakpoint_address (loc->requested_address,
|
||||||
|
b->type);
|
||||||
|
loc->section = sal.section;
|
||||||
|
b->loc = loc;
|
||||||
|
|
||||||
|
/* Reparse conditions, they might contain references to the
|
||||||
|
old symtab. */
|
||||||
|
if (b->cond_string != NULL)
|
||||||
|
{
|
||||||
|
struct gdb_exception e;
|
||||||
|
|
||||||
|
s = b->cond_string;
|
||||||
|
TRY_CATCH (e, RETURN_MASK_ERROR)
|
||||||
|
{
|
||||||
|
loc->cond = parse_exp_1 (&s, block_for_pc (sal.pc),
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
if (e.reason < 0)
|
||||||
|
{
|
||||||
|
warning (_("failed to reevaluate condition for breakpoint %d: %s"),
|
||||||
|
b->number, e.message);
|
||||||
|
b->enable_state = bp_disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b->source_file != NULL)
|
||||||
|
xfree (b->source_file);
|
||||||
|
if (sal.symtab == NULL)
|
||||||
|
b->source_file = NULL;
|
||||||
|
else
|
||||||
|
b->source_file =
|
||||||
|
savestring (sal.symtab->filename,
|
||||||
|
strlen (sal.symtab->filename));
|
||||||
|
|
||||||
|
if (b->line_number == 0)
|
||||||
|
b->line_number = sal.line;
|
||||||
|
|
||||||
|
if (b->enable_state == bp_shlib_disabled)
|
||||||
|
b->enable_state = bp_enabled;
|
||||||
|
|
||||||
|
b->pending = 0;
|
||||||
|
|
||||||
|
check_duplicates (b);
|
||||||
|
|
||||||
|
if (existing)
|
||||||
|
free_bp_location (existing);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Reset a breakpoint given it's struct breakpoint * BINT.
|
/* Reset a breakpoint given it's struct breakpoint * BINT.
|
||||||
The value we return ends up being the return value from catch_errors.
|
The value we return ends up being the return value from catch_errors.
|
||||||
Unused in this case. */
|
Unused in this case. */
|
||||||
|
@ -7164,11 +7185,13 @@ breakpoint_re_set_one (void *bint)
|
||||||
struct breakpoint *b = (struct breakpoint *) bint;
|
struct breakpoint *b = (struct breakpoint *) bint;
|
||||||
struct value *mark;
|
struct value *mark;
|
||||||
int i;
|
int i;
|
||||||
int not_found;
|
int not_found = 0;
|
||||||
int *not_found_ptr = NULL;
|
int *not_found_ptr = ¬_found;
|
||||||
struct symtabs_and_lines sals;
|
struct symtabs_and_lines sals = {};
|
||||||
char *s;
|
char *s;
|
||||||
enum enable_state save_enable;
|
enum enable_state save_enable;
|
||||||
|
struct gdb_exception e;
|
||||||
|
|
||||||
|
|
||||||
switch (b->type)
|
switch (b->type)
|
||||||
{
|
{
|
||||||
|
@ -7186,115 +7209,59 @@ breakpoint_re_set_one (void *bint)
|
||||||
delete_breakpoint (b);
|
delete_breakpoint (b);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* HACK: cagney/2001-11-11: kettenis/2001-11-11: MarkK wrote:
|
|
||||||
|
|
||||||
``And a hack it is, although Apple's Darwin version of GDB
|
|
||||||
contains an almost identical hack to implement a "future
|
|
||||||
break" command. It seems to work in many real world cases,
|
|
||||||
but it is easy to come up with a test case where the patch
|
|
||||||
doesn't help at all.''
|
|
||||||
|
|
||||||
``It seems that the way GDB implements breakpoints - in -
|
|
||||||
shared - libraries was designed for a.out shared library
|
|
||||||
systems (SunOS 4) where shared libraries were loaded at a
|
|
||||||
fixed address in memory. Since ELF shared libraries can (and
|
|
||||||
will) be loaded at any address in memory, things break.
|
|
||||||
Fixing this is not trivial. Therefore, I'm not sure whether
|
|
||||||
we should add this hack to the branch only. I cannot
|
|
||||||
guarantee that things will be fixed on the trunk in the near
|
|
||||||
future.''
|
|
||||||
|
|
||||||
In case we have a problem, disable this breakpoint. We'll
|
|
||||||
restore its status if we succeed. Don't disable a
|
|
||||||
shlib_disabled breakpoint though. There's a fair chance we
|
|
||||||
can't re-set it if the shared library it's in hasn't been
|
|
||||||
loaded yet. */
|
|
||||||
|
|
||||||
if (b->pending)
|
|
||||||
break;
|
|
||||||
|
|
||||||
save_enable = b->enable_state;
|
|
||||||
if (b->enable_state != bp_shlib_disabled)
|
|
||||||
b->enable_state = bp_disabled;
|
|
||||||
else
|
|
||||||
/* If resetting a shlib-disabled breakpoint, we don't want to
|
|
||||||
see an error message if it is not found since we will expect
|
|
||||||
this to occur until the shared library is finally reloaded.
|
|
||||||
We accomplish this by giving decode_line_1 a pointer to use
|
|
||||||
for silent notification that the symbol is not found. */
|
|
||||||
not_found_ptr = ¬_found;
|
|
||||||
|
|
||||||
set_language (b->language);
|
set_language (b->language);
|
||||||
input_radix = b->input_radix;
|
input_radix = b->input_radix;
|
||||||
s = b->addr_string;
|
s = b->addr_string;
|
||||||
|
TRY_CATCH (e, RETURN_MASK_ERROR)
|
||||||
|
{
|
||||||
sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, (char ***) NULL,
|
sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, (char ***) NULL,
|
||||||
not_found_ptr);
|
not_found_ptr);
|
||||||
for (i = 0; i < sals.nelts; i++)
|
|
||||||
{
|
|
||||||
resolve_sal_pc (&sals.sals[i]);
|
|
||||||
|
|
||||||
/* Reparse conditions, they might contain references to the
|
|
||||||
old symtab. */
|
|
||||||
if (b->cond_string != NULL)
|
|
||||||
{
|
|
||||||
s = b->cond_string;
|
|
||||||
if (b->loc->cond)
|
|
||||||
{
|
|
||||||
xfree (b->loc->cond);
|
|
||||||
/* Avoid re-freeing b->exp if an error during the call
|
|
||||||
to parse_exp_1. */
|
|
||||||
b->loc->cond = NULL;
|
|
||||||
}
|
}
|
||||||
b->loc->cond = parse_exp_1 (&s, block_for_pc (sals.sals[i].pc), 0);
|
if (e.reason < 0)
|
||||||
|
{
|
||||||
|
int not_found_and_ok = 0;
|
||||||
|
/* For pending breakpoints, it's expected that parsing
|
||||||
|
will fail until the right shared library is loaded.
|
||||||
|
User has already told to create pending breakpoints and
|
||||||
|
don't need extra messages. If breakpoint is in bp_shlib_disabled
|
||||||
|
state, then user already saw the message about that breakpoint
|
||||||
|
being disabled, and don't want to see more errors. */
|
||||||
|
if (not_found && (b->pending || b->enable_state == bp_shlib_disabled
|
||||||
|
|| b->enable_state == bp_disabled))
|
||||||
|
not_found_and_ok = 1;
|
||||||
|
|
||||||
|
if (!not_found_and_ok)
|
||||||
|
{
|
||||||
|
/* We surely don't want to warn about the same breakpoint
|
||||||
|
10 times. One solution, implemented here, is disable
|
||||||
|
the breakpoint on error. Another solution would be to
|
||||||
|
have separate 'warning emitted' flag. Since this
|
||||||
|
happens only when a binary has changed, I don't know
|
||||||
|
which approach is better. */
|
||||||
|
b->enable_state = bp_disabled;
|
||||||
|
throw_exception (e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We need to re-set the breakpoint if the address changes... */
|
if (not_found)
|
||||||
if (b->loc->address != sals.sals[i].pc
|
break;
|
||||||
/* ...or new and old breakpoints both have source files, and
|
|
||||||
the source file name or the line number changes... */
|
gdb_assert (sals.nelts == 1);
|
||||||
|| (b->source_file != NULL
|
resolve_sal_pc (&sals.sals[0]);
|
||||||
&& sals.sals[i].symtab != NULL
|
if (b->pending && s && s[0])
|
||||||
&& (strcmp (b->source_file, sals.sals[i].symtab->filename) != 0
|
|
||||||
|| b->line_number != sals.sals[i].line)
|
|
||||||
)
|
|
||||||
/* ...or we switch between having a source file and not having
|
|
||||||
one. */
|
|
||||||
|| ((b->source_file == NULL) != (sals.sals[i].symtab == NULL))
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
if (b->source_file != NULL)
|
char *cond_string = 0;
|
||||||
xfree (b->source_file);
|
int thread = -1;
|
||||||
if (sals.sals[i].symtab == NULL)
|
find_condition_and_thread (s, sals.sals[0].pc,
|
||||||
b->source_file = NULL;
|
&cond_string, &thread);
|
||||||
else
|
if (cond_string)
|
||||||
b->source_file =
|
b->cond_string = cond_string;
|
||||||
savestring (sals.sals[i].symtab->filename,
|
b->thread = thread;
|
||||||
strlen (sals.sals[i].symtab->filename));
|
|
||||||
b->line_number = sals.sals[i].line;
|
|
||||||
b->loc->requested_address = sals.sals[i].pc;
|
|
||||||
b->loc->address
|
|
||||||
= adjust_breakpoint_address (b->loc->requested_address,
|
|
||||||
b->type);
|
|
||||||
|
|
||||||
/* Used to check for duplicates here, but that can
|
|
||||||
cause trouble, as it doesn't check for disabled
|
|
||||||
breakpoints. */
|
|
||||||
|
|
||||||
mention (b);
|
|
||||||
|
|
||||||
/* Might be better to do this just once per breakpoint_re_set,
|
|
||||||
rather than once for every breakpoint. */
|
|
||||||
breakpoints_changed ();
|
|
||||||
}
|
}
|
||||||
b->loc->section = sals.sals[i].section;
|
|
||||||
b->enable_state = save_enable; /* Restore it, this worked. */
|
|
||||||
|
|
||||||
|
update_breakpoint_location (b, sals);
|
||||||
|
|
||||||
/* Now that this is re-enabled, check_duplicates
|
|
||||||
can be used. */
|
|
||||||
check_duplicates (b);
|
|
||||||
|
|
||||||
}
|
|
||||||
xfree (sals.sals);
|
xfree (sals.sals);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -7408,7 +7375,7 @@ breakpoint_re_set (void)
|
||||||
ALL_BREAKPOINTS_SAFE (b, temp)
|
ALL_BREAKPOINTS_SAFE (b, temp)
|
||||||
{
|
{
|
||||||
/* Format possible error msg */
|
/* Format possible error msg */
|
||||||
char *message = xstrprintf ("Error in re-setting breakpoint %d:\n",
|
char *message = xstrprintf ("Error in re-setting breakpoint %d: ",
|
||||||
b->number);
|
b->number);
|
||||||
struct cleanup *cleanups = make_cleanup (xfree, message);
|
struct cleanup *cleanups = make_cleanup (xfree, message);
|
||||||
catch_errors (breakpoint_re_set_one, b, message, RETURN_MASK_ALL);
|
catch_errors (breakpoint_re_set_one, b, message, RETURN_MASK_ALL);
|
||||||
|
@ -7635,25 +7602,6 @@ do_enable_breakpoint (struct breakpoint *bpt, enum bpdisp disposition)
|
||||||
error (_("Hardware breakpoints used exceeds limit."));
|
error (_("Hardware breakpoints used exceeds limit."));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bpt->pending)
|
|
||||||
{
|
|
||||||
if (bpt->enable_state != bp_enabled)
|
|
||||||
{
|
|
||||||
/* When enabling a pending breakpoint, we need to check if the breakpoint
|
|
||||||
is resolvable since shared libraries could have been loaded
|
|
||||||
after the breakpoint was disabled. */
|
|
||||||
breakpoints_changed ();
|
|
||||||
if (resolve_pending_breakpoint (bpt) == GDB_RC_OK)
|
|
||||||
{
|
|
||||||
delete_breakpoint (bpt);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bpt->enable_state = bp_enabled;
|
|
||||||
bpt->disposition = disposition;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else /* Not a pending breakpoint. */
|
|
||||||
{
|
|
||||||
if (bpt->enable_state != bp_permanent)
|
if (bpt->enable_state != bp_permanent)
|
||||||
bpt->enable_state = bp_enabled;
|
bpt->enable_state = bp_enabled;
|
||||||
bpt->disposition = disposition;
|
bpt->disposition = disposition;
|
||||||
|
@ -7717,13 +7665,13 @@ have been allocated for other watchpoints.\n"), bpt->number);
|
||||||
select_frame (frame_find_by_id (saved_frame_id));
|
select_frame (frame_find_by_id (saved_frame_id));
|
||||||
value_free_to_mark (mark);
|
value_free_to_mark (mark);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (deprecated_modify_breakpoint_hook)
|
if (deprecated_modify_breakpoint_hook)
|
||||||
deprecated_modify_breakpoint_hook (bpt);
|
deprecated_modify_breakpoint_hook (bpt);
|
||||||
breakpoint_modify_event (bpt->number);
|
breakpoint_modify_event (bpt->number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
enable_breakpoint (struct breakpoint *bpt)
|
enable_breakpoint (struct breakpoint *bpt)
|
||||||
{
|
{
|
||||||
|
|
|
@ -799,8 +799,6 @@ extern void remove_thread_event_breakpoints (void);
|
||||||
|
|
||||||
extern void disable_breakpoints_in_shlibs (void);
|
extern void disable_breakpoints_in_shlibs (void);
|
||||||
|
|
||||||
extern void re_enable_breakpoints_in_shlibs (void);
|
|
||||||
|
|
||||||
extern void create_solib_load_event_breakpoint (char *, int, char *, char *);
|
extern void create_solib_load_event_breakpoint (char *, int, char *, char *);
|
||||||
|
|
||||||
extern void create_solib_unload_event_breakpoint (char *, int,
|
extern void create_solib_unload_event_breakpoint (char *, int,
|
||||||
|
|
|
@ -433,10 +433,6 @@ post_create_inferior (struct target_ops *target, int from_tty)
|
||||||
#else
|
#else
|
||||||
solib_create_inferior_hook ();
|
solib_create_inferior_hook ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Enable any breakpoints which were disabled when the
|
|
||||||
underlying shared library was deleted. */
|
|
||||||
re_enable_breakpoints_in_shlibs ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
observer_notify_inferior_created (target, from_tty);
|
observer_notify_inferior_created (target, from_tty);
|
||||||
|
|
|
@ -1337,10 +1337,6 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
#endif
|
#endif
|
||||||
target_terminal_inferior ();
|
target_terminal_inferior ();
|
||||||
|
|
||||||
/* Try to reenable shared library breakpoints, additional
|
|
||||||
code segments in shared libraries might be mapped in now. */
|
|
||||||
re_enable_breakpoints_in_shlibs ();
|
|
||||||
|
|
||||||
/* If requested, stop when the dynamic linker notifies
|
/* If requested, stop when the dynamic linker notifies
|
||||||
gdb of events. This allows the user to get control
|
gdb of events. This allows the user to get control
|
||||||
and place breakpoints in initializer routines for
|
and place breakpoints in initializer routines for
|
||||||
|
@ -2276,10 +2272,6 @@ process_event_stop_test:
|
||||||
#endif
|
#endif
|
||||||
target_terminal_inferior ();
|
target_terminal_inferior ();
|
||||||
|
|
||||||
/* Try to reenable shared library breakpoints, additional
|
|
||||||
code segments in shared libraries might be mapped in now. */
|
|
||||||
re_enable_breakpoints_in_shlibs ();
|
|
||||||
|
|
||||||
/* If requested, stop when the dynamic linker notifies
|
/* If requested, stop when the dynamic linker notifies
|
||||||
gdb of events. This allows the user to get control
|
gdb of events. This allows the user to get control
|
||||||
and place breakpoints in initializer routines for
|
and place breakpoints in initializer routines for
|
||||||
|
|
|
@ -457,7 +457,6 @@ irix_solib_create_inferior_hook (void)
|
||||||
suppresses the warning. */
|
suppresses the warning. */
|
||||||
solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add);
|
solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add);
|
||||||
stop_soon = NO_STOP_QUIETLY;
|
stop_soon = NO_STOP_QUIETLY;
|
||||||
re_enable_breakpoints_in_shlibs ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* LOCAL FUNCTION
|
/* LOCAL FUNCTION
|
||||||
|
|
|
@ -336,9 +336,6 @@ osf_solib_create_inferior_hook (void)
|
||||||
suppresses the warning. */
|
suppresses the warning. */
|
||||||
solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add);
|
solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add);
|
||||||
stop_soon = NO_STOP_QUIETLY;
|
stop_soon = NO_STOP_QUIETLY;
|
||||||
|
|
||||||
/* Enable breakpoints disabled (unnecessarily) by clear_solib(). */
|
|
||||||
re_enable_breakpoints_in_shlibs ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* target_so_ops callback. Do additional symbol handling, lookup, etc. after
|
/* target_so_ops callback. Do additional symbol handling, lookup, etc. after
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
2007-09-22 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
|
* gdb.base/pending.exp: No longer expect "Pending breakpoint resolved"
|
||||||
|
messages.
|
||||||
|
* gdb.base/chng-syms.exp: Likewise.
|
||||||
|
* gdb.base/unload.exp: Likewise.
|
||||||
|
|
||||||
2007-09-21 Daniel Jacobowitz <dan@codesourcery.com>
|
2007-09-21 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
* gdb.base/sepdebug.exp (test_different_dir): Append to pf_prefix.
|
* gdb.base/sepdebug.exp (test_different_dir): Append to pf_prefix.
|
||||||
|
|
|
@ -105,10 +105,10 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb
|
||||||
|
|
||||||
gdb_run_cmd
|
gdb_run_cmd
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "Error in re-setting .*No symbol .var1..*Program exited normally.*$gdb_prompt $" {
|
-re ".*No symbol .var1..*Program exited normally.*$gdb_prompt $" {
|
||||||
pass "running with invalidated bpt condition after executable changes"
|
pass "running with invalidated bpt condition after executable changes"
|
||||||
}
|
}
|
||||||
-re "Error in re-setting .*No symbol .var1..*Breakpoint .*,( 0x.* in)? (\[^ \]*)exit .*$gdb_prompt $" {
|
-re "No symbol .var1..*Breakpoint .*,( 0x.* in)? (\[^ \]*)exit .*$gdb_prompt $" {
|
||||||
pass "running with invalidated bpt condition after executable changes"
|
pass "running with invalidated bpt condition after executable changes"
|
||||||
}
|
}
|
||||||
-re "$gdb_prompt $" {
|
-re "$gdb_prompt $" {
|
||||||
|
|
|
@ -194,9 +194,7 @@ gdb_test "info break" \
|
||||||
|
|
||||||
gdb_run_cmd
|
gdb_run_cmd
|
||||||
gdb_test "" \
|
gdb_test "" \
|
||||||
"Breakpoint.*at.*
|
".*Breakpoint.*, main.*$mainline.*" \
|
||||||
Pending breakpoint \"pendshr.c:$bp2_loc if x > 3\" resolved.*
|
|
||||||
Breakpoint.*, main.*$mainline.*" \
|
|
||||||
"running to main"
|
"running to main"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -204,8 +202,7 @@ Breakpoint.*, main.*$mainline.*" \
|
||||||
#
|
#
|
||||||
|
|
||||||
gdb_test "enable 1" \
|
gdb_test "enable 1" \
|
||||||
"Breakpoint.*at.*
|
"" \
|
||||||
Pending breakpoint \"pendfunc1.* resolved.*" \
|
|
||||||
"re-enabling pending breakpoint that can resolve instantly"
|
"re-enabling pending breakpoint that can resolve instantly"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -89,9 +89,7 @@ set unloadshr_line [gdb_get_line_number "unloadshr break" ${libsrcfile}]
|
||||||
|
|
||||||
gdb_run_cmd
|
gdb_run_cmd
|
||||||
gdb_test "" \
|
gdb_test "" \
|
||||||
"Breakpoint.*at.*
|
".*Breakpoint.*, shrfunc1 \\\(x=3\\\).*unloadshr.c:$unloadshr_line.*" \
|
||||||
Pending breakpoint \"shrfunc1\" resolved.*
|
|
||||||
Breakpoint.*, shrfunc1 \\\(x=3\\\).*unloadshr.c:$unloadshr_line.*" \
|
|
||||||
"running program"
|
"running program"
|
||||||
|
|
||||||
gdb_test "continue" \
|
gdb_test "continue" \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue