When the trace output goes to separate files (-ff) each process needs to
maintain its own print column.

Andreas.

>From ccdff481c086611488c5df70550fcf8fe907e7af Mon Sep 17 00:00:00 2001
From: Andreas Schwab <sch...@redhat.com>
Date: Tue, 27 Oct 2009 16:27:13 +0100
Subject: [PATCH] Maintain separate print column for each process

* defs.h (struct tcp): Add curcol.
* strace.c: (alloc_tcb): Initialize it.
(trace): Use curcol from current process and save it before
continuing.
(tprintf): Don't modify curcol on output error.
---
 defs.h   |    1 +
 strace.c |   19 +++++++++++++------
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/defs.h b/defs.h
index e5e920b..5bcaa07 100644
--- a/defs.h
+++ b/defs.h
@@ -321,6 +321,7 @@ struct tcb {
        long long u_lrval;      /* long long return value */
 #endif
        FILE *outf;             /* Output file for this process */
+       int curcol;             /* Output column for this process */
        const char *auxstr;     /* Auxiliary info from syscall (see RVAL_STR) */
        struct timeval stime;   /* System time usage as of last process wait */
        struct timeval dtime;   /* Delta for system time usage */
diff --git a/strace.c b/strace.c
index 6765ba3..7294e8e 100644
--- a/strace.c
+++ b/strace.c
@@ -113,6 +113,7 @@ int acolumn = DEFAULT_ACOLUMN;
 int max_strlen = DEFAULT_STRLEN;
 static char *outfname = NULL;
 FILE *outf;
+static int curcol;
 struct tcb **tcbtab;
 unsigned int nprocs, tcbtabsize;
 char *progname;
@@ -1016,6 +1017,7 @@ alloc_tcb(int pid, int command_options_parsed)
 #endif
                        tcp->flags = TCB_INUSE | TCB_STARTUP;
                        tcp->outf = outf; /* Initialise to current out file */
+                       tcp->curcol = 0;
                        tcp->stime.tv_sec = 0;
                        tcp->stime.tv_usec = 0;
                        tcp->pfd = -1;
@@ -2109,6 +2111,7 @@ trace()
 
                /* set current output file */
                outf = tcp->outf;
+               curcol = tcp->curcol;
 
                if (cflag) {
                        struct timeval stime;
@@ -2185,6 +2188,8 @@ trace()
                        exit(1);
                        break;
                }
+               /* Remember current print column before continuing. */
+               tcp->curcol = curcol;
                arg = 0;
 #ifndef FREEBSD
                if (IOCTL (tcp->pfd, PIOCRUN, &arg) < 0) {
@@ -2375,6 +2380,7 @@ Process %d attached (waiting for parent)\n",
                }
                /* set current output file */
                outf = tcp->outf;
+               curcol = tcp->curcol;
                if (cflag) {
 #ifdef LINUX
                        tv_sub(&tcp->dtime, &ru.ru_stime, &tcp->stime);
@@ -2593,6 +2599,8 @@ Process %d attached (waiting for parent)\n",
                        continue;
                }
        tracing:
+               /* Remember current print column before continuing. */
+               tcp->curcol = curcol;
                if (ptrace_restart(PTRACE_SYSCALL, tcp, 0) < 0) {
                        cleanup();
                        return -1;
@@ -2603,8 +2611,6 @@ Process %d attached (waiting for parent)\n",
 
 #endif /* !USE_PROCFS */
 
-static int curcol;
-
 #ifdef __STDC__
 #include <stdarg.h>
 #define VA_START(a, b) va_start(a, b)
@@ -2627,10 +2633,11 @@ va_dcl
        VA_START(args, fmt);
        if (outf) {
                int n = vfprintf(outf, fmt, args);
-               if (n < 0 && outf != stderr)
-                       perror(outfname == NULL
-                              ? "<writing to pipe>" : outfname);
-               else
+               if (n < 0) {
+                       if (outf != stderr)
+                               perror(outfname == NULL
+                                      ? "<writing to pipe>" : outfname);
+               } else
                        curcol += n;
        }
        va_end(args);
-- 
1.6.5.1


-- 
Andreas Schwab, sch...@redhat.com
GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84  5EC7 45C6 250E 6F00 984E
"And now for something completely different."

------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to