]> granicus.if.org Git - strace/commitdiff
Don't consider PROG to be our child in "strace -D PROG" case
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 9 Mar 2012 14:29:45 +0000 (15:29 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 9 Mar 2012 14:29:45 +0000 (15:29 +0100)
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>
strace.c

index 26cf91faf509c2e83f7fe58151ef1245d5ef55ee..89a7dc9d3db5bd813b2ec4b1ef3edd9318013c4a 100644 (file)
--- a/strace.c
+++ b/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: