From d41707c8687e8a3b364998a5b654f23afa5d8e77 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Wed, 3 May 2000 20:16:05 +0000 Subject: [PATCH] * infrun.c (handle_inferior_event): When doing a "next", and stepping out of a signal handler into its calling trampoline ignore the value of step_frame_address. (step_over_function): Only modify step_resume_breakpoint->frame if the value of step_frame_address is non-zero. --- gdb/ChangeLog | 8 ++++++++ gdb/infrun.c | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0e5995623f4..5f2469f667e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2000-05-01 Mark Kettenis + + * infrun.c (handle_inferior_event): When doing a "next", and + stepping out of a signal handler into its calling trampoline + ignore the value of step_frame_address. + (step_over_function): Only modify step_resume_breakpoint->frame if + the value of step_frame_address is non-zero. + 2000-05-03 Michael Snyder * monitor.c (monitor_fetch_register): MAX_REGISTER_RAW_SIZE diff --git a/gdb/infrun.c b/gdb/infrun.c index 8bf3012a667..fb24203cb11 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -2745,6 +2745,20 @@ handle_inferior_event (struct execution_control_state *ecs) if (step_over_calls > 0 || IGNORE_HELPER_CALL (stop_pc)) { /* We're doing a "next". */ + + if (IN_SIGTRAMP (stop_pc, ecs->stop_func_name) + && INNER_THAN (step_frame_address, read_sp())) + /* We stepped out of a signal handler, and into its + calling trampoline. This is misdetected as a + subroutine call, but stepping over the signal + trampoline isn't such a bad idea. In order to do + that, we have to ignore the value in + step_frame_address, since that doesn't represent the + frame that'll reach when we return from the signal + trampoline. Otherwise we'll probably continue to the + end of the program. */ + step_frame_address = 0; + step_over_function (ecs); keep_going (ecs); return; @@ -3045,7 +3059,7 @@ step_over_function (struct execution_control_state *ecs) step_resume_breakpoint = set_momentary_breakpoint (sr_sal, get_current_frame (), bp_step_resume); - if (!IN_SOLIB_DYNSYM_RESOLVE_CODE (sr_sal.pc)) + if (step_frame_address && !IN_SOLIB_DYNSYM_RESOLVE_CODE (sr_sal.pc)) step_resume_breakpoint->frame = step_frame_address; if (breakpoints_inserted) -- 2.30.2