* 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.
This commit is contained in:
parent
1c86e440c3
commit
88408340b8
|
@ -1,3 +1,11 @@
|
|||
2007-11-06 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2007-11-09 Luis Machado <luisgpm@br.ibm.com>
|
||||
|
||||
* ppc-linux-nat.c (ppc_linux_insert_watchpoint): Move
|
||||
|
|
88
gdb/stack.c
88
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);
|
||||
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));
|
||||
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."),
|
||||
|
|
Loading…
Reference in New Issue