mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
gdb
PR c++/9593: * thread.c (clear_thread_inferior_resources): Call delete_longjmp_breakpoint. * infrun.c (handle_inferior_event): Handle exception breakpoints. (handle_inferior_event): Likewise. (insert_exception_resume_breakpoint): New function. (check_exception_resume): Likewise. * inferior.h (delete_longjmp_breakpoint_cleanup): Declare. * infcmd.c (delete_longjmp_breakpoint_cleanup): No longer static. (step_1): Set thread's initiating frame. (until_next_continuation): New function. (until_next_command): Support exception breakpoints. (finish_command_continuation): Delete longjmp breakpoint. (finish_forward): Support exception breakpoints. * gdbthread.h (struct thread_info) <initiating_frame>: New field. * breakpoint.h (enum bptype) <bp_exception, bp_exception_resume, bp_exception_master>: New constants. (struct bpstat_what) <is_longjmp>: New field. (set_longjmp_breakpoint): Update. * breakpoint.c (create_exception_master_breakpoint): New function. (update_breakpoints_after_exec): Handle bp_exception_master. Call create_exception_master_breakpoint. (print_it_typical): Handle bp_exception_master, bp_exception. (bpstat_stop_status): Handle bp_exception_master. (bpstat_what): Handle bp_exception_master, bp_exception, bp_exception_resume. (bptype_string): Likewise. (print_one_breakpoint_location): Likewise. (allocate_bp_location): Likewise. (set_longjmp_breakpoint): Handle exception breakpoints. Change interface. (delete_longjmp_breakpoint): Handle exception breakpoints. (mention): Likewise. (struct until_break_command_continuation_args) <thread_num>: New field. (until_break_command_continuation): Call delete_longjmp_breakpoint. (until_break_command): Support exception breakpoints. (delete_command): Likewise. (breakpoint_re_set_one): Likewise. (breakpoint_re_set): Likewise. gdb/testuite * gdb.java/jnpe.java: New file. * gdb.java/jnpe.exp: New file. * gdb.cp/nextoverthrow.exp: New file. * gdb.cp/nextoverthrow.cc: New file.
This commit is contained in:
34
gdb/infcmd.c
34
gdb/infcmd.c
@@ -822,7 +822,7 @@ nexti_command (char *count_string, int from_tty)
|
||||
step_1 (1, 1, count_string);
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
delete_longjmp_breakpoint_cleanup (void *arg)
|
||||
{
|
||||
int thread = * (int *) arg;
|
||||
@@ -862,10 +862,12 @@ step_1 (int skip_subroutines, int single_inst, char *count_string)
|
||||
|
||||
if (!single_inst || skip_subroutines) /* leave si command alone */
|
||||
{
|
||||
struct thread_info *tp = inferior_thread ();
|
||||
|
||||
if (in_thread_list (inferior_ptid))
|
||||
thread = pid_to_thread_id (inferior_ptid);
|
||||
|
||||
set_longjmp_breakpoint (thread);
|
||||
set_longjmp_breakpoint (tp, get_frame_id (get_current_frame ()));
|
||||
|
||||
make_cleanup (delete_longjmp_breakpoint_cleanup, &thread);
|
||||
}
|
||||
@@ -1220,6 +1222,16 @@ signal_command (char *signum_exp, int from_tty)
|
||||
proceed ((CORE_ADDR) -1, oursig, 0);
|
||||
}
|
||||
|
||||
/* A continuation callback for until_next_command. */
|
||||
|
||||
static void
|
||||
until_next_continuation (void *arg)
|
||||
{
|
||||
struct thread_info *tp = arg;
|
||||
|
||||
delete_longjmp_breakpoint (tp->num);
|
||||
}
|
||||
|
||||
/* Proceed until we reach a different source line with pc greater than
|
||||
our current one or exit the function. We skip calls in both cases.
|
||||
|
||||
@@ -1236,6 +1248,8 @@ until_next_command (int from_tty)
|
||||
struct symbol *func;
|
||||
struct symtab_and_line sal;
|
||||
struct thread_info *tp = inferior_thread ();
|
||||
int thread = tp->num;
|
||||
struct cleanup *old_chain;
|
||||
|
||||
clear_proceed_status ();
|
||||
set_step_frame ();
|
||||
@@ -1271,7 +1285,18 @@ until_next_command (int from_tty)
|
||||
|
||||
tp->step_multi = 0; /* Only one call to proceed */
|
||||
|
||||
set_longjmp_breakpoint (tp, get_frame_id (frame));
|
||||
old_chain = make_cleanup (delete_longjmp_breakpoint_cleanup, &thread);
|
||||
|
||||
proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 1);
|
||||
|
||||
if (target_can_async_p () && is_running (inferior_ptid))
|
||||
{
|
||||
discard_cleanups (old_chain);
|
||||
add_continuation (tp, until_next_continuation, tp, NULL);
|
||||
}
|
||||
else
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1464,6 +1489,7 @@ finish_command_continuation (void *arg)
|
||||
if (bs != NULL && tp->control.proceed_to_finish)
|
||||
observer_notify_normal_stop (bs, 1 /* print frame */);
|
||||
delete_breakpoint (a->breakpoint);
|
||||
delete_longjmp_breakpoint (inferior_thread ()->num);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1548,6 +1574,7 @@ finish_forward (struct symbol *function, struct frame_info *frame)
|
||||
struct breakpoint *breakpoint;
|
||||
struct cleanup *old_chain;
|
||||
struct finish_command_continuation_args *cargs;
|
||||
int thread = tp->num;
|
||||
|
||||
sal = find_pc_line (get_frame_pc (frame), 0);
|
||||
sal.pc = get_frame_pc (frame);
|
||||
@@ -1558,6 +1585,9 @@ finish_forward (struct symbol *function, struct frame_info *frame)
|
||||
|
||||
old_chain = make_cleanup_delete_breakpoint (breakpoint);
|
||||
|
||||
set_longjmp_breakpoint (tp, get_frame_id (frame));
|
||||
make_cleanup (delete_longjmp_breakpoint_cleanup, &thread);
|
||||
|
||||
/* We want stop_registers, please... */
|
||||
tp->control.proceed_to_finish = 1;
|
||||
cargs = xmalloc (sizeof (*cargs));
|
||||
|
||||
Reference in New Issue
Block a user