diff options
Diffstat (limited to 'tools/perf/builtin-script.c')
| -rw-r--r-- | tools/perf/builtin-script.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index c046e6e8600a..b45b09c13f7a 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c | |||
| @@ -19,6 +19,7 @@ static bool debug_mode; | |||
| 19 | static u64 last_timestamp; | 19 | static u64 last_timestamp; |
| 20 | static u64 nr_unordered; | 20 | static u64 nr_unordered; |
| 21 | extern const struct option record_options[]; | 21 | extern const struct option record_options[]; |
| 22 | static bool no_callchain; | ||
| 22 | 23 | ||
| 23 | enum perf_output_field { | 24 | enum perf_output_field { |
| 24 | PERF_OUTPUT_COMM = 1U << 0, | 25 | PERF_OUTPUT_COMM = 1U << 0, |
| @@ -28,6 +29,7 @@ enum perf_output_field { | |||
| 28 | PERF_OUTPUT_CPU = 1U << 4, | 29 | PERF_OUTPUT_CPU = 1U << 4, |
| 29 | PERF_OUTPUT_EVNAME = 1U << 5, | 30 | PERF_OUTPUT_EVNAME = 1U << 5, |
| 30 | PERF_OUTPUT_TRACE = 1U << 6, | 31 | PERF_OUTPUT_TRACE = 1U << 6, |
| 32 | PERF_OUTPUT_SYM = 1U << 7, | ||
| 31 | }; | 33 | }; |
| 32 | 34 | ||
| 33 | struct output_option { | 35 | struct output_option { |
| @@ -41,6 +43,7 @@ struct output_option { | |||
| 41 | {.str = "cpu", .field = PERF_OUTPUT_CPU}, | 43 | {.str = "cpu", .field = PERF_OUTPUT_CPU}, |
| 42 | {.str = "event", .field = PERF_OUTPUT_EVNAME}, | 44 | {.str = "event", .field = PERF_OUTPUT_EVNAME}, |
| 43 | {.str = "trace", .field = PERF_OUTPUT_TRACE}, | 45 | {.str = "trace", .field = PERF_OUTPUT_TRACE}, |
| 46 | {.str = "sym", .field = PERF_OUTPUT_SYM}, | ||
| 44 | }; | 47 | }; |
| 45 | 48 | ||
| 46 | /* default set to maintain compatibility with current format */ | 49 | /* default set to maintain compatibility with current format */ |
| @@ -65,6 +68,8 @@ static void print_sample_start(struct perf_sample *sample, | |||
| 65 | if (PRINT_FIELD(COMM)) { | 68 | if (PRINT_FIELD(COMM)) { |
| 66 | if (latency_format) | 69 | if (latency_format) |
| 67 | printf("%8.8s ", thread->comm); | 70 | printf("%8.8s ", thread->comm); |
| 71 | else if (PRINT_FIELD(SYM) && symbol_conf.use_callchain) | ||
| 72 | printf("%s ", thread->comm); | ||
| 68 | else | 73 | else |
| 69 | printf("%16s ", thread->comm); | 74 | printf("%16s ", thread->comm); |
| 70 | } | 75 | } |
| @@ -112,6 +117,14 @@ static void process_event(union perf_event *event __unused, | |||
| 112 | print_trace_event(sample->cpu, sample->raw_data, | 117 | print_trace_event(sample->cpu, sample->raw_data, |
| 113 | sample->raw_size); | 118 | sample->raw_size); |
| 114 | 119 | ||
| 120 | if (PRINT_FIELD(SYM)) { | ||
| 121 | if (!symbol_conf.use_callchain) | ||
| 122 | printf(" "); | ||
| 123 | else | ||
| 124 | printf("\n"); | ||
| 125 | perf_session__print_symbols(event, sample, session); | ||
| 126 | } | ||
| 127 | |||
| 115 | printf("\n"); | 128 | printf("\n"); |
| 116 | } | 129 | } |
| 117 | 130 | ||
| @@ -190,7 +203,10 @@ static int process_sample_event(union perf_event *event, | |||
| 190 | 203 | ||
| 191 | static struct perf_event_ops event_ops = { | 204 | static struct perf_event_ops event_ops = { |
| 192 | .sample = process_sample_event, | 205 | .sample = process_sample_event, |
| 206 | .mmap = perf_event__process_mmap, | ||
| 193 | .comm = perf_event__process_comm, | 207 | .comm = perf_event__process_comm, |
| 208 | .exit = perf_event__process_task, | ||
| 209 | .fork = perf_event__process_task, | ||
| 194 | .attr = perf_event__process_attr, | 210 | .attr = perf_event__process_attr, |
| 195 | .event_type = perf_event__process_event_type, | 211 | .event_type = perf_event__process_event_type, |
| 196 | .tracing_data = perf_event__process_tracing_data, | 212 | .tracing_data = perf_event__process_tracing_data, |
| @@ -722,8 +738,16 @@ static const struct option options[] = { | |||
| 722 | "input file name"), | 738 | "input file name"), |
| 723 | OPT_BOOLEAN('d', "debug-mode", &debug_mode, | 739 | OPT_BOOLEAN('d', "debug-mode", &debug_mode, |
| 724 | "do various checks like samples ordering and lost events"), | 740 | "do various checks like samples ordering and lost events"), |
| 741 | OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name, | ||
| 742 | "file", "vmlinux pathname"), | ||
| 743 | OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name, | ||
| 744 | "file", "kallsyms pathname"), | ||
| 745 | OPT_BOOLEAN('G', "hide-call-graph", &no_callchain, | ||
| 746 | "When printing symbols do not display call chain"), | ||
| 747 | OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory", | ||
| 748 | "Look for files with symbols relative to this directory"), | ||
| 725 | OPT_CALLBACK('f', "fields", NULL, "str", | 749 | OPT_CALLBACK('f', "fields", NULL, "str", |
| 726 | "comma separated output fields. Options: comm,tid,pid,time,cpu,event,trace", | 750 | "comma separated output fields. Options: comm,tid,pid,time,cpu,event,trace,sym", |
| 727 | parse_output_fields), | 751 | parse_output_fields), |
| 728 | 752 | ||
| 729 | OPT_END() | 753 | OPT_END() |
| @@ -905,6 +929,11 @@ int cmd_script(int argc, const char **argv, const char *prefix __used) | |||
| 905 | if (session == NULL) | 929 | if (session == NULL) |
| 906 | return -ENOMEM; | 930 | return -ENOMEM; |
| 907 | 931 | ||
| 932 | if (!no_callchain && (session->sample_type & PERF_SAMPLE_CALLCHAIN)) | ||
| 933 | symbol_conf.use_callchain = true; | ||
| 934 | else | ||
| 935 | symbol_conf.use_callchain = false; | ||
| 936 | |||
| 908 | if (strcmp(input_name, "-") && | 937 | if (strcmp(input_name, "-") && |
| 909 | !perf_session__has_traces(session, "record -R")) | 938 | !perf_session__has_traces(session, "record -R")) |
| 910 | return -EINVAL; | 939 | return -EINVAL; |
