common: command: Add command execution tracer.
authorChristoph Muellner <christoph.muellner@theobroma-systems.com>
Fri, 5 Apr 2019 11:03:46 +0000 (13:03 +0200)
committerSimon Glass <sjg@chromium.org>
Wed, 24 Apr 2019 02:26:43 +0000 (20:26 -0600)
When using boot scripts it can become quite hard to understand
which commands are actually executed during bootup (e.g. where
is a kernel image loaded from or which DTB is in use).

Shell scripts suffer from a similar problem and many shells address
this problem with a command execution tracer (e.g. BASH has xtrace,
which can be enabled by "set -x").

This patch introduces a command tracer for U-Boot, which prints
every command with its arguments before it is executed.

Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com>
Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
cmd/Kconfig
common/command.c

index 2bdbfcb..f6e7cd4 100644 (file)
@@ -53,6 +53,17 @@ config SYS_PROMPT
          This string is displayed in the command line to the left of the
          cursor.
 
+config SYS_XTRACE
+       string "Command execution tracer"
+       depends on CMDLINE
+       default y if CMDLINE
+       help
+         This option enables the possiblity to print all commands before
+         executing them and after all variables are evaluated (similar
+         to Bash's xtrace/'set -x' feature).
+         To enable the tracer a variable "xtrace" needs to be defined in
+         the environment.
+
 menu "Autoboot options"
 
 config AUTOBOOT
index e14d1fa..e192bb2 100644 (file)
@@ -574,6 +574,20 @@ enum command_ret_t cmd_process(int flag, int argc, char * const argv[],
        enum command_ret_t rc = CMD_RET_SUCCESS;
        cmd_tbl_t *cmdtp;
 
+#if defined(CONFIG_SYS_XTRACE)
+       char *xtrace;
+
+       xtrace = env_get("xtrace");
+       if (xtrace) {
+               puts("+");
+               for (int i = 0; i < argc; i++) {
+                       puts(" ");
+                       puts(argv[i]);
+               }
+               puts("\n");
+       }
+#endif
+
        /* Look up command in command table */
        cmdtp = find_cmd(argv[0]);
        if (cmdtp == NULL) {