tools lib traceevent: Add offset option for function plugin
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Thu, 2 Jul 2020 18:53:54 +0000 (14:53 -0400)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 6 Jul 2020 12:01:12 +0000 (09:01 -0300)
When the offset option is set for the function plugin enabled, it will
display the offset of the functions along with their names.  This helps
in finding exactly where a function was called by its parent.

  trace-cmd report -O parent -O offset
 [..]
        rcuc/163-1330  [163]   740.653251: function: _raw_spin_lock+0x0  <-- rcu_cpu_kthread+0x4d8

Link: http://lore.kernel.org/linux-trace-devel/20200702174950.123454-2-tz.stoyanov@gmail.com
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
[ Ported from trace-cmd.git ]
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lore.kernel.org/lkml/20200702185704.986181512@goodmis.org
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/traceevent/plugins/plugin_function.c

index 7770fcb..cafddd6 100644 (file)
@@ -49,6 +49,13 @@ struct tep_plugin_option plugin_options[] =
                "Try to show function call indents, based on parents",
                .set = 1,
        },
+       {
+               .name = "offset",
+               .plugin_alias = "ftrace",
+               .description =
+               "Show function names as well as their offsets",
+               .set = 0,
+       },
        {
                .name = NULL,
        }
@@ -56,6 +63,7 @@ struct tep_plugin_option plugin_options[] =
 
 static struct tep_plugin_option *ftrace_parent = &plugin_options[0];
 static struct tep_plugin_option *ftrace_indent = &plugin_options[1];
+static struct tep_plugin_option *ftrace_offset = &plugin_options[2];
 
 static void add_child(struct func_stack *stack, const char *child, int pos)
 {
@@ -123,6 +131,18 @@ static int add_and_get_index(const char *parent, const char *child, int cpu)
        return 0;
 }
 
+static void show_function(struct trace_seq *s, struct tep_handle *tep,
+                         const char *func, unsigned long long function)
+{
+       unsigned long long offset;
+
+       trace_seq_printf(s, "%s", func);
+       if (ftrace_offset->set) {
+               offset = tep_find_function_address(tep, function);
+               trace_seq_printf(s, "+0x%x ", (int)(function - offset));
+       }
+}
+
 static int function_handler(struct trace_seq *s, struct tep_record *record,
                            struct tep_event *event, void *context)
 {
@@ -149,14 +169,14 @@ static int function_handler(struct trace_seq *s, struct tep_record *record,
        trace_seq_printf(s, "%*s", index*3, "");
 
        if (func)
-               trace_seq_printf(s, "%s", func);
+               show_function(s, tep, func, function);
        else
                trace_seq_printf(s, "0x%llx", function);
 
        if (ftrace_parent->set) {
                trace_seq_printf(s, " <-- ");
                if (parent)
-                       trace_seq_printf(s, "%s", parent);
+                       show_function(s, tep, parent, pfunction);
                else
                        trace_seq_printf(s, "0x%llx", pfunction);
        }