diff options
author | Jim Cromie <jim.cromie@gmail.com> | 2011-09-08 01:14:00 +0200 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-09-29 22:03:23 +0200 |
commit | 56f3bae70638b33477a6015fd362ccfe354fd3ee (patch) | |
tree | 27f0a07cf5662f742e07f001c66ae9cf8f59d209 /tools/perf/builtin-stat.c | |
parent | perf top: Improve lost events warning (diff) | |
download | linux-56f3bae70638b33477a6015fd362ccfe354fd3ee.tar.xz linux-56f3bae70638b33477a6015fd362ccfe354fd3ee.zip |
perf stat: Add --log-fd <N> option to redirect stderr elsewhere
This perf stat option emulates valgrind's --log-fd option, allowing the
user to send perf results elsewhere, and leaving stderr for use by the
program under test. This complements --output file option, and is
mutually exclusive with it.
3>results perf stat --log-fd 3 -- $cmd
3>>results perf stat --log-fd 3 --append -- $cmd
The perl distro's make test.valgrind target uses valgrind's --log-fd
option, I've adapted it to invoke perf also, and tested this patch
there.
Link: http://lkml.kernel.org/r/1315437244-3788-2-git-send-email-jim.cromie@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-stat.c')
-rw-r--r-- | tools/perf/builtin-stat.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index bec64a9e741c..a43c68051078 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -196,6 +196,7 @@ static bool csv_output = false; static bool group = false; static const char *output_name = NULL; static FILE *output = NULL; +static int output_fd; static volatile int done = 0; @@ -1080,6 +1081,8 @@ static const struct option options[] = { OPT_STRING('o', "output", &output_name, "file", "output file name"), OPT_BOOLEAN(0, "append", &append_file, "append to the output file"), + OPT_INTEGER(0, "log-fd", &output_fd, + "log output to fd, instead of stderr"), OPT_END() }; @@ -1166,6 +1169,10 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) if (output_name && strcmp(output_name, "-")) output = NULL; + if (output_name && output_fd) { + fprintf(stderr, "cannot use both --output and --log-fd\n"); + usage_with_options(stat_usage, options); + } if (!output) { struct timespec tm; mode = append_file ? "a" : "w"; @@ -1177,6 +1184,13 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) } clock_gettime(CLOCK_REALTIME, &tm); fprintf(output, "# started on %s\n", ctime(&tm.tv_sec)); + } else if (output_fd != 2) { + mode = append_file ? "a" : "w"; + output = fdopen(output_fd, mode); + if (!output) { + perror("Failed opening logfd"); + return -errno; + } } if (csv_sep) |