From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21736 invoked by alias); 19 Nov 2013 15:09:20 -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 21708 invoked by uid 89); 19 Nov 2013 15:09:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.3 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; Tue, 19 Nov 2013 15:09:18 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rAJF9Btw009606 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 19 Nov 2013 10:09:11 -0500 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id rAJF99uJ018264; Tue, 19 Nov 2013 10:09:10 -0500 Message-ID: <528B7F15.7040605@redhat.com> Date: Tue, 19 Nov 2013 15:10: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> <52850730.1060109@redhat.com> <87d2lxpo1l.fsf@fleche.redhat.com> In-Reply-To: <87d2lxpo1l.fsf@fleche.redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-SW-Source: 2013-11/txt/msg00540.txt.bz2 On 11/18/2013 06:23 PM, Tom Tromey wrote: >>> + if (VALUE_LVAL (new_val) == lval_register >>> + && value_lazy (new_val) >>> + && frame_id_eq (VALUE_FRAME_ID (new_val), last_frame_id)) > > Pedro> I think this should also check the regnum: > > Barf. I have a memory of actually writing that. False memory I guess. > Sigh. > >>> #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?) > > Pedro> Doesn't this all then mean that we somehow ended up with two identical > Pedro> frames with the same id on the frame chain (#4 and #5) ? > Pedro> That seems very wrong to me. > > Pedro> It seems to be a better fix would be to make > Pedro> get_prev_frame_1/get_prev_frame_raw discard frame #5 before it > Pedro> was ever linked in. Either that, or, if we really need to keep > Pedro> #5 linked in, we should find a way for frame_id_eq (#4, #5) to > Pedro> return false. > > I will look into it, but my recollection is that last time we got into > this area, it was somehow undesirable to undo whatever changes were done > by existing frame sniffers. Hmm, I don't think that's the same issue. I'm just talking about something like moving the frame_id_eq check to the end of get_prev_frame_1, after calling get_prev_frame_raw. Something like: prev_frame = get_prev_frame_raw (this_frame); /* Check that this and the prev frame are not identical. If they are, there is most likely a stack cycle. */ if (prev_frame != NULL && frame_id_eq (get_frame_id (prev_frame), get_frame_id (this_frame))) { if (frame_debug) { fprintf_unfiltered (gdb_stdlog, "-> "); fprint_frame (gdb_stdlog, NULL); fprintf_unfiltered (gdb_stdlog, " // this frame has same ID }\n"); } this_frame->stop_reason = UNWIND_SAME_ID; /* Unlink. */ this_frame->prev = NULL; return NULL; } return prev_frame; } -- Pedro Alves