diff options
author | Pedro Alves <palves@redhat.com> | 2019-06-13 00:06:53 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2019-06-13 00:19:14 +0100 |
commit | d4c16835cad70bd8c04ff30d5d6f40ac65e7f7e1 (patch) | |
tree | 0d491f710612a66db24b37f8ca5cb25611504c27 /gdb/frame.h | |
parent | 2daf894ed0baf72dd3f422b7a71630145568db30 (diff) | |
download | fsf-binutils-gdb-d4c16835cad70bd8c04ff30d5d6f40ac65e7f7e1.zip fsf-binutils-gdb-d4c16835cad70bd8c04ff30d5d6f40ac65e7f7e1.tar.gz fsf-binutils-gdb-d4c16835cad70bd8c04ff30d5d6f40ac65e7f7e1.tar.bz2 |
Make "backtrace" support -OPT options
This adds support for comand options to the "backtrace" command. We'll get:
(gdb) bt -
-entry-values -hide -past-main
-frame-arguments -no-filters -raw-frame-arguments
-full -past-entry
~~~~
(gdb) help backtrace
Print backtrace of all stack frames, or innermost COUNT frames.
Usage: backtrace [OPTION]... [QUALIFIER]... [COUNT | -COUNT]
Options:
-entry-values no|only|preferred|if-needed|both|compact|default
Set printing of function arguments at function entry
GDB can sometimes determine the values of function arguments at entry,
in addition to their current values. This option tells GDB whether
to print the current value, the value at entry (marked as val@entry),
or both. Note that one or both of these values may be <optimized out>.
-frame-arguments all|scalars|none
Set printing of non-scalar frame arguments
-raw-frame-arguments [on|off]
Set whether to print frame arguments in raw form.
If set, frame arguments are printed in raw form, bypassing any
pretty-printers for that value.
-past-main [on|off]
Set whether backtraces should continue past "main".
Normally the caller of "main" is not of interest, so GDB will terminate
the backtrace at "main". Set this if you need to see the rest
of the stack trace.
-past-entry [on|off]
Set whether backtraces should continue past the entry point of a program.
Normally there are no callers beyond the entry point of a program, so GDB
will terminate the backtrace there. Set this if you need to see
the rest of the stack trace.
-full
Print values of local variables.
-no-filters
Prohibit frame filters from executing on a backtrace.
-hide
Causes Python frame filter elided frames to not be printed.
For backward compatibility, the following qualifiers are supported:
full - same as -full option.
no-filters - same as -no-filters option.
hide - same as -hide.
With a negative COUNT, print outermost -COUNT frames.
~~~~
Implementation wise, this:
- Moves relevant options/settings globals to structures.
- Tweaks a number of functions to pass down references to such structures.
- Adds option_def structures describing the options/settings.
- Makes backtrace_command parse the options, with gdb::option::process_options.
- Tweaks "backtrace"'s help to describe the new options.
- Adds testcases.
Note that backtrace is a PROCESS_OPTIONS_UNKNOWN_IS_OPERAND command,
because of the "-COUNT" argument.
The COUNT/-COUNT argument is currently parsed as an expression. I
considered whether it would be prudent here to require "--", but
concluded that the risk of causing a significant breakage here is much
lower compared to "print", since printing the expression is not the
whole point of the "backtrace" command. Seems OK to me to require
typing "backtrace -past-main -- -p" if the user truly wants to refer
to the negative of a backtrace count stored in an inferior variable
called "p".
gdb/ChangeLog:
2019-06-13 Pedro Alves <palves@redhat.com>
* frame.c: Include "cli/cli-option.h.
(user_set_backtrace_options): New.
(backtrace_past_main, backtrace_past_entry, backtrace_limit):
Delete.
(get_prev_frame): Adjust.
(boolean_option_def, uinteger_option_def)
(set_backtrace_option_defs): New.
(_initialize_frame): Adjust and use
gdb::option::add_setshow_cmds_for_options to install "set
backtrace past-main" and "set backtrace past-entry".
* frame.h: Include "cli/cli-option.h".
(struct frame_print_options): Forward declare.
(print_frame_arguments_all, print_frame_arguments_scalars)
(print_frame_arguments_none): Declare.
(print_entry_values): Delete declaration.
(struct frame_print_options, user_frame_print_options): New.
(struct set_backtrace_options): New.
(set_backtrace_option_defs, user_set_backtrace_options): Declare.
* mi/mi-cmd-stack.c (mi_cmd_stack_list_frames)
(mi_cmd_stack_list_locals, mi_cmd_stack_list_args)
(mi_cmd_stack_list_variables): Pass down USER_FRAME_PRINT_OPTIONS.
(list_args_or_locals): Add frame_print_options parameter.
(mi_cmd_stack_info_frame): Pass down USER_FRAME_PRINT_OPTIONS.
* python/py-framefilter.c (enumerate_args): Pass down
USER_FRAME_PRINT_OPTIONS.
* stack.c: Include "cli/cli-option.h".
(print_frame_arguments_all, print_frame_arguments_scalars)
(print_frame_arguments_none): Declare.
(print_raw_frame_arguments, print_entry_values): Delete.
(user_frame_print_options): New.
(boolean_option_def, enum_option_def, frame_print_option_defs):
New.
(struct backtrace_cmd_options): New.
(bt_flag_option_def): New.
(backtrace_command_option_defs): New.
(print_stack_frame): Pass down USER_FRAME_PRINT_OPTIONS.
(print_frame_arg, read_frame_arg, print_frame_args)
(print_frame_info, print_frame): Add frame_print_options parameter
and use it.
(info_frame_command_core): Pass down USER_FRAME_PRINT_OPTIONS.
(backtrace_command_1): Add frame_print_options and
backtrace_cmd_options parameters and use them.
(make_backtrace_options_def_group): New.
(backtrace_command): Process command options with
gdb::option::process_options.
(backtrace_command_completer): New.
(_initialize_stack): Extend "backtrace"'s help to mention
supported options. Install completer for "backtrace".
Install some settings commands with add_setshow_cmds_for_options.
gdb/testsuite/ChangeLog:
2019-06-13 Pedro Alves <palves@redhat.com>
* gdb.base/options.exp (test-backtrace): New.
(top level): Call it.
Diffstat (limited to 'gdb/frame.h')
-rw-r--r-- | gdb/frame.h | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/gdb/frame.h b/gdb/frame.h index 0a0baf4..a79eeee 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -70,6 +70,7 @@ */ #include "language.h" +#include "cli/cli-option.h" struct symtab_and_line; struct frame_unwind; @@ -78,6 +79,7 @@ struct block; struct gdbarch; struct ui_file; struct ui_out; +struct frame_print_options; /* Status of a given frame's stack. */ @@ -753,7 +755,8 @@ extern void print_stack_frame (struct frame_info *, int print_level, enum print_what print_what, int set_current_sal); -extern void print_frame_info (struct frame_info *, int print_level, +extern void print_frame_info (const frame_print_options &fp_opts, + struct frame_info *, int print_level, enum print_what print_what, int args, int set_current_sal); @@ -764,6 +767,12 @@ extern int deprecated_frame_register_read (struct frame_info *frame, int regnum, /* From stack.c. */ +/* The possible choices of "set print frame-arguments". */ +extern const char print_frame_arguments_all[]; +extern const char print_frame_arguments_scalars[]; +extern const char print_frame_arguments_none[]; + +/* The possible choices of "set print entry-values". */ extern const char print_entry_values_no[]; extern const char print_entry_values_only[]; extern const char print_entry_values_preferred[]; @@ -771,7 +780,22 @@ extern const char print_entry_values_if_needed[]; extern const char print_entry_values_both[]; extern const char print_entry_values_compact[]; extern const char print_entry_values_default[]; -extern const char *print_entry_values; + +/* Data for the frame-printing "set print" settings exposed as command + options. */ + +struct frame_print_options +{ + const char *print_frame_arguments = print_frame_arguments_scalars; + const char *print_entry_values = print_entry_values_default; + + /* If non-zero, don't invoke pretty-printers for frame + arguments. */ + int print_raw_frame_arguments; +}; + +/* The values behind the global "set print ..." settings. */ +extern frame_print_options user_frame_print_options; /* Inferior function parameter value read in from a frame. */ @@ -800,7 +824,8 @@ struct frame_arg const char *entry_kind; }; -extern void read_frame_arg (struct symbol *sym, struct frame_info *frame, +extern void read_frame_arg (const frame_print_options &fp_opts, + symbol *sym, frame_info *frame, struct frame_arg *argp, struct frame_arg *entryargp); extern void read_frame_local (struct symbol *sym, struct frame_info *frame, @@ -881,4 +906,28 @@ extern struct frame_info *skip_tailcall_frames (struct frame_info *frame); extern struct frame_info *skip_unwritable_frames (struct frame_info *frame); +/* Data for the "set backtrace" settings. */ + +struct set_backtrace_options +{ + /* Flag to indicate whether backtraces should continue past + main. */ + int backtrace_past_main = 0; + + /* Flag to indicate whether backtraces should continue past + entry. */ + int backtrace_past_entry = 0; + + /* Upper bound on the number of backtrace levels. Note this is not + exposed as a command option, because "backtrace" and "frame + apply" already have other means to set a frame count limit. */ + unsigned int backtrace_limit = UINT_MAX; +}; + +/* The corresponding option definitions. */ +extern const gdb::option::option_def set_backtrace_option_defs[2]; + +/* The values behind the global "set backtrace ..." settings. */ +extern set_backtrace_options user_set_backtrace_options; + #endif /* !defined (FRAME_H) */ |