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:
parent
75fe85c2ee
commit
f20250266e
41
strace.c
41
strace.c
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user