[Pdbg] [PATCH] regs: Allow user to opt in to backtrace

Alistair Popple alistair at popple.id.au
Mon Oct 15 16:08:06 AEDT 2018


Thanks Joel, good idea. However I am going to split this in to two commits so I
can add a test for OPTCMD_DEFINE_CMD_ONLY_FLAGS along the way.

- Alistair

On Monday, 15 October 2018 11:32:41 AM AEDT Joel Stanley wrote:
> The backtrace causes us to read memory which appears to have a high
> likelihood of causing a checkstop due to an invalid address.
> 
> This adds a --backtrace flag to the regs command which enables the
> backtrace. By default it is off to protect the user.
> 
> Signed-off-by: Joel Stanley <joel at jms.id.au>
> ---
>  src/main.c   |  2 +-
>  src/optcmd.h | 20 ++++++++++++++++++++
>  src/thread.c | 19 +++++++++++++++----
>  3 files changed, 36 insertions(+), 5 deletions(-)
> 
> diff --git a/src/main.c b/src/main.c
> index 8b7e2ddae6cc..4966d511c62e 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -135,7 +135,7 @@ static struct action actions[] = {
>  	{ "putmem",  "<address>", "Write to system memory" },
>  	{ "threadstatus", "", "Print the status of a thread" },
>  	{ "sreset",  "", "Reset" },
> -	{ "regs",  "", "State" },
> +	{ "regs",  "[--backtrace]", "State (optionally display backtrace)" },
>  };
>  
>  static void print_usage(char *pname)
> diff --git a/src/optcmd.h b/src/optcmd.h
> index e5f688e13ea6..7d1bf2d6613c 100644
> --- a/src/optcmd.h
> +++ b/src/optcmd.h
> @@ -179,6 +179,26 @@ struct optcmd_cmd {
>  		.cmdp = __##cmd_func_,			\
>  	}
>  
> +/*
> + * Defines a new command taking no arguments or flags.
> + *  @cmd_name - name of command used on the command line
> + *  @cmd_func - pointer to the function to call for this command
> + */
> +#define OPTCMD_DEFINE_CMD_ONLY_FLAGS(cmd_name_, cmd_func_, flag_, flags_) \
> +        int cmd_func_(struct flag_);                    \
> +    int __##cmd_func_(void *args[], void *flags[])            \
> +    {                                \
> +        struct flag_ flag;                    \
> +        CPPMAGIC_JOIN(, CPPMAGIC_MAP(OPTCMD_CAST_FLAGS, CPPMAGIC_EVAL flags_)) \
> +        return cmd_func_(flag);                    \
> +    }                                \
> +                                    \
> +    struct optcmd_cmd optcmd_##cmd_name_ = {            \
> +        .cmd = #cmd_name_,                    \
> +        .cmdp = __##cmd_func_,                    \
> +        .flags = { CPPMAGIC_MAP(OPTCMD_FLAG, CPPMAGIC_EVAL flags_), {NULL} }, \
> +    }
> +
>  optcmd_cmd_t *optcmd_parse(struct optcmd_cmd *cmd, const char *argv[], int argc,
>  			   void **args[], void **flags[]);
>  
> diff --git a/src/thread.c b/src/thread.c
> index d282307374c5..67b6c46443d7 100644
> --- a/src/thread.c
> +++ b/src/thread.c
> @@ -188,11 +188,13 @@ static int sreset_thread(struct pdbg_target *thread_target, uint32_t index, uint
>  static int state_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1)
>  {
>  	struct thread_regs regs;
> +	bool do_backtrace = (bool)unused;
>  
>  	if (ram_state_thread(thread_target, &regs))
>  		return 0;
>  
> -	dump_stack(&regs);
> +	if (do_backtrace)
> +		dump_stack(&regs);
>  
>  	return 1;
>  }
> @@ -227,14 +229,23 @@ static int thread_sreset(void)
>  }
>  OPTCMD_DEFINE_CMD(sreset, thread_sreset);
>  
> -static int thread_state(void)
> +
> +struct reg_flags {
> +	bool do_backtrace;
> +};
> +
> +#define REG_BACKTRACE_FLAG ("--backtrace", do_backtrace, parse_flag_noarg, false)
> +
> +static int thread_state(struct reg_flags flags)
>  {
>  	int err;
>  
> -	err = for_each_target("thread", state_thread, NULL, NULL);
> +	err = for_each_target("thread", state_thread,
> +			(uint64_t *)flags.do_backtrace, NULL);
>  
>  	for_each_target_release("thread");
>  
>  	return err;
>  }
> -OPTCMD_DEFINE_CMD(regs, thread_state);
> +OPTCMD_DEFINE_CMD_ONLY_FLAGS(regs, thread_state,
> +                  reg_flags, (REG_BACKTRACE_FLAG));
> 




More information about the Pdbg mailing list