From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from conssluserg-04.nifty.com (conssluserg-04.nifty.com [210.131.2.83]) by sourceware.org (Postfix) with ESMTPS id 274283846027 for ; Fri, 7 May 2021 08:34:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 274283846027 Received: from Express5800-S70 (v050190.dynamic.ppp.asahi-net.or.jp [124.155.50.190]) (authenticated) by conssluserg-04.nifty.com with ESMTP id 1478XTtg031929; Fri, 7 May 2021 17:33:29 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-04.nifty.com 1478XTtg031929 X-Nifty-SrcIP: [124.155.50.190] Date: Fri, 7 May 2021 17:33:40 +0900 From: Takashi Yano To: cygwin@cygwin.com Cc: Jon Turney Subject: Re: GDB looses pgrp setting in the terminal for debugged process after break. Message-Id: <20210507173340.9741cec791c2bfbb9edee4f2@nifty.ne.jp> In-Reply-To: <6a422002-189a-baf8-5b65-fa822a0803a7@dronecode.org.uk> References: <20210126121402.167ba4ca0d7d8b747feede9f@nifty.ne.jp> <20210205193457.cecc47a50865a59dc3f7041f@nifty.ne.jp> <20210206002654.17dca1106da610b2f7b7b077@nifty.ne.jp> <20210503011625.8656a8f7187120ace0e375ef@nifty.ne.jp> <6a422002-189a-baf8-5b65-fa822a0803a7@dronecode.org.uk> X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: cygwin@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Cygwin discussions and problem reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 May 2021 08:34:54 -0000 On Thu, 6 May 2021 21:31:27 +0100 Jon Turney wrote: > On 02/05/2021 17:16, Takashi Yano via Cygwin wrote: > > On Sat, 6 Feb 2021 00:26:54 +0900 > > Takashi Yano wrote: > >> On Fri, 5 Feb 2021 19:34:57 +0900 > >> Takashi Yano wrote: > >>> On Tue, 26 Jan 2021 12:14:02 +0900 > >>> Takashi Yano wrote: > >>>> Hi GDB maintainer, > > Sorry! I meant to go back and look at this, but I forgot. > > Thanks for reminding me! Thanks for replying. > >>>> In GDB, debugged process cannot continue execution after break > >>>> if it reads stdin. > >>>> > >>>> With the following steps, cat is terminated with error. > >>>> > >>>> 1) Install coreutils-debuginfo package. > >>>> 2) Run "gdb cat" in console (command prompt), not in mintty. > >>>> 3) Enter "start" in gdb. > >>>> 4) Enter "cont" in gdb. > >>>> > >>>> This results in: > >>>> /usr/bin/cat: -: Input/output error > >>>> > >>>> Both gdb-9.2-1 and gdb-10.1-1(TEST) have this problem. > >>>> > >>>> I looked into this problem and found the cause is that the pgid > >>>> setting for /usr/bin/cat is lost after break. The following patch > >>>> for GDB source resolves the issue. In the following section, > >>>> winpid is passed to getpgid() rather than cygwin pid. Also, winpid > >>>> is passed to other POSIX system calls such as kill() elsewhere. > >>>> > [...] > >>>> > >>>> I hope the GDB maintainer will check it out. > >>>> > >>>> Addresses: https://cygwin.com/pipermail/cygwin-patches/2021q1/011018.html > >>> > >>> I have noticed that cygwin gdb essentially has the problem > >>> regarding terminal process group. > >>> > >>> Cygwin gdb uses CreateProcessW() to execute debugging process > > Yes, being half-aware that it's using the Win32 API to do the debugging > makes things awkward in gdb. > > At one stage, I did start writing some changes to gdb to use cygwin's > fork/exec to start the inferior, rather than CreateProcess, but that's > also awkward. > > >>> rather than exec(). If the debugging process is a cygwin process, > > This process is usually called the 'debugee' or 'the inferior'. > > >>> cygwin pid is assigned, however, if the debugging process is a > >>> non cygwin process, cygwin pid is not assigned. Therefore, there > >>> is no appropriate process group ID to set. > > I'm not sure how this scenario relates to the initial report which seems > to be about a process tree: > > cmd -> gdb (cygwin) -> cat (cygwin) > > ? No. This may be another (potential) problem. I mean: gdb (cygwin) -> program (non-cygwin) Non-cygwin program means the program compiled with non-cygwin compiler (e.g. mingw compiler). IIUC, gdb sets terminal pgrp to the debugee while the debugee is running and set terminal pgrp back to gdb itself when the debugee breaks. In the case obove, gdb sets terminal pgrp to pgid of cat when 'start' command is issued. When cat breaks at main(), gdb set terminal pgrp to pgid of gdb itself. Then, when 'cont' command is issued, gdb sets terminal pgrp to pgid of cat again. If the debugee is a non-cygwin program (rather than cat), there is no cygwin pgid for the debugee. Therefore, gdb cannot set terminal pgrp to appropriate value while the debugee is running. In that case, it may be the right thing not to set terminal pgrp to the debugee. The code below does that. What do you think? > >>> I wonder what is the right thing under that situation. Any idea? > >> > >> The patch below seems to be better than the previous one a bit. > >> > >> diff --git a/inflow.c.orig b/inflow.c > >> index 00b2235..fa7b408 100644 > >> --- a/inflow.c.orig > >> +++ b/inflow.c > >> @@ -40,6 +40,10 @@ > >> #include > >> #endif > >> > >> +#ifdef __CYGWIN__ > >> +#include > >> +#endif > >> + > >> #ifndef O_NOCTTY > >> #define O_NOCTTY 0 > >> #endif > >> @@ -367,7 +371,13 @@ child_terminal_inferior (struct target_ops *self) > >> time the inferior was running. See also comments > >> describing terminal_state::process_group. */ > >> #ifdef HAVE_GETPGID > >> +#ifdef __CYGWIN__ > >> + pid_t cygpid = cygwin_internal (CW_WINPID_TO_CYGWIN_PID, inf->pid); > >> + if (cygpid <= cygwin_internal (CW_MAX_CYGWIN_PID)) > >> + result = tcsetpgrp (0, getpgid (cygpid)); > >> +#else > >> result = tcsetpgrp (0, getpgid (inf->pid)); > >> +#endif > >> #else > >> result = tcsetpgrp (0, tinfo->process_group); > >> #endif > > > > I confirmed that gdb-10.2-1 (TEST) still has this problem. > > It certainly seems reasonable that we need to do this cygwin/windows pid > mapping somewhere. I would be happy if you could consider how to fix this issue. Thanks! -- Takashi Yano