From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31527 invoked by alias); 16 Oct 2013 03:31:53 -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 31447 invoked by uid 89); 16 Oct 2013 03:31:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.9 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 16 Oct 2013 03:31:52 +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 r9G3Vo1h002567 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 15 Oct 2013 23:31:50 -0400 Received: from psique (ovpn-113-80.phx2.redhat.com [10.3.113.80]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r9G3VkeD020996 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 15 Oct 2013 23:31:49 -0400 From: Sergio Durigan Junior To: "Dave.Tian" Cc: gdb-patches@sourceware.org Subject: Re: [PATCH] bug fix for gdb 16039 References: X-URL: http://www.redhat.com Date: Wed, 16 Oct 2013 03:31:00 -0000 In-Reply-To: (Dave Tian's message of "Wed, 16 Oct 2013 10:18:18 +0800") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2013-10/txt/msg00468.txt.bz2 On Tuesday, October 15 2013, Dave Tian wrote: > 1 Description: Gdb bug 16039 created by me > > Title: Gdb next" command stop working when shared library unloaded. > Root Cause: There is "libc++" static linked into the shared library, > and since gdb insert internal breakpoints on std::terminate/longjump/... > so after dlclose, the memory address is > invalid,remove_breakpoints/insert_breakpoints > failed with EIO error. > > Fix: Disable the internal breakpoints when dlclose hit. Almost there, Dave! Thanks :-). > 2 ChangeLog: > > 2013-10-16 Tian Ye > > PR gdb/16039 > * breakpoint.c (is_removable_in_unloaded_shlib): New. ^^^^ Write "New function" instead. > (set_longjmp_breakpoint): Check if breakpoint's location > address is not in an unloaded shared library > (disable_breakpoints_in_unloaded_shlib): Disable the > internal breakpoints in the hook function of shared > library unload. > > 3 Patch Diffs: > > --- breakpoint.c.bak 2013-10-12 01:15:09.044081000 -0700 > +++ breakpoint.c 2013-10-15 18:50:59.842116000 -0700 > @@ -1118,6 +1118,17 @@ is_tracepoint (const struct breakpoint * > return is_tracepoint_type (b->type); > } > > +/* Breakpoints should be disable when shlib unload. */ The comment should describe what the function does. Something like: /* Return 1 if B is an internal breakpoint that can be removed when a shared library is unloaded, or 0 otherwise. */ > + > +static int > +is_removable_in_unloaded_shlib(const struct breakpoint *b) ^^^ Space between function name and parenthesis. > +{ > + return (b->type == bp_longjmp_master > + || b->type == bp_std_terminate_master > + || b->type == bp_exception_master > + || b->type == bp_exception); > +} Also, would you mind explaining how you came to the conclusion that only those types of internal breakpoints can be present in a shared library? I looked a little bit through the code and could not find any explanation about this assumption. I remember that I commented that maybe you should extend this function in order to identify the other kinds of internal breakpoints... It would be nice to hear what other maintainers think of Dave's approach, so that he doesn't waste his with this detail. > + > /* A helper function that validates that COMMANDS are valid for a > breakpoint. This function will throw an exception if a problem is > found. */ > @@ -7147,8 +7158,8 @@ set_longjmp_breakpoint (struct thread_in > clones of those and enable them for the requested thread. */ > ALL_BREAKPOINTS_SAFE (b, b_tmp) > if (b->pspace == current_program_space > - && (b->type == bp_longjmp_master > - || b->type == bp_exception_master)) > + && ((b->type == bp_longjmp_master > + || b->type == bp_exception_master) && !b->loc->shlib_disabled)) > { > enum bptype type = b->type == bp_longjmp_master ? bp_longjmp : bp_exception; > struct breakpoint *clone; > @@ -7463,7 +7474,8 @@ disable_breakpoints_in_unloaded_shlib (s > || b->type == bp_hardware_breakpoint) > && (loc->loc_type == bp_loc_hardware_breakpoint > || loc->loc_type == bp_loc_software_breakpoint)) > - || is_tracepoint (b)) > + || is_tracepoint (b) > + || is_removable_in_unloaded_shlib(b)) ^^^ Space between function name and parenthesis. > && solib_contains_address_p (solib, loc->address)) > { > loc->shlib_disabled = 1; -- Sergio