utrace-ptrace && detach with signal semantics

Jan Kratochvil jan.kratochvil at redhat.com
Mon Oct 5 18:39:47 UTC 2009


On Mon, 05 Oct 2009 04:51:32 +0200, Oleg Nesterov wrote:
> Currently, if a tracer does ptrace(DETACH, tracee, SIGXXX)
> and then another/same tracer does ptrace(ATTACH, tracee)
> then SIGXXX will not be reported to the new tracer.
> 
> Why?

Naive programs expect the first signal after PTRACE_ATTACH will be SIGSTOP.


> It is not trivial to implement, and I don't understand why
> it is important to keep this behaviour. But we have the test
> case which checks this: attach-into-signal.

This testcase is in fact PASSing even when non-SIGSTOP signal is sent as the
first one after PTRACE_ATTACH.  It has specific handling of such cases.

If it is the official goal we probably do not have a testcase for it.
AI: Approved to modify attach-into-signal to check it does not happen?


> Could you explain what can be breaked if SIGXXX will be reported
> to the next tracer (assuming the 2nd ATTACH is fast enough) ?

With a testcase looping in: void handler(int sig) { raise(sig); }:
the latest official GDB release (6.8) will:

Attaching to process 5412
linux-nat.c:988: internal-error: linux_nat_attach: Assertion `pid == GET_PID
(inferior_ptid) && WIFSTOPPED (status) && WSTOPSIG (status) == SIGSTOP'
failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) y


If they do not assertion check they will at least lose the pending signal
after the attach/detach pair.


> I do not think there is a "real life" application that does
> ATTACH + DETACH and relies on fact it must not see this sig.

I think FSF GDB is enough, isn't it?


Thanks,
Jan




More information about the utrace-devel mailing list