From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6990 invoked by alias); 11 Jul 2002 18:52:14 -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 6961 invoked from network); 11 Jul 2002 18:52:13 -0000 Received: from unknown (HELO potter.sfbay.redhat.com) (205.180.83.107) by sources.redhat.com with SMTP; 11 Jul 2002 18:52:13 -0000 Received: from cygbert.vinschen.de (vpn3-4.sfbay.redhat.com [172.16.25.4]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id g6BIr0Q28785 for ; Thu, 11 Jul 2002 11:53:00 -0700 Received: (from corinna@localhost) by cygbert.vinschen.de (8.11.6/8.9.3/Linux sendmail 8.9.3) id g6BIq8V10396 for gdb-patches@sources.redhat.com; Thu, 11 Jul 2002 20:52:08 +0200 Date: Thu, 11 Jul 2002 11:55:00 -0000 From: Corinna Vinschen To: gdb-patches@sources.redhat.com Subject: [RFA]: Fix bug gdb/321 Message-ID: <20020711205208.U21857@cygbert.vinschen.de> Reply-To: gdb-patches@sources.redhat.com Mail-Followup-To: gdb-patches@sources.redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.22.1i X-SW-Source: 2002-07/txt/msg00237.txt.bz2 Hi, the following patch seems to fix the bug described in gdb/321: http://sources.redhat.com/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gdb&pr=321 Basically the problem is that gdb's backtrace reports the wrong calling function if a function ends in a call to abort() (or another noreturn func) under some conditions. The bug report suggests to use a by one decremented pc when evaluating the function. The following patch does exactly this by using the return value of frame_address_in_block() instead of frame->pc in calls which evaluate symbols. Corinna ChangeLog: * stack.c (print_frame): Use result of frame_address_in_block() instead of fi->pc when evaluating symbols. (backtrace_command_1): Ditto. Index: stack.c =================================================================== RCS file: /cvs/src/src/gdb/stack.c,v retrieving revision 1.39 diff -u -p -r1.39 stack.c --- stack.c 10 Jun 2002 23:25:50 -0000 1.39 +++ stack.c 11 Jul 2002 18:42:47 -0000 @@ -461,7 +461,7 @@ print_frame (struct frame_info *fi, stb = ui_out_stream_new (uiout); old_chain = make_cleanup_ui_out_stream_delete (stb); - func = find_pc_function (fi->pc); + func = find_pc_function (frame_address_in_block (fi)); if (func) { /* In certain pathological cases, the symtabs give the wrong @@ -480,7 +480,7 @@ print_frame (struct frame_info *fi, ever changed many parts of GDB will need to be changed (and we'll create a find_pc_minimal_function or some such). */ - struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); + struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (frame_address_in_block (fi)); if (msymbol != NULL && (SYMBOL_VALUE_ADDRESS (msymbol) > BLOCK_START (SYMBOL_BLOCK_VALUE (func)))) @@ -528,7 +528,7 @@ print_frame (struct frame_info *fi, } else { - struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); + struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (frame_address_in_block (fi)); if (msymbol != NULL) { funname = SYMBOL_NAME (msymbol); @@ -1111,7 +1111,7 @@ backtrace_command_1 (char *count_exp, in fi = get_prev_frame (fi)) { QUIT; - ps = find_pc_psymtab (fi->pc); + ps = find_pc_psymtab (frame_address_in_block (fi)); if (ps) PSYMTAB_TO_SYMTAB (ps); /* Force syms to come in */ } -- Corinna Vinschen Cygwin Developer Red Hat, Inc. mailto:vinschen@redhat.com