From: Tejun Heo <tj@kernel.org>
To: Jan Kratochvil <jan.kratochvil@redhat.com>
Cc: oleg@redhat.com, roland@redhat.com, linux-kernel@vger.kernel.org,
torvalds@linux-foundation.org, akpm@linux-foundation.org
Subject: Re: [PATCHSET RFC] ptrace,signal: clean transition between STOPPED and TRACED
Date: Thu, 13 Jan 2011 16:05:01 +0100 [thread overview]
Message-ID: <20110113150501.GA12596@htj.dyndns.org> (raw)
In-Reply-To: <20110112214350.GC13830@host1.dyn.jankratochvil.net>
Hello, Jan. (Please ignore the other reply. I pressed the wrong keys
and it went out prematurely.)
On Wed, Jan 12, 2011 at 10:43:50PM +0100, Jan Kratochvil wrote:
> FSF GDB for `T (stopped)' processes currently does:
> PTRACE_ATTACH
> check /proc/%d/status for `T (stopped)' (by GDB's pid_is_stopped)
> if found then kill (PID, SIGSTOP) && ptrace (PTRACE_CONT, PID, 0, 0).
> waitpid (pid, &status, 0) - so that this one does not get stuck if the stop
> event was already eaten out before.
>
> If the `T (stopped)' will now always FAIL then at leat the waitpid then should
> never get stuck.
Now the child will always stop inside ptrace_stop() which
unconditionally sets ->exit_code (the state wait(2) consumes) so it
won't get stuck unless someone else consumes it inbetween, of course.
> > 2. The transition between STOPPED and TRACED involves a short window
> > of RUNNING inbetween. On attach, the transition is hidden from the
> > tracer using GROUP_STOP_TRAPPING but it still is visible to other
> > threads in the tracer's group. IOW, if another thread performs
> > WNOHANG wait(2) on the tracee while attach is in progress, the
> > wait(2) may fail even if the tracee is known to be in stopped state
> > before.
> >
> > The same problem exists the other direction during detach.
> > Currently, the code doesn't try to hide this transition even from
> > the tracer. IOW, if the tracer attaches to a stopped task,
> > detaches, reattaches and then performs WNOHANG wait(2), the wait(2)
> > may fail. However, given the previous behavior where the tracee is
> > always woken up by wake_up_process() on detach, this is highly
> > unlikely to cause any problem.
>
> FSF gdbserver --multi does PTRACE_ATTACH followed by waitpid (WNOHANG) and it
> fails if it returns ECHILD on the first try.
>
> ptrace(PTRACE_ATTACH, 22049, 0, 0) = 0
> wait4(-1, [{WIFSTOPPED(s) && WSTOPSIG(s) == SIGSTOP}], WNOHANG, NULL) = 22049
>
> It may be also a gdbserver bug, though.
How is that supposed to work even with the current code? Does it
check whether the target thread is stopped before doing that? Reading
gdbserver manpage.... Hmm... doesn't help much. Can you please help
me understanding what it expects there?
Thank you.
--
tejun
next prev parent reply other threads:[~2011-01-13 15:05 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-24 14:00 [PATCHSET RFC] ptrace,signal: clean transition between STOPPED and TRACED Tejun Heo
2010-12-24 14:00 ` [PATCH 1/7] clone: kill CLONE_STOPPED Tejun Heo
2011-01-17 22:17 ` Roland McGrath
2011-01-27 13:13 ` Tejun Heo
2010-12-24 14:00 ` [PATCH 2/7] ptrace: add @why to ptrace_stop() Tejun Heo
2010-12-24 14:00 ` [PATCH 3/7] signal: fix premature completion of group stop when interfered by ptrace Tejun Heo
2010-12-24 14:00 ` [PATCH 4/7] signal: use GROUP_STOP_PENDING to stop once for a single group stop Tejun Heo
2010-12-24 14:00 ` [PATCH 5/7] ptrace: participate in group stop from ptrace_stop() iff the task is trapping for " Tejun Heo
2010-12-24 14:00 ` [PATCH 6/7] ptrace: make do_signal_stop() use ptrace_stop() if the task is being ptraced Tejun Heo
2010-12-24 14:00 ` [PATCH 7/7] ptrace: clean transitions between TASK_STOPPED and TRACED Tejun Heo
2011-01-05 16:35 ` Oleg Nesterov
2011-01-09 22:05 ` Tejun Heo
2011-01-13 16:03 ` Jan Kratochvil
2011-01-12 13:23 ` [PATCHSET RFC] ptrace,signal: clean transition between STOPPED " Tejun Heo
2011-01-12 18:10 ` Roland McGrath
2011-01-12 21:43 ` Jan Kratochvil
2011-01-13 15:05 ` Tejun Heo [this message]
2011-01-13 15:51 ` Oleg Nesterov
2011-01-18 2:11 ` Roland McGrath
2011-01-27 13:23 ` Tejun Heo
2011-01-28 21:06 ` Roland McGrath
2011-01-18 2:14 ` Roland McGrath
2011-01-27 15:46 ` Tejun Heo
2011-01-27 17:48 ` Tejun Heo
2011-01-28 20:40 ` Roland McGrath
2011-01-31 15:41 ` Tejun Heo
2011-01-31 15:54 ` Oleg Nesterov
2011-01-31 16:07 ` Tejun Heo
2011-02-01 10:35 ` Tejun Heo
2011-02-02 5:39 ` Roland McGrath
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=20110113150501.GA12596@htj.dyndns.org \
--to=tj@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=jan.kratochvil@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=roland@redhat.com \
--cc=torvalds@linux-foundation.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