From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9837 invoked by alias); 2 Sep 2010 01:04:14 -0000 Received: (qmail 9686 invoked by uid 22791); 2 Sep 2010 01:04:13 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 02 Sep 2010 01:04:03 +0000 Received: (qmail 3487 invoked from network); 2 Sep 2010 01:04:02 -0000 Received: from unknown (HELO ?192.168.0.101?) (yao@127.0.0.2) by mail.codesourcery.com with ESMTPA; 2 Sep 2010 01:04:02 -0000 Message-ID: <4C7EF7F9.8040709@codesourcery.com> Date: Thu, 02 Sep 2010 03:03:00 -0000 From: Yao Qi User-Agent: Thunderbird 2.0.0.24 (X11/20100411) MIME-Version: 1.0 To: Pedro Alves CC: gdb-patches@sourceware.org Subject: Re: [PATCH,ARM] Fix single step on vfork References: <4C7E85C0.3050902@codesourcery.com> <201009011811.10735.pedro@codesourcery.com> In-Reply-To: <201009011811.10735.pedro@codesourcery.com> Content-Type: multipart/mixed; boundary="------------070006020505010303090103" X-IsSubscribed: yes 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 X-SW-Source: 2010-09/txt/msg00079.txt.bz2 This is a multi-part message in MIME format. --------------070006020505010303090103 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Content-length: 1024 Pedro Alves wrote: > On Wednesday 01 September 2010 17:56:32, Yao Qi wrote: >> + /* Don't consider single-stepping when the inferior is >> + waiting_for_vfork_done, either software or hardware step. In >> + software step, child process will hit the software single step >> + breakpoint inserted in parent process. In hardware step, GDB >> + can resumes inferior, and waiting for vfork_done event. */ > > This last sentence looks incomplete? At least, I can't seem to > parse it. > I replaced "waiting" by "wait" in the new patch. >> + if (current_inferior()->waiting_for_vfork_done) > > Space before parens. > Fixed. >> if (use_displaced_stepping (gdbarch) >> && (tp->trap_expected >> || (step && gdbarch_software_single_step_p (gdbarch))) >> - && sig == TARGET_SIGNAL_0) >> + && sig == TARGET_SIGNAL_0 >> + && !current_inferior()->waiting_for_vfork_done) > > Space before parens. > Fixed. -- Yao Qi CodeSourcery yao@codesourcery.com (650) 331-3385 x739 --------------070006020505010303090103 Content-Type: text/x-patch; name="single_step_vfork_1.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="single_step_vfork_1.patch" Content-length: 1857 2010-09-02 Yao Qi * infrunc(resume): When inferior is waiting_for_vfork_done, clear step and don't use displaced stepping. diff --git a/gdb/infrun.c b/gdb/infrun.c index dd89e78..9d40f7c 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -1550,6 +1550,19 @@ resume (int step, enum target_signal sig) QUIT; + /* Don't consider single-stepping when the inferior is + waiting_for_vfork_done, either software or hardware step. In + software step, child process will hit the software single step + breakpoint inserted in parent process. In hardware step, GDB + can resumes inferior, and wait for vfork_done event. */ + if (current_inferior ()->waiting_for_vfork_done) + { + if (debug_infrun) + fprintf_unfiltered (gdb_stdlog, + "infrun: resume : clear step\n"); + step = 0; + } + if (debug_infrun) fprintf_unfiltered (gdb_stdlog, "infrun: resume (step=%d, signal=%d), " @@ -1577,11 +1590,16 @@ a command like `return' or `jump' to continue execution.")); We can't use displaced stepping when we have a signal to deliver; the comments for displaced_step_prepare explain why. The comments in the handle_inferior event for dealing with 'random - signals' explain what we do instead. */ + signals' explain what we do instead. + + We can't use displaced stepping when we are waiting for vfork_done + event, displaced stepping breaks the vfork child similarly as single + step software breakpoint. */ if (use_displaced_stepping (gdbarch) && (tp->trap_expected || (step && gdbarch_software_single_step_p (gdbarch))) - && sig == TARGET_SIGNAL_0) + && sig == TARGET_SIGNAL_0 + && !current_inferior ()->waiting_for_vfork_done) { struct displaced_step_inferior_state *displaced; --------------070006020505010303090103--