From: "Steven Rostedt (VMware)" <rost...@goodmis.org>

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.stoya...@gmail.com

Signed-off-by: Steven Rostedt (VMware) <rost...@goodmis.org>
[ Ported from trace-cmd.git ]
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoya...@gmail.com>
Signed-off-by: Steven Rostedt (VMware) <rost...@goodmis.org>
---
 .../lib/traceevent/plugins/plugin_function.c  | 24 +++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/tools/lib/traceevent/plugins/plugin_function.c 
b/tools/lib/traceevent/plugins/plugin_function.c
index 7770fcb78e0f..cafddd6be983 100644
--- a/tools/lib/traceevent/plugins/plugin_function.c
+++ b/tools/lib/traceevent/plugins/plugin_function.c
@@ -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);
        }
-- 
2.26.2


Reply via email to