From: Joel Brobecker <brobecker@adacore.com>
To: gdb-patches@sourceware.org
Subject: [RFA/commit] Handle EOF on terminals opened with ENONBLOCK...
Date: Thu, 23 Apr 2009 19:14:00 -0000 [thread overview]
Message-ID: <20090423191446.GB7512@adacore.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1850 bytes --]
This is an interesting situation that we encountered on AIX.
At one point, I thought it might have been the same issue as the one
that prevents us from running the testsuite on AIX, but no such luck,
unfortunately.
What happens is that we start GDB in a pseudo-terminal that has the
O_NONBLOCK flag set. This is necessary because not doing so on AIX
results in the child process never really dying, for some reason.
The resulting processes appears as unkillable zombies:
- 483384 - <exiting>
Only a reboot allowed us to get rid of them. We tried very hard to
find out why they never died, but we couldn't figure it out. As far
as we can tell, we do everything the way we're supposed to.
Anyway, the attached patch enhances GDB to handle pseudo terminals
configured that way. Before this patch, you'd see something like this
happening:
(gdb) start
The program being debugged has been started already.
Start it from the beginning
? (y or n) y
!!!-> EOF [assumed Y]
Breakpoint 2 at 0x100154f0: file foo.adb, line 4.
Starting program: /dresden.a/brobecke/ex/foo
foo () at foo.adb:4
4 end Foo;
What happens is that, by the time GDB makes a read on the pseudo-
terminal, there is nothing to read yet, and thus gets EOF back.
The thing to do, to detect our case, is to check the errno value,
and try again a little later if it's EAGAIN.
2009-04-23 Joel Brobecker <brobecker@adacore.com>
* utils.c: Add include of gdb_usleep.h.
(defaulted_query): Detect false EOF conditions that happen
on terminals opened with the O_NONBLOCK flag when there is
nothing to read.
We've tested this patch on all the hosts that AdaCore supports.
This includes GNU/Linux, Solaris, AIX, Tru64, MinGW...
Would it be OK to commit?
--
Joel
[-- Attachment #2: EOF.diff --]
[-- Type: text/x-diff, Size: 1077 bytes --]
diff --git a/gdb/utils.c b/gdb/utils.c
index 57f267a..175b2fc 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -67,6 +67,8 @@
#include <sys/time.h>
#include <time.h>
+#include "gdb_usleep.h"
+
#if !HAVE_DECL_MALLOC
extern PTR malloc (); /* OK: PTR */
#endif
@@ -1477,6 +1479,20 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
gdb_flush (gdb_stdout);
answer = fgetc (stdin);
+
+ /* On terminals opened with the NONBLOCK flag, fgetc can return EOF
+ when there is nothing to read. To distinguish this case from
+ a true EOF, we need to check the file error condition and see
+ if fgetc might have set errno to EAGAIN. */
+ while (answer == EOF && ferror (stdin) && errno == EAGAIN)
+ {
+ /* Not a real EOF. Wait a little while and try again until
+ we read something. */
+ clearerr (stdin);
+ gdb_usleep (10000);
+ answer = fgetc (stdin);
+ }
+
clearerr (stdin); /* in case of C-d */
if (answer == EOF) /* C-d */
{
next reply other threads:[~2009-04-23 19:14 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-23 19:14 Joel Brobecker [this message]
2009-04-23 19:35 ` Mark Kettenis
2009-04-23 20:37 ` Joel Brobecker
2009-04-23 20:45 ` Mark Kettenis
2009-04-24 10:20 ` Eli Zaretskii
2009-05-06 23:02 ` Joel Brobecker
2009-05-07 3:13 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090423191446.GB7512@adacore.com \
--to=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox