From patchwork Sat Nov 29 07:59:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 775 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1764403277; bh=olPsufoIktCea1+cE/oW/1RyUhaXB8dgaveM/eX4lx4=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=ilbT63J3cQuPRCsdkPPZkXLkDBdP3XwntTQgWWYyVljppPaRjJ0x/1D/JWye4fTra 4oYXxhcxAV45+AnG5kbRBPynHvUfU+XeYHl0oC3yBLnYP4EDRPtnm8djz/ABWa2wRb ghZLvJlTKkY7VqkdEXiiBLmd2MEyrKj9OuLBtzKRjpjskAKJ7q3E3JL6IAKV4lFrBQ +ucx/aPYx/XjtucsuYvJyTaMCM2S8p6aN9qa+h7fkmDjQ5vgEXEJIqoT0KKm2YfvF4 3dSrRav3BgEZqCfHuOh/xjJNzkE7ODEyLWM6uFMtndqYI94c3BsdC0NahXD4FqkTvg tJW5zta5CterQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 5A50B687CE for ; Sat, 29 Nov 2025 01:01:17 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id FJBzq7PO9GkU for ; Sat, 29 Nov 2025 01:01:17 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1764403277; bh=olPsufoIktCea1+cE/oW/1RyUhaXB8dgaveM/eX4lx4=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=ilbT63J3cQuPRCsdkPPZkXLkDBdP3XwntTQgWWYyVljppPaRjJ0x/1D/JWye4fTra 4oYXxhcxAV45+AnG5kbRBPynHvUfU+XeYHl0oC3yBLnYP4EDRPtnm8djz/ABWa2wRb ghZLvJlTKkY7VqkdEXiiBLmd2MEyrKj9OuLBtzKRjpjskAKJ7q3E3JL6IAKV4lFrBQ +ucx/aPYx/XjtucsuYvJyTaMCM2S8p6aN9qa+h7fkmDjQ5vgEXEJIqoT0KKm2YfvF4 3dSrRav3BgEZqCfHuOh/xjJNzkE7ODEyLWM6uFMtndqYI94c3BsdC0NahXD4FqkTvg tJW5zta5CterQ== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 4A324687CC for ; Sat, 29 Nov 2025 01:01:17 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1764403275; bh=VGSpJIAsoG3EzRhJccC8mBg8tzbszl1LZwabbjeQ4BA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MRtwqn+1L7sh2MhK9ap2oaFE+YQYuN48gpu7aB1fRqNgBJR24ZuJyLgrwmSjJ896i AmecCFqS6hyTqh6tZrbS1uKA3ftr+iilhUhDkyMoWw/ngIrmVZlyr44l8Kt9aiAoyz RSZKLsTSiFFhchrcHU/mKJi7tdldHKdZgpzL8AjuBfrqqsl52V2Rr9kcvPg5mljI+q DGEoNoZQYkYvjwBj6aVkxJfUXmM56s0A4R9TJL5PnB7Dy2aKmQcEwy4sXn0Z+XDKW3 S+edVukoRnw7WlVgYeqOS+gZRTxOeS0mBKaCYJfXK6MoSBhH4FVW5qLraD9Ncz9jDQ r3girt3KqzNxQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 42ADE6875D; Sat, 29 Nov 2025 01:01:15 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id vkZNM6iQC_Uw; Sat, 29 Nov 2025 01:01:15 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1764403271; bh=N9hlwrY6N+rSS7zZQChnaq0/ZTRb/914fRITJJaMvrI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jgmP1BAt+wAwtSogw5O4OKWzWtH+qhaZ8Wl/KP1eJH57VNa/HUbcWSZ2xjIe8VLkX NjhStQYXiNOojNocJ3t5v63pApFV2LfRM8AcjpKvRTDBaYeFcjPMkfucqspGMuCZAq I0HdBHTeO/TnRLDyjNIeGS9MKH3HkNciEIdwli9pLXDag02pr7UD+J6gS9GR2JrvUm ts5PBy8kuxqE1JQ6iz359pzXEA6UmYZHAo6MG5gB/e2CM56Djxj+sOj7h40EGLoNwI I+UEgtYF0HANPlvwa+NWwdsf8lA9sFC6BMhgKHjFS4eDjudQOKq7Q+bUM2v57/j+fg 4ONH0NIPvUpbQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id BC9E06876F; Sat, 29 Nov 2025 01:01:10 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Sat, 29 Nov 2025 00:59:53 -0700 Message-ID: <20251129080014.758001-9-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251129080014.758001-1-sjg@u-boot.org> References: <20251129080014.758001-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: XV4AXNCJJ2QMR35FFGKNYF3JPTVAESHA X-Message-ID-Hash: XV4AXNCJJ2QMR35FFGKNYF3JPTVAESHA X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 08/10] backtrace: Add a command List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add a new 'backtrace' command which prints the current call stack, which is useful for debugging. The command is enabled by CONFIG_CMD_BACKTRACE Add docs and a test. Co-developed-by: Claude Signed-off-by: Simon Glass --- cmd/Kconfig | 8 ++++++ cmd/Makefile | 1 + cmd/backtrace.c | 30 ++++++++++++++++++++++ doc/usage/cmd/backtrace.rst | 51 +++++++++++++++++++++++++++++++++++++ doc/usage/index.rst | 1 + test/cmd/Makefile | 1 + test/cmd/backtrace.c | 22 ++++++++++++++++ 7 files changed, 114 insertions(+) create mode 100644 cmd/backtrace.c create mode 100644 doc/usage/cmd/backtrace.rst create mode 100644 test/cmd/backtrace.c diff --git a/cmd/Kconfig b/cmd/Kconfig index a45df78c8fd..ff5f6f85144 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -136,6 +136,14 @@ config CMD_ADDR_FIND sufficiently large to hold a file. If successful, it sets the loadaddr variable to this address. +config CMD_BACKTRACE + bool "backtrace" + depends on BACKTRACE + default y if BACKTRACE + help + This command prints a backtrace showing the current call stack. + This can be useful for debugging. + config CMD_ADDRMAP bool "addrmap" depends on ADDR_MAP diff --git a/cmd/Makefile b/cmd/Makefile index 2c6a16752bd..ebf66ea0d3c 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -14,6 +14,7 @@ obj-y += version.o # command obj-$(CONFIG_CMD_ARMFFA) += armffa.o obj-$(CONFIG_CMD_2048) += 2048.o +obj-$(CONFIG_CMD_BACKTRACE) += backtrace.o obj-$(CONFIG_CMD_ACPI) += acpi.o obj-$(CONFIG_CMD_ADDR_FIND) += addr_find.o obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o diff --git a/cmd/backtrace.c b/cmd/backtrace.c new file mode 100644 index 00000000000..c54ac057f16 --- /dev/null +++ b/cmd/backtrace.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Backtrace command + * + * Copyright 2025 Canonical Ltd + * Written by Simon Glass + */ + +#include +#include + +static int do_backtrace(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + int ret; + + ret = backtrace_show(); + if (ret) { + printf("backtrace failed: %d\n", ret); + return CMD_RET_FAILURE; + } + + return 0; +} + +U_BOOT_CMD(backtrace, 1, 1, do_backtrace, + "Print backtrace", + "\n" + " - Print a backtrace of the current call stack" +); diff --git a/doc/usage/cmd/backtrace.rst b/doc/usage/cmd/backtrace.rst new file mode 100644 index 00000000000..37acb0b3067 --- /dev/null +++ b/doc/usage/cmd/backtrace.rst @@ -0,0 +1,51 @@ +.. SPDX-License-Identifier: GPL-2.0+ + +.. index:: + single: backtrace (command) + +backtrace command +================= + +Synopsis +-------- + +:: + + backtrace + +Description +----------- + +The *backtrace* command prints a backtrace of the current call stack. This can +be useful for debugging to see how a particular code path was reached. + +The output shows each stack frame with the function name, source file, and line +number (when debug information is available). This includes static functions. + +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 + ... + +Configuration +------------- + +The backtrace command is enabled by CONFIG_CMD_BACKTRACE which depends on +CONFIG_BACKTRACE. Currently this is only available on sandbox. + +The sandbox implementation uses libbacktrace (bundled with GCC) to provide +detailed symbol information including function names, source files, and line +numbers. diff --git a/doc/usage/index.rst b/doc/usage/index.rst index e8dbabfa9d2..8913c0a4f9b 100644 --- a/doc/usage/index.rst +++ b/doc/usage/index.rst @@ -31,6 +31,7 @@ Shell commands cmd/addrmap cmd/armffa cmd/askenv + cmd/backtrace cmd/base cmd/bdinfo cmd/bind diff --git a/test/cmd/Makefile b/test/cmd/Makefile index 4d8f93e2551..c43aefb4eb3 100644 --- a/test/cmd/Makefile +++ b/test/cmd/Makefile @@ -14,6 +14,7 @@ obj-y += exit.o obj-$(CONFIG_X86) += cpuid.o msr.o obj-$(CONFIG_CMD_ADDR_FIND) += addr_find.o obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o +obj-$(CONFIG_CMD_BACKTRACE) += backtrace.o obj-$(CONFIG_CMD_BDI) += bdinfo.o obj-$(CONFIG_CMD_BOOTSTAGE) += bootstage.o obj-$(CONFIG_CMD_CHID) += chid.o diff --git a/test/cmd/backtrace.c b/test/cmd/backtrace.c new file mode 100644 index 00000000000..2d999e20f31 --- /dev/null +++ b/test/cmd/backtrace.c @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Test for backtrace command + * + * Copyright 2025 Canonical Ltd + * Written by Simon Glass + */ + +#include +#include +#include +#include + +/* 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)); + + return 0; +} +DM_TEST(cmd_test_backtrace, UTF_SCAN_FDT);