Don't consider PROG to be our child in "strace -D PROG" case

TCB_STRACE_CHILD is used for the case when "strace PROG" is ^C-ed
or something like that. strace should not just exit - it should
do something with its child (such as signal it too).

In -D case, PROG is not really a child of _strace_, it is a child
of strace's parent. It's ok to handle it exactly as an attached process.

While we are at it, remove nonsensical special-casing of TCB_STRACE_CHILD
in printing of "<unfinished ...>" message.

* strace.c (startup_attach): Don't set TCB_STRACE_CHILD if -D.
(trace): Print "<unfinished ...>" on error regardless of TCB_STRACE_CHILD.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2012-03-09 15:29:45 +01:00
parent 75fe85c2ee
commit f20250266e

View File

@ -581,11 +581,6 @@ startup_attach(void)
fprintf(stderr, "attach to pid %d (main) succeeded\n", tcp->pid);
if (daemonized_tracer) {
/*
* It is our grandparent we trace, not a -p PID.
* Don't want to just detach on exit, so...
*/
tcp->flags |= TCB_STRACE_CHILD;
/*
* Make parent go away.
* Also makes grandparent's wait() unblock.
@ -783,7 +778,8 @@ startup_child(char **argv)
strace_tracer_pid = getpid();
/* The tracee is our parent: */
pid = getppid();
tcp = alloctcb(pid);
alloctcb(pid);
/* attaching will be done later, by startup_attach */
}
}
@ -2012,28 +2008,21 @@ trace(void)
* Observed case: exit_group() terminating
* all processes in thread group.
*/
if (!(tcp->flags & TCB_STRACE_CHILD)) {
//TODO: why do we handle our child differently??
if (printing_tcp) {
/* Do we have dangling line "syscall(param, param"?
* Finish the line then.
*/
printing_tcp->flags |= TCB_REPRINT;
tprints(" <unfinished ...>\n");
printing_tcp = NULL;
fflush(tcp->outf);
}
/* We assume that ptrace error was caused by process death.
* We used to detach(tcp) here, but since we no longer
* implement "detach before death" policy/hack,
* we can let this process to report its death to us
* normally, via WIFEXITED or WIFSIGNALED wait status.
if (printing_tcp) {
/* Do we have dangling line "syscall(param, param"?
* Finish the line then.
*/
} else {
/* It's our real child (and we also trace it) */
/* my_tkill(pid, SIGKILL); - why? */
/* droptcb(tcp); - why? */
printing_tcp->flags |= TCB_REPRINT;
tprints(" <unfinished ...>\n");
printing_tcp = NULL;
fflush(tcp->outf);
}
/* We assume that ptrace error was caused by process death.
* We used to detach(tcp) here, but since we no longer
* implement "detach before death" policy/hack,
* we can let this process to report its death to us
* normally, via WIFEXITED or WIFSIGNALED wait status.
*/
continue;
}
restart_tracee_with_sig_0: