aboutsummaryrefslogtreecommitdiff
path: root/gdb/stack.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2007-11-09 19:04:35 +0000
committerJoel Brobecker <brobecker@gnat.com>2007-11-09 19:04:35 +0000
commit88408340b86be224130c470c129997ccc947a975 (patch)
tree47391a602dcf0e38f9f5a76338cff2005b340283 /gdb/stack.c
parent1c86e440c3178f9b729a0e99c0d45e40c7b813e8 (diff)
downloadgdb-88408340b86be224130c470c129997ccc947a975.zip
gdb-88408340b86be224130c470c129997ccc947a975.tar.gz
gdb-88408340b86be224130c470c129997ccc947a975.tar.bz2
* stack.c (print_frame_arguments_choices): New static global.
(print_frame_arguments): Likewise. (print_this_frame_argument_p): New function. (print_frame_args): Print the argument value only when appropriate. (_initialize_task): Add new "set/show print frame-arguments" command.
Diffstat (limited to 'gdb/stack.c')
-rw-r--r--gdb/stack.c90
1 files changed, 74 insertions, 16 deletions
diff --git a/gdb/stack.c b/gdb/stack.c
index 237ded1..e034033 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -50,6 +50,13 @@
void (*deprecated_selected_frame_level_changed_hook) (int);
+/* The possible choices of "set print frame-arguments, and the value
+ of this setting. */
+
+static const char *print_frame_arguments_choices[] =
+ {"all", "scalars", "none", NULL};
+static const char *print_frame_arguments = "all";
+
/* Prototypes for local functions. */
static void print_frame_local_vars (struct frame_info *, int,
@@ -148,6 +155,44 @@ print_frame_nameless_args (struct frame_info *frame, long start, int num,
}
}
+/* Return non-zero if the debugger should print the value of the provided
+ symbol parameter (SYM). */
+
+static int
+print_this_frame_argument_p (struct symbol *sym)
+{
+ struct type *type;
+
+ /* If the user asked to print no argument at all, then obviously
+ do not print this argument. */
+
+ if (strcmp (print_frame_arguments, "none") == 0)
+ return 0;
+
+ /* If the user asked to print all arguments, then we should print
+ that one. */
+
+ if (strcmp (print_frame_arguments, "all") == 0)
+ return 1;
+
+ /* The user asked to print only the scalar arguments, so do not
+ print the non-scalar ones. */
+
+ type = CHECK_TYPEDEF (SYMBOL_TYPE (sym));
+ switch (TYPE_CODE (type))
+ {
+ case TYPE_CODE_ARRAY:
+ case TYPE_CODE_STRUCT:
+ case TYPE_CODE_UNION:
+ case TYPE_CODE_SET:
+ case TYPE_CODE_STRING:
+ case TYPE_CODE_BITSTRING:
+ return 0;
+ default:
+ return 1;
+ }
+}
+
/* Print the arguments of frame FRAME on STREAM, given the function
FUNC running in that frame (as a symbol), where NUM is the number
of arguments according to the stack frame (or -1 if the number of
@@ -304,23 +349,30 @@ print_frame_args (struct symbol *func, struct frame_info *frame,
annotate_arg_name_end ();
ui_out_text (uiout, "=");
- /* Avoid value_print because it will deref ref parameters.
- We just want to print their addresses. Print ??? for
- args whose address we do not know. We pass 2 as
- "recurse" to val_print because our standard indentation
- here is 4 spaces, and val_print indents 2 for each
- recurse. */
- val = read_var_value (sym, frame);
-
- annotate_arg_value (val == NULL ? NULL : value_type (val));
+ if (print_this_frame_argument_p (sym))
+ {
+ /* Avoid value_print because it will deref ref parameters.
+ We just want to print their addresses. Print ??? for
+ args whose address we do not know. We pass 2 as
+ "recurse" to val_print because our standard indentation
+ here is 4 spaces, and val_print indents 2 for each
+ recurse. */
+ val = read_var_value (sym, frame);
+
+ annotate_arg_value (val == NULL ? NULL : value_type (val));
+
+ if (val)
+ {
+ common_val_print (val, stb->stream, 0, 0, 2,
+ Val_no_prettyprint);
+ ui_out_field_stream (uiout, "value", stb);
+ }
+ else
+ ui_out_text (uiout, "???");
+ }
+ else
+ ui_out_text (uiout, "...");
- if (val)
- {
- common_val_print (val, stb->stream, 0, 0, 2, Val_no_prettyprint);
- ui_out_field_stream (uiout, "value", stb);
- }
- else
- ui_out_text (uiout, "???");
/* Invoke ui_out_tuple_end. */
do_cleanups (list_chain);
@@ -2039,6 +2091,12 @@ Usage: func <name>\n"));
add_info ("catch", catch_info,
_("Exceptions that can be caught in the current stack frame."));
+ add_setshow_enum_cmd ("frame-arguments", class_stack,
+ print_frame_arguments_choices, &print_frame_arguments,
+ _("Set printing of non-scalar frame arguments"),
+ _("Show printing of non-scalar frame arguments"),
+ NULL, NULL, NULL, &setprintlist, &showprintlist);
+
#if 0
add_cmd ("backtrace-limit", class_stack, set_backtrace_limit_command, _(\
"Specify maximum number of frames for \"backtrace\" to print by default."),