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