From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29117 invoked by alias); 29 Feb 2004 04:33:55 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 29109 invoked from network); 29 Feb 2004 04:33:54 -0000 Received: from unknown (HELO localhost.redhat.com) (24.157.170.238) by sources.redhat.com with SMTP; 29 Feb 2004 04:33:54 -0000 Received: from gnu.org (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 9C2042B98; Sat, 28 Feb 2004 23:33:51 -0500 (EST) Message-ID: <40416BAF.1020308@gnu.org> Date: Sun, 29 Feb 2004 04:33:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.4.1) Gecko/20040217 MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [patch/rfc,6.1?] Use right frame ID in step_over_function Content-Type: multipart/mixed; boundary="------------070209080502090809040300" X-SW-Source: 2004-02/txt/msg00882.txt.bz2 This is a multi-part message in MIME format. --------------070209080502090809040300 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 927 Hello, This goes into the "how did it ever work" category. The idea of step_over_function is that it: - finds the caller's resume address - finds the caller's frame ID and then sets a breakpoint for that caller instance of the function. The current code: - finds the caller's resume address - finds the _callee_ frame ID and then uses that to set the breakpoint. Now that is plain weird! It only works because either: - the step_frame_id patches up the bug - the values match as GDB is using the inner-most, rather than outer-most frame address as part of the frame ID The bug apepars when trying to step over nested shared library non-debug info functions (making sense?). I'll follow this up after 6.1 branch is in place. Its pretty heavy a change to apply to that branch and this late. However, like Joel's related patch, I suspect it will be needed :-/ Andrew PS: Why do I have this feeling of dejavu? --------------070209080502090809040300 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 2150 * infrun.c (step_over_function): When non-legacy code, and no step_frame_id, use the unwinder to get the caller's frame ID. Index: infrun.c =================================================================== RCS file: /cvs/src/src/gdb/infrun.c,v retrieving revision 1.137 diff -u -r1.137 infrun.c --- infrun.c 16 Feb 2004 20:49:51 -0000 1.137 +++ infrun.c 29 Feb 2004 04:10:59 -0000 @@ -2930,6 +2930,7 @@ step_over_function (struct execution_control_state *ecs) { struct symtab_and_line sr_sal; + struct frame_id sr_id; init_sal (&sr_sal); /* initialize to zeros */ @@ -2973,13 +2974,29 @@ sr_sal.section = find_pc_overlay (sr_sal.pc); check_for_old_step_resume_breakpoint (); - step_resume_breakpoint = - set_momentary_breakpoint (sr_sal, get_frame_id (get_current_frame ()), - bp_step_resume); if (frame_id_p (step_frame_id) && !IN_SOLIB_DYNSYM_RESOLVE_CODE (sr_sal.pc)) - step_resume_breakpoint->frame_id = step_frame_id; + /* NOTE: cagney/2004-02-27: Use the global state's idea of the + stepping frame ID. I suspect this is done as it is lighter + weight than a call to get_prev_frame. */ + sr_id = step_frame_id; + else if (legacy_frame_p (current_gdbarch)) + /* NOTE: cagney/2004-02-27: This is the way it was 'cos this is + the way it always was. It should be using the unwound (or + caller's) ID, and not this (or the callee's) ID. It appeared + to work because: legacy architectures used the wrong end of the + frame for the ID.stack (inner-most rather than outer-most) so + that the callee's id.stack (un adjusted) matched the caller's + id.stack giving the "correct" id; more often than not + !IN_SOLIB_DYNSYM_RESOLVE_CODE and hence the code above (it was + originally later in the function) fixed the ID by using global + state. */ + sr_id = get_frame_id (get_current_frame ()); + else + sr_id = get_frame_id (get_prev_frame (get_current_frame ())); + + step_resume_breakpoint = set_momentary_breakpoint (sr_sal, sr_id, bp_step_resume); if (breakpoints_inserted) insert_breakpoints (); --------------070209080502090809040300--