--- gdbthread.h | 3 +++ infrun.c | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) --- a/gdbthread.h +++ b/gdbthread.h @@ -88,6 +88,9 @@ struct thread_info any inlined frames). */ struct frame_id step_stack_frame_id; + /* The prev frame id of step_stack_frame_id. */ + struct frame_id step_stack_prev_frame_id; + int current_line; struct symtab *current_symtab; --- a/infrun.c +++ b/infrun.c @@ -2153,10 +2153,17 @@ void set_step_info (struct frame_info *frame, struct symtab_and_line sal) { struct thread_info *tp = inferior_thread (); + struct frame_info *prev_frame; tp->step_frame_id = get_frame_id (frame); tp->step_stack_frame_id = get_stack_frame_id (frame); + prev_frame = get_prev_frame (frame); + if (prev_frame) + tp->step_stack_prev_frame_id = get_stack_frame_id (prev_frame); + else + tp->step_stack_prev_frame_id = null_frame_id; + tp->current_symtab = sal.symtab; tp->current_line = sal.line; } @@ -3778,7 +3785,9 @@ infrun: not switching back to stepped th ecs->event_thread->step_stack_frame_id) && (frame_id_eq (frame_unwind_caller_id (frame), ecs->event_thread->step_stack_frame_id) - || execution_direction == EXEC_REVERSE)) + || (execution_direction == EXEC_REVERSE + && !frame_id_eq (get_stack_frame_id (frame), + ecs->event_thread->step_stack_prev_frame_id)))) { CORE_ADDR real_stop_pc; @@ -5388,6 +5397,7 @@ struct inferior_status CORE_ADDR step_range_end; struct frame_id step_frame_id; struct frame_id step_stack_frame_id; + struct frame_id step_stack_prev_frame_id; enum step_over_calls_kind step_over_calls; CORE_ADDR step_resume_break_address; int stop_after_trap; @@ -5418,6 +5428,7 @@ save_inferior_status (void) inf_status->step_range_end = tp->step_range_end; inf_status->step_frame_id = tp->step_frame_id; inf_status->step_stack_frame_id = tp->step_stack_frame_id; + inf_status->step_stack_prev_frame_id = tp->step_stack_prev_frame_id; inf_status->step_over_calls = tp->step_over_calls; inf_status->stop_after_trap = stop_after_trap; inf_status->stop_soon = inf->stop_soon; @@ -5472,6 +5483,7 @@ restore_inferior_status (struct inferior tp->step_range_end = inf_status->step_range_end; tp->step_frame_id = inf_status->step_frame_id; tp->step_stack_frame_id = inf_status->step_stack_frame_id; + tp->step_stack_prev_frame_id = inf_status->step_stack_prev_frame_id; tp->step_over_calls = inf_status->step_over_calls; stop_after_trap = inf_status->stop_after_trap; inf->stop_soon = inf_status->stop_soon;