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

The addresses of a stack trace event are relative to the kallsyms. As that
can change between boots, when printing the stack trace from a buffer that
was from the last boot, it needs all the addresses to be added to the
"text_delta" that gives the delta between the addresses of the functions
for the current boot compared to the address of the last boot. Then it can
be passed to kallsyms to find the function name, otherwise it just shows a
useless list of addresses.

Signed-off-by: Steven Rostedt (Google) <rost...@goodmis.org>
---
 kernel/trace/trace_output.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index b9d2c64c0648..48de93598897 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -1233,6 +1233,7 @@ static enum print_line_t trace_stack_print(struct 
trace_iterator *iter,
        struct trace_seq *s = &iter->seq;
        unsigned long *p;
        unsigned long *end;
+       long delta = iter->tr->text_delta;
 
        trace_assign_type(field, iter->ent);
        end = (unsigned long *)((long)iter->ent + iter->ent_size);
@@ -1245,7 +1246,7 @@ static enum print_line_t trace_stack_print(struct 
trace_iterator *iter,
                        break;
 
                trace_seq_puts(s, " => ");
-               seq_print_ip_sym(s, *p, flags);
+               seq_print_ip_sym(s, (*p) + delta, flags);
                trace_seq_putc(s, '\n');
        }
 
-- 
2.43.0



Reply via email to