From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9748 invoked by alias); 4 Jun 2014 18:35:49 -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 9734 invoked by uid 89); 4 Jun 2014 18:35:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00,UNSUBSCRIBE_BODY autolearn=no version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 04 Jun 2014 18:35:46 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1WsG2J-0000HM-Fg from donb@codesourcery.com for gdb-patches@sourceware.org; Wed, 04 Jun 2014 11:35:43 -0700 Received: from [127.0.0.1] ([172.30.2.62]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Wed, 4 Jun 2014 11:35:42 -0700 Message-ID: <538F66FC.9040907@codesourcery.com> Date: Wed, 04 Jun 2014 18:35:00 -0000 From: "Breazeal, Don" User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: [ping] [PATCH] Fix for PR gdb/14808, vfork/exec inferior problem References: <1400186622-3321-1-git-send-email-donb@codesourcery.com> <537FEE77.4060509@codesourcery.com> <5384C4D6.8090608@codesourcery.com> In-Reply-To: <5384C4D6.8090608@codesourcery.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2014-06/txt/msg00206.txt.bz2 Ping. On 5/27/2014 10:01 AM, Breazeal, Don wrote: > On 5/23/2014 5:57 PM, Yao Qi wrote: >> A nit on changelog entry: >> >> On 05/16/2014 04:43 AM, Don Breazeal wrote: >>> gdb/ >>> 2014-05-15 Don Breazeal >>> >> PR gdb/14808 >>> * infrun.c (handle_vfork_child_exec_or_exit): For the case >>> of a vfork where we follow the child and detach the parent, >>> and the child execs, create a new pspace for the parent >>> inferior. >> >> With this, the magic script can connect this commit to the right PR. >> >> The patch looks good to me, but I can't approve it. >> > Thanks for checking this. An updated ChangeLog and (unchanged) patch > follow. > --Don > > gdb/ > 2014-05-12 Don Breazeal > > PR gdb/14808 > * infrun.c (handle_vfork_child_exec_or_exit): For the case > of a vfork where we follow the child and detach the parent, > and the child execs, create a new pspace and aspace for the > parent inferior. > > gdb/testsuite > 2014-05-12 Don Breazeal > > * gdb.base/foll-vfork.exp (vfork_relations_in_info_inferiors): > Test that after a vfork and child exec, the parent's exec file > name has not been changed. > > --- > gdb/infrun.c | 42 > ++++++++++++++++++++++----------- > gdb/testsuite/gdb.base/foll-vfork.exp | 11 ++++++++ > 2 files changed, 39 insertions(+), 14 deletions(-) > > diff --git a/gdb/infrun.c b/gdb/infrun.c > index ab39b6e..82a67d5 100644 > --- a/gdb/infrun.c > +++ b/gdb/infrun.c > @@ -649,6 +649,7 @@ handle_vfork_child_exec_or_exit (int exec) > struct cleanup *old_chain; > struct program_space *pspace; > struct address_space *aspace; > + struct inferior *parent_inf; > > /* follow-fork child, detach-on-fork on. */ > > @@ -665,27 +666,39 @@ handle_vfork_child_exec_or_exit (int exec) > else > old_chain = save_current_space_and_thread (); > > - /* We're letting loose of the parent. */ > + /* Make the parent the current inferior for target_detach. */ > tp = any_live_thread_of_process (inf->vfork_parent->pid); > switch_to_thread (tp->ptid); > > - /* We're about to detach from the parent, which implicitly > - removes breakpoints from its address space. There's a > - catch here: we want to reuse the spaces for the child, > - but, parent/child are still sharing the pspace at this > - point, although the exec in reality makes the kernel give > - the child a fresh set of new pages. The problem here is > - that the breakpoints module being unaware of this, would > - likely chose the child process to write to the parent > - address space. Swapping the child temporarily away from > - the spaces has the desired effect. Yes, this is "sort > - of" a hack. */ > - > + /* The child inferior INF may be dead, so avoid giving the > + breakpoints module the option to write through to it > + by swapping the child temporarily away from the spaces > + (cloning a program space resets breakpoints). */ > pspace = inf->pspace; > aspace = inf->aspace; > inf->aspace = NULL; > inf->pspace = NULL; > > + if (exec) > + { > + /* The parent and child inferiors have been sharing > + program and address space structures from the point > + where the parent called vfork. Now that the child has > + called exec and we are detaching from the parent, the > + parent inferior needs to have its own pspace and aspace > + so that changes in the child don't affect it. We have > + to give the new spaces to the parent since we saved the > + child's spaces as the current spaces above. Even though > + we are detaching the parent, we want to keep the > + corresponding entry in the inferiors list intact. */ > + parent_inf = current_inferior (); > + parent_inf->aspace = new_address_space (); > + parent_inf->pspace = add_program_space (parent_inf->aspace); > + parent_inf->removable = inf->removable; > + set_current_program_space (parent_inf->pspace); > + clone_program_space (parent_inf->pspace, pspace); > + } > + > if (debug_infrun || info_verbose) > { > target_terminal_ours (); > @@ -702,9 +715,10 @@ handle_vfork_child_exec_or_exit (int exec) > inf->vfork_parent->pid); > } > > + /* Detach the parent. */ > target_detach (NULL, 0); > > - /* Put it back. */ > + /* Put the child spaces back. */ > inf->pspace = pspace; > inf->aspace = aspace; > > diff --git a/gdb/testsuite/gdb.base/foll-vfork.exp > b/gdb/testsuite/gdb.base/foll-vfork.exp > index fe3663c..e9b0110 100644 > --- a/gdb/testsuite/gdb.base/foll-vfork.exp > +++ b/gdb/testsuite/gdb.base/foll-vfork.exp > @@ -442,6 +442,17 @@ proc vfork_relations_in_info_inferiors { variant } { > pass $test > } > } > + > + # Make sure the exec file name of the vfork parent is not > + # changed when the child's is changed. > + if { $variant == "exec" } { > + set test "exec file name change" > + gdb_test_multiple "info inferiors" $test { > + -re " 2 .*vforked-prog.* 1 .*foll-vfork.*$gdb_prompt " { > + pass $test > + } > + } > + } > }} > > proc do_vfork_and_follow_parent_tests {} { >