[PATCH] combining -c and regular output (repost from August 2009)

Dmitry V. Levin ldv at altlinux.org
Mon Mar 29 01:10:50 UTC 2010


Hi,

On Sun, Mar 28, 2010 at 02:39:38PM +0100, Adrien Kunysz wrote:
> Back in August I posted this patch that implements a new -C option. I
> got some feedback and reworked the patch accordingly but I got no follow
> up after the third iteration. Can you please consider this again or tell
> me what's wrong with this? This version applies cleanly against the
> current master branch.
> 
> This combine regular output with -c. I would find that useful to be
> integrated in the master branch in order to get rid of some custom,
> unreliable scripts I (and doubtlessy others) use to analyze regular
> strace output.

The patch looked OK, but, unfortunately, only after the first glance.
There are a lot of severe problems in trace_syscall() part of it.
You can find a fixed patch at
http://strace.git.sourceforge.net/git/gitweb.cgi?p=strace/strace;a=commitdiff;h=ldv/option-C

I had to apply these changes on top of your patch:
--- a/count.c
+++ b/count.c
@@ -50,7 +50,6 @@ static struct timeval shortest = { 1000000, 0 };
 int
 count_syscall(struct tcb *tcp, struct timeval *tv)
 {
-	tcp->flags &= ~TCB_INSYSCALL;
 	if (tcp->scno < 0 || tcp->scno >= nsyscalls)
 		return 0;
 
--- a/strace.1
+++ b/strace.1
@@ -244,7 +244,9 @@ running in the kernel) independent of wall clock time.  If -c is used with
 -f or -F (below), only aggregate totals for all traced processes are kept.
 .TP
 .B \-C
-Like -c but also print regular output while processes are running.
+Like
+.B \-c
+but also print regular output while processes are running.
 .TP
 .B \-d
 Show some debugging output of
--- a/strace.c
+++ b/strace.c
@@ -727,12 +727,20 @@ main(int argc, char *argv[])
 		"a:e:o:O:p:s:S:u:E:")) != EOF) {
 		switch (c) {
 		case 'c':
+			if (cflag == CFLAG_BOTH) {
+				fprintf(stderr, "%s: -c and -C are mutually exclusive options\n",
+					progname);
+				exit(1);
+			}
 			cflag = CFLAG_ONLY_STATS;
-			dtime++;
 			break;
 		case 'C':
+			if (cflag == CFLAG_ONLY_STATS) {
+				fprintf(stderr, "%s: -c and -C are mutually exclusive options\n",
+					progname);
+				exit(1);
+			}
 			cflag = CFLAG_BOTH;
-			dtime++;
 			break;
 		case 'd':
 			debug++;
@@ -843,8 +851,7 @@ main(int argc, char *argv[])
 
 	if (followfork > 1 && cflag) {
 		fprintf(stderr,
-			"%s: (-c or -C) and -ff are mutually exclusive options"
-			"\n",
+			"%s: (-c or -C) and -ff are mutually exclusive options\n",
 			progname);
 		exit(1);
 	}
--- a/syscall.c
+++ b/syscall.c
@@ -2369,7 +2369,7 @@ trace_syscall(struct tcb *tcp)
 		long u_error;
 
 		/* Measure the exit time as early as possible to avoid errors. */
-		if (dtime)
+		if (dtime || cflag)
 			gettimeofday(&tv, NULL);
 
 		/* BTW, why we don't just memorize syscall no. on entry
@@ -2408,9 +2408,12 @@ trace_syscall(struct tcb *tcp)
 		}
 
 		if (cflag) {
-			res = count_syscall(tcp, &tv);
-			if (cflag == CFLAG_ONLY_STATS) {
-				return res;
+			struct timeval t = tv;
+			int rc = count_syscall(tcp, &t);
+			if (cflag == CFLAG_ONLY_STATS)
+			{
+				tcp->flags &= ~TCB_INSYSCALL;
+				return rc;
 			}
 		}
 
@@ -2652,8 +2655,8 @@ trace_syscall(struct tcb *tcp)
 	}
 
 	if (cflag == CFLAG_ONLY_STATS) {
-		gettimeofday(&tcp->etime, NULL);
 		tcp->flags |= TCB_INSYSCALL;
+		gettimeofday(&tcp->etime, NULL);
 		return 0;
 	}


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20100329/d44584bb/attachment.bin>


More information about the Strace-devel mailing list