[PATCH] stacktrace: print real address of trace entries

From: Haesung Kim
Date: Fri Sep 04 2020 - 06:32:24 EST


If function is marked as static and compiler decies to lnline function
with or without inline keyword, the function has no symbol.
We just know symbol located near the address of the inline function
by %pS type that shows symbol and offset. But we don't know function
name.
The real address let us extract the function name and location of
source code by debugging tools such as addr2line. This is helpful to
debug.

Signed-off-by: Haesung Kim <matia.kim@xxxxxxx>
---
kernel/stacktrace.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c
index 946f44a..b7168c5 100644
--- a/kernel/stacktrace.c
+++ b/kernel/stacktrace.c
@@ -24,12 +24,15 @@ void stack_trace_print(const unsigned long *entries, unsigned int nr_entries,
int spaces)
{
unsigned int i;
+ unsigned long ip;

if (WARN_ON(!entries))
return;

for (i = 0; i < nr_entries; i++)
- printk("%*c%pS\n", 1 + spaces, ' ', (void *)entries[i]);
+ ip = entries[i];
+ printk("%*c[<%px>] %pS\n",
+ 1 + spaces, ' ', (void *) ip, (void *) ip);
}
EXPORT_SYMBOL_GPL(stack_trace_print);

@@ -47,13 +50,15 @@ int stack_trace_snprint(char *buf, size_t size, const unsigned long *entries,
unsigned int nr_entries, int spaces)
{
unsigned int generated, i, total = 0;
+ unsigned long ip;

if (WARN_ON(!entries))
return 0;

for (i = 0; i < nr_entries && size; i++) {
- generated = snprintf(buf, size, "%*c%pS\n", 1 + spaces, ' ',
- (void *)entries[i]);
+ ip = entries[i];
+ generated = snprintf(buf, size, "%*c[<%px>] %pS\n",
+ 1 + spaces, ' ', (void *) ip, (void *) ip);

total += generated;
if (generated >= size) {
--
2.7.4