From: Kevin Buettner <kevinb@cygnus.com>
To: gdb-patches@sources.redhat.com
Subject: [PATCH RFA] lin-lwp.c: Block SIGCHLD events when attaching
Date: Wed, 07 Nov 2001 15:07:00 -0000 [thread overview]
Message-ID: <1011119193045.ZM16376@ocotillo.lan> (raw)
When doing a lin_lwp_attach_lwp(), it is sometimes possible to receive
a SIGCHLD signal thus causing the waitpid() call to fail with EINTR.
This in turn causes the second assert() in lin_lwp_attach_lwp() to
fail.
Reproducing this problem can be somewhat difficult. I've only been
able to reproduce it on a dual processor Linux/x86 machine. I did
manage to reproduce it using the linux-dp program as follows:
1) Start linux-dp (again, running on an SMP machine).
2) Determine the process id. Let's call it PID. (Make appropriate
substitution below.)
3) Invoke gdb:
gdb linux-dp
4) Do:
set height 0
break print_philosopher
5) Do:
while 1
attach PID
continue
detach
end
6) Go get a cup of coffee, take a nap, etc. When you come back, you
may be fortunate enough to see the following:
...
Breakpoint 1, print_philosopher (n=2, left=95 '_', right=95 '_')
at ../../../src/gdb/testsuite/gdb.threads/linux-dp.c:105
105 shared_printf ("%*s%c %d %c\n", (n * 4) + 2, "", left, n, right);
../../src/gdb/lin-lwp.c:416: gdb-internal-error: lin_lwp_attach: Assertion `pid == GET_PID (inferior_ptid) && WIFSTOPPED (status) && WSTOPSIG (status) == SIGSTOP' failed.
An internal GDB error was detected. This may make further
debugging unreliable. Continue this debugging session? (y or n)
Jim Blandy deserves credit for arriving at the above procedure for
reproducing this bug. (The actual test case that we used for tracking
down this problem is different and is able to demonstrate it in a very
short period of time. Having *lots* of running threads greatly
increases the chances of being able to reproduce it quickly.)
The fix is below. Okay to commit?
* lin-lwp.c (lin_lwp_attach_lwp): Make sure SIGCHLD is in set of
blocked signals.
Index: lin-lwp.c
===================================================================
RCS file: /cvs/src/src/gdb/lin-lwp.c,v
retrieving revision 1.30
diff -u -p -r1.30 lin-lwp.c
--- lin-lwp.c 2001/10/14 11:30:37 1.30
+++ lin-lwp.c 2001/11/19 19:08:10
@@ -352,6 +352,14 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
gdb_assert (is_lwp (ptid));
+ /* Make sure SIGCHLD is blocked. We don't want SIGCHLD events
+ to interrupt either the ptrace() or waitpid() calls below. */
+ if (! sigismember (&blocked_mask, SIGCHLD))
+ {
+ sigaddset (&blocked_mask, SIGCHLD);
+ sigprocmask (SIG_BLOCK, &blocked_mask, NULL);
+ }
+
if (verbose)
printf_filtered ("[New %s]\n", target_pid_to_str (ptid));
next reply other threads:[~2001-11-19 19:30 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-11-07 15:07 Kevin Buettner [this message]
2001-11-07 15:15 ` H . J . Lu
2001-11-07 19:05 ` Kevin Buettner
2001-11-07 19:37 ` Kevin Buettner
2001-11-07 20:26 ` H . J . Lu
2001-11-07 22:45 ` Kevin Buettner
2001-11-07 22:48 ` Kevin Buettner
2001-11-07 23:21 ` H . J . Lu
2001-11-08 10:55 ` Kevin Buettner
2001-11-08 10:25 ` H . J . Lu
2001-11-08 13:03 ` Mark Kettenis
2001-11-08 19:19 ` Kevin Buettner
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=1011119193045.ZM16376@ocotillo.lan \
--to=kevinb@cygnus.com \
--cc=gdb-patches@sources.redhat.com \
/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