diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2011-03-18 16:48:37 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2011-03-18 16:48:37 -0400 |
| commit | 3e8b5b82568a325b6e2e218cd8f18e62ea3fa814 (patch) | |
| tree | 4673dc842392a807591b97b7b740192674586724 | |
| parent | 9b66956cb4660bd49983482c3529ca069fa97b3e (diff) | |
trace-cmd: Add ftrace options with fgraph tailprint option
Added internal options for ftrace, and included a fgraph:tailprint
option that will print the function names at the function exit.
When the option is set, instead of just '}' the name will
be added '} /* func_name */'
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
| -rw-r--r-- | trace-cmd.h | 2 | ||||
| -rw-r--r-- | trace-ftrace.c | 25 | ||||
| -rw-r--r-- | trace-input.c | 3 | ||||
| -rw-r--r-- | trace-util.c | 50 |
4 files changed, 66 insertions, 14 deletions
diff --git a/trace-cmd.h b/trace-cmd.h index b8137b5..cec0072 100644 --- a/trace-cmd.h +++ b/trace-cmd.h | |||
| @@ -207,6 +207,8 @@ void tracecmd_stop_recording(struct tracecmd_recorder *recorder); | |||
| 207 | void tracecmd_stat_cpu(struct trace_seq *s, int cpu); | 207 | void tracecmd_stat_cpu(struct trace_seq *s, int cpu); |
| 208 | 208 | ||
| 209 | /* --- Plugin handling --- */ | 209 | /* --- Plugin handling --- */ |
| 210 | extern struct plugin_option trace_ftrace_options[]; | ||
| 211 | |||
| 210 | void trace_util_add_option(const char *name, const char *val); | 212 | void trace_util_add_option(const char *name, const char *val); |
| 211 | void trace_util_load_plugins(struct pevent *pevent, const char *suffix, | 213 | void trace_util_load_plugins(struct pevent *pevent, const char *suffix, |
| 212 | void (*load_plugin)(struct pevent *pevent, | 214 | void (*load_plugin)(struct pevent *pevent, |
diff --git a/trace-ftrace.c b/trace-ftrace.c index 193e85d..76aef5b 100644 --- a/trace-ftrace.c +++ b/trace-ftrace.c | |||
| @@ -25,6 +25,20 @@ | |||
| 25 | 25 | ||
| 26 | #include "trace-cmd.h" | 26 | #include "trace-cmd.h" |
| 27 | 27 | ||
| 28 | struct plugin_option trace_ftrace_options[] = { | ||
| 29 | { | ||
| 30 | .name = "tailprint", | ||
| 31 | .plugin_alias = "fgraph", | ||
| 32 | .description = | ||
| 33 | "Print function name at function exit in function graph", | ||
| 34 | }, | ||
| 35 | { | ||
| 36 | .name = NULL, | ||
| 37 | } | ||
| 38 | }; | ||
| 39 | |||
| 40 | static struct plugin_option *fgraph_tail = &trace_ftrace_options[0]; | ||
| 41 | |||
| 28 | static void find_long_size(struct tracecmd_ftrace *finfo) | 42 | static void find_long_size(struct tracecmd_ftrace *finfo) |
| 29 | { | 43 | { |
| 30 | finfo->long_size = tracecmd_long_size(finfo->handle); | 44 | finfo->long_size = tracecmd_long_size(finfo->handle); |
| @@ -290,6 +304,8 @@ fgraph_ret_handler(struct trace_seq *s, struct record *record, | |||
| 290 | struct tracecmd_ftrace *finfo = context; | 304 | struct tracecmd_ftrace *finfo = context; |
| 291 | unsigned long long rettime, calltime; | 305 | unsigned long long rettime, calltime; |
| 292 | unsigned long long duration, depth; | 306 | unsigned long long duration, depth; |
| 307 | unsigned long long val; | ||
| 308 | const char *func; | ||
| 293 | int i; | 309 | int i; |
| 294 | 310 | ||
| 295 | ret_event_check(finfo, event->pevent); | 311 | ret_event_check(finfo, event->pevent); |
| @@ -317,6 +333,15 @@ fgraph_ret_handler(struct trace_seq *s, struct record *record, | |||
| 317 | 333 | ||
| 318 | trace_seq_putc(s, '}'); | 334 | trace_seq_putc(s, '}'); |
| 319 | 335 | ||
| 336 | if (fgraph_tail->set) { | ||
| 337 | if (pevent_get_field_val(s, event, "func", record, &val, 0)) | ||
| 338 | return 0; | ||
| 339 | func = pevent_find_function(event->pevent, val); | ||
| 340 | if (!func) | ||
| 341 | return 0; | ||
| 342 | trace_seq_printf(s, " /* %s */", func); | ||
| 343 | } | ||
| 344 | |||
| 320 | return 0; | 345 | return 0; |
| 321 | } | 346 | } |
| 322 | 347 | ||
diff --git a/trace-input.c b/trace-input.c index c3b58b1..97459eb 100644 --- a/trace-input.c +++ b/trace-input.c | |||
| @@ -2173,6 +2173,9 @@ struct tracecmd_input *tracecmd_alloc_fd(int fd) | |||
| 2173 | /* register default ftrace functions first */ | 2173 | /* register default ftrace functions first */ |
| 2174 | tracecmd_ftrace_overrides(handle, &handle->finfo); | 2174 | tracecmd_ftrace_overrides(handle, &handle->finfo); |
| 2175 | 2175 | ||
| 2176 | /* Add the ftrace options */ | ||
| 2177 | trace_util_ftrace_options(); | ||
| 2178 | |||
| 2176 | handle->plugin_list = tracecmd_load_plugins(handle->pevent); | 2179 | handle->plugin_list = tracecmd_load_plugins(handle->pevent); |
| 2177 | 2180 | ||
| 2178 | handle->pevent->file_bigendian = buf[0]; | 2181 | handle->pevent->file_bigendian = buf[0]; |
diff --git a/trace-util.c b/trace-util.c index 04cb087..de59a3f 100644 --- a/trace-util.c +++ b/trace-util.c | |||
| @@ -61,6 +61,18 @@ struct plugin_list { | |||
| 61 | void *handle; | 61 | void *handle; |
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | static void update_option(const char *file, struct plugin_option *option); | ||
| 65 | |||
| 66 | void trace_util_ftrace_options(void) | ||
| 67 | { | ||
| 68 | struct plugin_option *options = trace_ftrace_options; | ||
| 69 | |||
| 70 | while (options->name) { | ||
| 71 | update_option("ftrace", options); | ||
| 72 | options++; | ||
| 73 | } | ||
| 74 | } | ||
| 75 | |||
| 64 | void trace_util_add_option(const char *name, const char *val) | 76 | void trace_util_add_option(const char *name, const char *val) |
| 65 | { | 77 | { |
| 66 | struct trace_plugin_options *option; | 78 | struct trace_plugin_options *option; |
| @@ -909,12 +921,28 @@ struct plugin_option_read { | |||
| 909 | struct plugin_option *options; | 921 | struct plugin_option *options; |
| 910 | }; | 922 | }; |
| 911 | 923 | ||
| 924 | static void append_option(struct plugin_option_read *options, | ||
| 925 | struct plugin_option *option, | ||
| 926 | const char *alias, void *handle) | ||
| 927 | { | ||
| 928 | struct plugin_option *op; | ||
| 929 | |||
| 930 | while (option->name) { | ||
| 931 | op = malloc_or_die(sizeof(*op)); | ||
| 932 | *op = *option; | ||
| 933 | op->next = options->options; | ||
| 934 | options->options = op; | ||
| 935 | op->file = strdup(alias); | ||
| 936 | op->handle = handle; | ||
| 937 | option++; | ||
| 938 | } | ||
| 939 | } | ||
| 940 | |||
| 912 | static void read_options(struct pevent *pevent, const char *path, | 941 | static void read_options(struct pevent *pevent, const char *path, |
| 913 | const char *file, void *data) | 942 | const char *file, void *data) |
| 914 | { | 943 | { |
| 915 | struct plugin_option_read *option = data; | 944 | struct plugin_option_read *options = data; |
| 916 | struct plugin_option *options; | 945 | struct plugin_option *option; |
| 917 | struct plugin_option *op; | ||
| 918 | const char *alias; | 946 | const char *alias; |
| 919 | int unload = 0; | 947 | int unload = 0; |
| 920 | char *plugin; | 948 | char *plugin; |
| @@ -937,21 +965,13 @@ static void read_options(struct pevent *pevent, const char *path, | |||
| 937 | if (!alias) | 965 | if (!alias) |
| 938 | alias = file; | 966 | alias = file; |
| 939 | 967 | ||
| 940 | options = dlsym(handle, PEVENT_PLUGIN_OPTIONS_NAME); | 968 | option = dlsym(handle, PEVENT_PLUGIN_OPTIONS_NAME); |
| 941 | if (!options) { | 969 | if (!option) { |
| 942 | unload = 1; | 970 | unload = 1; |
| 943 | goto out_unload; | 971 | goto out_unload; |
| 944 | } | 972 | } |
| 945 | 973 | ||
| 946 | while (options->name) { | 974 | append_option(options, option, alias, handle); |
| 947 | op = malloc_or_die(sizeof(*op)); | ||
| 948 | *op = *options; | ||
| 949 | op->next = option->options; | ||
| 950 | option->options = op; | ||
| 951 | op->file = strdup(alias); | ||
| 952 | op->handle = handle; | ||
| 953 | options++; | ||
| 954 | } | ||
| 955 | 975 | ||
| 956 | out_unload: | 976 | out_unload: |
| 957 | if (unload) | 977 | if (unload) |
| @@ -966,6 +986,8 @@ struct plugin_option *trace_util_read_plugin_options(void) | |||
| 966 | .options = NULL, | 986 | .options = NULL, |
| 967 | }; | 987 | }; |
| 968 | 988 | ||
| 989 | append_option(&option, trace_ftrace_options, "ftrace", NULL); | ||
| 990 | |||
| 969 | trace_util_load_plugins(NULL, ".so", read_options, &option); | 991 | trace_util_load_plugins(NULL, ".so", read_options, &option); |
| 970 | 992 | ||
| 971 | return option.options; | 993 | return option.options; |
