mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 01:07:52 +00:00
gdb/
* frame.c (get_frame_id): Default to outer_frame_id if the this_id
method does not supply an ID. Assert that the result is not
null_frame_id.
(outer_frame_id): New.
(frame_id_p): Accept outer_frame_id.
(frame_id_eq): Allow outer_frame_id to be equal to itself.
(frame_find_by_id): Revert previous local workarounds.
(get_prev_frame_1): Adjust end-of-stack check to test outer_frame_id.
* frame.h (null_frame_id, frame_id_p): Update comments.
(outer_frame_id): Declare.
* infrun.c (handle_inferior_event): Do not treat all steps from the
outermost frame as subroutine calls.
* libunwind-frame.c (libunwind_frame_this_id): Do not clear THIS_ID.
* hppa-tdep.c (hppa_stub_frame_this_id): Likewise.
* ia64-tdep.c (ia64_frame_this_id): Likewise.
(ia64_libunwind_frame_this_id, ia64_libunwind_sigtramp_frame_this_id):
Use outer_frame_id instead of null_frame_id.
* amd64obsd-tdep.c (amd64obsd_trapframe_cache): Use outer_frame_id.
* i386obsd-tdep.c (i386obsd_trapframe_cache): Likewise.
* inline-frame.c (inline_frame_this_id): Refuse outer_frame_id.
* thread.c (restore_selected_frame): Update comment and remove
frame_id_p check.
gdb/doc/
* gdbint.texinfo (Unwinding the Frame ID): Reference outer_frame_id.
This commit is contained in:
16
gdb/infrun.c
16
gdb/infrun.c
@@ -3796,10 +3796,22 @@ infrun: not switching back to stepped thread, it has vanished\n");
|
||||
NOTE: frame_id_eq will never report two invalid frame IDs as
|
||||
being equal, so to get into this block, both the current and
|
||||
previous frame must have valid frame IDs. */
|
||||
/* The outer_frame_id check is a heuristic to detect stepping
|
||||
through startup code. If we step over an instruction which
|
||||
sets the stack pointer from an invalid value to a valid value,
|
||||
we may detect that as a subroutine call from the mythical
|
||||
"outermost" function. This could be fixed by marking
|
||||
outermost frames as !stack_p,code_p,special_p. Then the
|
||||
initial outermost frame, before sp was valid, would
|
||||
have code_addr == &_start. See the commend in frame_id_eq
|
||||
for more. */
|
||||
if (!frame_id_eq (get_stack_frame_id (frame),
|
||||
ecs->event_thread->step_stack_frame_id)
|
||||
&& frame_id_eq (frame_unwind_caller_id (frame),
|
||||
ecs->event_thread->step_stack_frame_id))
|
||||
&& (frame_id_eq (frame_unwind_caller_id (get_current_frame ()),
|
||||
ecs->event_thread->step_stack_frame_id)
|
||||
&& (!frame_id_eq (ecs->event_thread->step_stack_frame_id,
|
||||
outer_frame_id)
|
||||
|| step_start_function != find_pc_function (stop_pc))))
|
||||
{
|
||||
CORE_ADDR real_stop_pc;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user