[Concept,10/10] backtrace: Strip the source tree prefix from filenames

Message ID 20251129080014.758001-11-sjg@u-boot.org
State New
Headers
Series backtrace: Add runtime support for looking at the backtrace |

Commit Message

Simon Glass Nov. 29, 2025, 7:59 a.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Display relative paths instead of absolute paths in backtrace output,
making the output cleaner and more portable across different build
environments.

This works by adding a SRCTREE define to lib/backtrace.c and stripping
it from filenames when printing.

Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 doc/usage/cmd/backtrace.rst | 18 +++++++++---------
 lib/Makefile                |  1 +
 lib/backtrace.c             | 17 ++++++++++++++++-
 test/cmd/backtrace.c        |  7 ++++++-
 4 files changed, 32 insertions(+), 11 deletions(-)
  

Patch

diff --git a/doc/usage/cmd/backtrace.rst b/doc/usage/cmd/backtrace.rst
index 37acb0b3067..edee54ccf22 100644
--- a/doc/usage/cmd/backtrace.rst
+++ b/doc/usage/cmd/backtrace.rst
@@ -29,15 +29,15 @@  Example
 
     => backtrace
     backtrace: 14 addresses
-      backtrace_show() at /home/user/u-boot/lib/backtrace.c:17
-      do_backtrace() at /home/user/u-boot/cmd/backtrace.c:18
-      cmd_process() at /home/user/u-boot/common/command.c:637
-      run_list_real() at /home/user/u-boot/common/cli_hush.c:1868
-      parse_stream_outer() at /home/user/u-boot/common/cli_hush.c:3207
-      parse_string_outer() at /home/user/u-boot/common/cli_hush.c:3257
-      run_command_list() at /home/user/u-boot/common/cli.c:168
-      sandbox_main_loop_init() at /home/user/u-boot/arch/sandbox/cpu/start.c:153
-      board_init_r() at /home/user/u-boot/common/board_r.c:774
+      backtrace_show() at lib/backtrace.c:18
+      do_backtrace() at cmd/backtrace.c:17
+      cmd_process() at common/command.c:637
+      run_list_real() at common/cli_hush.c:1868
+      parse_stream_outer() at common/cli_hush.c:3207
+      parse_string_outer() at common/cli_hush.c:3257
+      run_command_list() at common/cli.c:168
+      sandbox_main_loop_init() at arch/sandbox/cpu/start.c:153
+      board_init_r() at common/board_r.c:774
       ...
 
 Configuration
diff --git a/lib/Makefile b/lib/Makefile
index b696e81c496..15a43b2cc5e 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -148,6 +148,7 @@  obj-$(CONFIG_LIB_UUID) += uuid.o
 obj-$(CONFIG_LIB_RAND) += rand.o
 obj-y += panic.o
 obj-$(CONFIG_BACKTRACE) += backtrace.o
+CFLAGS_backtrace.o += -DSRCTREE='"$(srctree)/"'
 
 ifeq ($(CONFIG_XPL_BUILD),y)
 # SPL U-Boot may use full-printf, tiny-printf or none at all
diff --git a/lib/backtrace.c b/lib/backtrace.c
index e3d93b80b8a..715d7d1d05e 100644
--- a/lib/backtrace.c
+++ b/lib/backtrace.c
@@ -8,6 +8,21 @@ 
 
 #include <backtrace.h>
 #include <stdio.h>
+#include <string.h>
+
+static void print_sym(const char *sym)
+{
+	const char *p;
+
+	/* Look for SRCTREE prefix in the string and skip it */
+	p = strstr(sym, SRCTREE);
+	if (p) {
+		/* Print part before SRCTREE, then the rest after SRCTREE */
+		printf("  %.*s%s\n", (int)(p - sym), sym, p + strlen(SRCTREE));
+	} else {
+		printf("  %s\n", sym);
+	}
+}
 
 int backtrace_show(void)
 {
@@ -29,7 +44,7 @@  int backtrace_show(void)
 	printf("backtrace: %d addresses\n", ctx.count);
 	for (i = 0; i < ctx.count; i++) {
 		if (ctx.syms[i])
-			printf("  %s\n", ctx.syms[i]);
+			print_sym(ctx.syms[i]);
 		else
 			printf("  %p\n", ctx.addrs[i]);
 	}
diff --git a/test/cmd/backtrace.c b/test/cmd/backtrace.c
index 2d999e20f31..9d55c74769e 100644
--- a/test/cmd/backtrace.c
+++ b/test/cmd/backtrace.c
@@ -14,9 +14,14 @@ 
 /* Test 'backtrace' command */
 static int cmd_test_backtrace(struct unit_test_state *uts)
 {
-	/* for now, just run the command */
 	ut_assertok(run_command("backtrace", 0));
 
+	ut_assert_nextlinen("backtrace:");
+	ut_assert_nextlinen("  backtrace_show() at lib/backtrace.c:");
+	ut_assert_nextlinen("  do_backtrace() at cmd/backtrace.c:");
+	ut_assert_nextlinen("  cmd_process() at common/command.c:");
+	ut_assert_skip_to_linen("  cmd_test_backtrace() at test/cmd/backtrace.c:");
+
 	return 0;
 }
 DM_TEST(cmd_test_backtrace, UTF_SCAN_FDT);