Commit 5e2485b1 authored by David Ahern's avatar David Ahern Committed by Arnaldo Carvalho de Melo

perf trace: Add record option

The record option is a convience alias to include the -e raw_syscalls:*
argument to perf-record. All other options are passed to perf-record's
handler. Resulting data file can be analyzed by perf-trace -i.
Signed-off-by: default avatarDavid Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1380395584-9025-5-git-send-email-dsahern@gmail.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 8fb598e5
...@@ -9,6 +9,7 @@ SYNOPSIS ...@@ -9,6 +9,7 @@ SYNOPSIS
-------- --------
[verse] [verse]
'perf trace' 'perf trace'
'perf trace record'
DESCRIPTION DESCRIPTION
----------- -----------
...@@ -16,9 +17,14 @@ This command will show the events associated with the target, initially ...@@ -16,9 +17,14 @@ This command will show the events associated with the target, initially
syscalls, but other system events like pagefaults, task lifetime events, syscalls, but other system events like pagefaults, task lifetime events,
scheduling events, etc. scheduling events, etc.
Initially this is a live mode only tool, but eventually will work with This is a live mode tool in addition to working with perf.data files like
perf.data files like the other tools, allowing a detached 'record' from the other perf tools. Files can be generated using the 'perf record' command
analysis phases. but the session needs to include the raw_syscalls events (-e 'raw_syscalls:*').
Alernatively, the 'perf trace record' can be used as a shortcut to
automatically include the raw_syscalls events when writing events to a file.
The following options apply to perf trace; options to perf trace record are
found in the perf record man page.
OPTIONS OPTIONS
------- -------
......
...@@ -1501,6 +1501,33 @@ static int parse_target_str(struct trace *trace) ...@@ -1501,6 +1501,33 @@ static int parse_target_str(struct trace *trace)
return 0; return 0;
} }
static int trace__record(int argc, const char **argv)
{
unsigned int rec_argc, i, j;
const char **rec_argv;
const char * const record_args[] = {
"record",
"-R",
"-m", "1024",
"-c", "1",
"-e", "raw_syscalls:sys_enter,raw_syscalls:sys_exit",
};
rec_argc = ARRAY_SIZE(record_args) + argc;
rec_argv = calloc(rec_argc + 1, sizeof(char *));
if (rec_argv == NULL)
return -ENOMEM;
for (i = 0; i < ARRAY_SIZE(record_args); i++)
rec_argv[i] = record_args[i];
for (j = 0; j < (unsigned int)argc; j++, i++)
rec_argv[i] = argv[j];
return cmd_record(i, rec_argv, NULL);
}
static int trace__run(struct trace *trace, int argc, const char **argv) static int trace__run(struct trace *trace, int argc, const char **argv)
{ {
struct perf_evlist *evlist = perf_evlist__new(); struct perf_evlist *evlist = perf_evlist__new();
...@@ -1788,6 +1815,8 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -1788,6 +1815,8 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
const char * const trace_usage[] = { const char * const trace_usage[] = {
"perf trace [<options>] [<command>]", "perf trace [<options>] [<command>]",
"perf trace [<options>] -- <command> [<options>]", "perf trace [<options>] -- <command> [<options>]",
"perf trace record [<options>] [<command>]",
"perf trace record [<options>] -- <command> [<options>]",
NULL NULL
}; };
struct trace trace = { struct trace trace = {
...@@ -1844,6 +1873,9 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -1844,6 +1873,9 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
int err; int err;
char bf[BUFSIZ]; char bf[BUFSIZ];
if ((argc > 1) && (strcmp(argv[1], "record") == 0))
return trace__record(argc-2, &argv[2]);
argc = parse_options(argc, argv, trace_options, trace_usage, 0); argc = parse_options(argc, argv, trace_options, trace_usage, 0);
if (output_name != NULL) { if (output_name != NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment