From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26651 invoked by alias); 14 Nov 2013 17:24:11 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 26639 invoked by uid 89); 14 Nov 2013 17:24:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,RDNS_NONE,SPF_HELO_PASS,SPF_PASS autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from Unknown (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 14 Nov 2013 17:24:09 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rAEHO1eW027197 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 14 Nov 2013 12:24:01 -0500 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id rAEHO0Q4002216; Thu, 14 Nov 2013 12:24:01 -0500 Message-ID: <52850730.1060109@redhat.com> Date: Thu, 14 Nov 2013 17:34:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 MIME-Version: 1.0 To: Tom Tromey CC: gdb-patches@sourceware.org Subject: Re: [PATCH 1/2] avoid infinite loop with bad debuginfo References: <1384375873-32160-1-git-send-email-tromey@redhat.com> <1384375873-32160-2-git-send-email-tromey@redhat.com> In-Reply-To: <1384375873-32160-2-git-send-email-tromey@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-SW-Source: 2013-11/txt/msg00375.txt.bz2 On 11/13/2013 08:51 PM, Tom Tromey wrote: > while (VALUE_LVAL (new_val) == lval_register && value_lazy (new_val)) > { > - frame = frame_find_by_id (VALUE_FRAME_ID (new_val)); > + struct frame_id last_frame_id = VALUE_FRAME_ID (new_val); > + > + frame = frame_find_by_id (last_frame_id); > regnum = VALUE_REGNUM (new_val); > > gdb_assert (frame != NULL); > @@ -3521,6 +3523,11 @@ value_fetch_lazy (struct value *val) > regnum, type)); > > new_val = get_frame_register_value (frame, regnum); > + if (VALUE_LVAL (new_val) == lval_register > + && value_lazy (new_val) > + && frame_id_eq (VALUE_FRAME_ID (new_val), last_frame_id)) I think this should also check the regnum: if (VALUE_LVAL (new_val) == lval_register && value_lazy (new_val) && last_regnum == VALUE_REGNUM (new_val); && frame_id_eq (VALUE_FRAME_ID (new_val), last_frame_id)) Makes sense to me with that change. But see below. It seems very odd to me that we'd get into a situation where we have two frames with the same id. > + error (_("infinite loop while fetching a register; " > + "probably bad debug info")); What swallows this error? As it leads to: Backtrace stopped: previous frame identical to this frame (corrupt stack?) I'd mildly suggest changing the new error to match (corrupt stack?) error (_("infinite loop while fetching a register (corrupt stack?)")); However, > #4 0x0000007fb7f0956c in clone () from /lib64/libc.so.6 > #5 0x0000007fb7f0956c in clone () from /lib64/libc.so.6 > Backtrace stopped: previous frame identical to this frame (corrupt stack?) Doesn't this all then mean that we somehow ended up with two identical frames with the same id on the frame chain (#4 and #5) ? That seems very wrong to me. It seems to be a better fix would be to make get_prev_frame_1/get_prev_frame_raw discard frame #5 before it was ever linked in. Either that, or, if we really need to keep #5 linked in, we should find a way for frame_id_eq (#4, #5) to return false. -- Pedro Alves