* NEWS: Mention "set print raw frame-arguments".

* gdbcmd.h (setprintrawlist, showprintrawlist): Declare.
	* stack.c (print_raw_frame_arguments): New static global.
	(print_frame_arg): Set opts.raw from print_raw_frame_arguments.
	(_initialize_stack): New command "set/show print raw frame-arguments".
	* valprint.c (setprintrawlist, showprintrawlist): New globals.
	(set_print_raw, show_print_raw): New functions.
	(_initialize_valprint): New prefix command "set/show print raw".
	* valprint.h (value_print_options): Improve comments.

	doc/
	* gdb.texinfo (Print Settings): Document "print raw frame-arguments".

	testsuite/
	* gdb.python/py-frame-args.c: New file.
	* gdb.python/py-frame-args.py: New file.
	* gdb.python/py-frame-args.exp New file.
This commit is contained in:
Doug Evans 2013-07-17 20:35:11 +00:00
parent 453e48a5a5
commit e704570352
12 changed files with 289 additions and 2 deletions

View File

@ -1,5 +1,15 @@
2013-07-17 Doug Evans <dje@google.com>
* NEWS: Mention "set print raw frame-arguments".
* gdbcmd.h (setprintrawlist, showprintrawlist): Declare.
* stack.c (print_raw_frame_arguments): New static global.
(print_frame_arg): Set opts.raw from print_raw_frame_arguments.
(_initialize_stack): New command "set/show print raw frame-arguments".
* valprint.c (setprintrawlist, showprintrawlist): New globals.
(set_print_raw, show_print_raw): New functions.
(_initialize_valprint): New prefix command "set/show print raw".
* valprint.h (value_print_options): Improve comments.
* cli/cli-cmds.c (init_cmd_lists): Delete unnecessary initialization
of all *list variables.

View File

@ -34,6 +34,11 @@ maint set|show per-command symtab
* New options
set print raw frame-arguments
show print raw frame-arguments
Set/show whether to print frame arguments in raw mode,
disregarding any defined pretty-printers.
set remote trace-status-packet
show remote trace-status-packet
Set/show the use of remote protocol qTStatus packet.

View File

@ -1,3 +1,7 @@
2013-07-17 Doug Evans <dje@google.com>
* gdb.texinfo (Print Settings): Document "print raw frame-arguments".
2013-07-02 Tom Tromey <tromey@redhat.com>
* gdb.texinfo (Target Commands): Don't mention "target nrom".

View File

@ -9030,6 +9030,18 @@ thus speeding up the display of each Ada frame.
@item show print frame-arguments
Show how the value of arguments should be displayed when printing a frame.
@item set print raw frame-arguments on
Print frame arguments in raw, non pretty-printed, form.
@item set print raw frame-arguments off
Print frame arguments in pretty-printed form, if there is a pretty-printer
for the value (@pxref{Pretty Printing}),
otherwise print the value in raw form.
This is the default.
@item show print raw frame-arguments
Show whether to print frame arguments in raw form.
@anchor{set print entry-values}
@item set print entry-values @var{value}
@kindex set print entry-values

View File

@ -107,6 +107,10 @@ extern struct cmd_list_element *setprintlist;
extern struct cmd_list_element *showprintlist;
extern struct cmd_list_element *setprintrawlist;
extern struct cmd_list_element *showprintrawlist;
extern struct cmd_list_element *setprinttypelist;
extern struct cmd_list_element *showprinttypelist;

View File

@ -65,6 +65,9 @@ static const char *const print_frame_arguments_choices[] =
{"all", "scalars", "none", NULL};
static const char *print_frame_arguments = "scalars";
/* If non-zero, don't invoke pretty-printers for frame arguments. */
static int print_raw_frame_arguments;
/* The possible choices of "set print entry-values", and the value
of this setting. */
@ -277,6 +280,7 @@ print_frame_arg (const struct frame_arg *arg)
get_no_prettyformat_print_options (&opts);
opts.deref_ref = 1;
opts.raw = print_raw_frame_arguments;
/* True in "summary" mode, false otherwise. */
opts.summary = !strcmp (print_frame_arguments, "scalars");
@ -2640,6 +2644,15 @@ Usage: func <name>\n"));
_("Show printing of non-scalar frame arguments"),
NULL, NULL, NULL, &setprintlist, &showprintlist);
add_setshow_boolean_cmd ("frame-arguments", no_class,
&print_raw_frame_arguments, _("\
Set whether to print frame arguments in raw form."), _("\
Show whether to print frame arguments in raw form."), _("\
If set, frame arguments are printed in raw form, bypassing any\n\
pretty-printers for that value."),
NULL, NULL,
&setprintrawlist, &showprintrawlist);
add_setshow_auto_boolean_cmd ("disassemble-next-line", class_stack,
&disassemble_next_line, _("\
Set whether to disassemble next source line or insn when execution stops."),

View File

@ -1,3 +1,9 @@
2013-07-17 Doug Evans <dje@google.com>
* gdb.python/py-frame-args.c: New file.
* gdb.python/py-frame-args.py: New file.
* gdb.python/py-frame-args.exp New file.
2013-07-16 Andrew Burgess <aburgess@broadcom.com>
* gdb.base/printcmds.exp (test_printf): Add tests for format

View File

@ -0,0 +1,60 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2013 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <string.h>
struct s
{
int m;
};
struct ss
{
struct s a;
struct s b;
};
void
init_s (struct s *s, int m)
{
s->m = m;
}
void
init_ss (struct ss *s, int a, int b)
{
init_s (&s->a, a);
init_s (&s->b, b);
}
void
foo (int x, struct ss ss)
{
return; /* break-here */
}
int
main ()
{
struct ss ss;
init_ss (&ss, 1, 2);
foo (42, ss);
return 0;
}

View File

@ -0,0 +1,70 @@
# Copyright (C) 2013 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
standard_testfile
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
return -1
}
# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }
if ![runto_main] {
return -1
}
set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]
gdb_test_no_output "python exec (open ('${remote_python_file}').read ())"
gdb_breakpoint [gdb_get_line_number "break-here"]
gdb_continue_to_breakpoint "break-here" ".* break-here .*"
# Test all combinations with raw off.
gdb_test_no_output "set print raw frame-arguments off"
gdb_test_no_output "set print frame-arguments none"
gdb_test "frame" ".*foo \\(x=\[.\]{3}, ss=\[.\]{3}\\).*" \
"frame pretty,none"
gdb_test_no_output "set print frame-arguments scalars"
gdb_test "frame" ".*foo \\(x=42, ss=super struct = {\[.\]{3}}\\).*" \
"frame pretty,scalars"
gdb_test_no_output "set print frame-arguments all"
gdb_test "frame" \
".*foo \\(x=42, ss=super struct = {a = m=<1>, b = m=<2>}\\).*" \
"frame pretty,all"
# Test all combinations with raw on.
gdb_test_no_output "set print raw frame-arguments on"
gdb_test_no_output "set print frame-arguments none"
gdb_test "frame" ".*foo \\(x=\[.\]{3}, ss=\[.\]{3}\\).*" \
"frame raw,none"
gdb_test_no_output "set print frame-arguments scalars"
gdb_test "frame" ".*foo \\(x=42, ss=\[.\]{3}\\).*" \
"frame raw,scalars"
gdb_test_no_output "set print frame-arguments all"
gdb_test "frame" \
".*foo \\(x=42, ss={a = {m = 1}, b = {m = 2}}\\).*" \
"frame raw,all"
remote_file host delete ${remote_python_file}

View File

@ -0,0 +1,75 @@
# Copyright (C) 2013 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import re
import gdb
class pp_s (object):
def __init__(self, val):
self.val = val
def to_string(self):
m = self.val["m"]
return "m=<" + str(self.val["m"]) + ">"
class pp_ss (object):
def __init__(self, val):
self.val = val
def to_string(self):
return "super struct"
def children (self):
yield 'a', self.val['a']
yield 'b', self.val['b']
def lookup_function (val):
"Look-up and return a pretty-printer that can print val."
# Get the type.
type = val.type
# If it points to a reference, get the reference.
if type.code == gdb.TYPE_CODE_REF:
type = type.target ()
# Get the unqualified type, stripped of typedefs.
type = type.unqualified ().strip_typedefs ()
# Get the type name.
typename = type.tag
if typename == None:
return None
# Iterate over local dictionary of types to determine
# if a printer is registered for that type. Return an
# instantiation of the printer if found.
for function in pretty_printers_dict:
if function.match (typename):
return pretty_printers_dict[function] (val)
# Cannot find a pretty printer. Return None.
return None
def register_pretty_printers ():
pretty_printers_dict[re.compile ('^s$')] = pp_s
pretty_printers_dict[re.compile ('^ss$')] = pp_ss
pretty_printers_dict = {}
register_pretty_printers ()
gdb.pretty_printers.append (lookup_function)

View File

@ -76,6 +76,9 @@ struct converted_character
typedef struct converted_character converted_character_d;
DEF_VEC_O (converted_character_d);
/* Command lists for set/show print raw. */
struct cmd_list_element *setprintrawlist;
struct cmd_list_element *showprintrawlist;
/* Prototypes for local functions */
@ -2686,6 +2689,21 @@ show_print (char *args, int from_tty)
{
cmd_show_list (showprintlist, from_tty, "");
}
static void
set_print_raw (char *arg, int from_tty)
{
printf_unfiltered (
"\"set print raw\" must be followed by the name of a \"print raw\" subcommand.\n");
help_list (setprintrawlist, "set print raw ", -1, gdb_stdout);
}
static void
show_print_raw (char *args, int from_tty)
{
cmd_show_list (showprintrawlist, from_tty, "");
}
void
_initialize_valprint (void)
@ -2703,6 +2721,14 @@ _initialize_valprint (void)
add_alias_cmd ("p", "print", no_class, 1, &showlist);
add_alias_cmd ("pr", "print", no_class, 1, &showlist);
add_prefix_cmd ("raw", no_class, set_print_raw,
_("\
Generic command for setting what things to print in \"raw\" mode."),
&setprintrawlist, "set print raw ", 0, &setprintlist);
add_prefix_cmd ("raw", no_class, show_print_raw,
_("Generic command for showing \"print raw\" settings."),
&showprintrawlist, "show print raw ", 0, &showprintlist);
add_setshow_uinteger_cmd ("elements", no_class,
&user_print_options.print_max, _("\
Set limit on string chars or array elements to print."), _("\

View File

@ -81,10 +81,12 @@ struct value_print_options
share one flag, why not Pascal too? */
int pascal_static_field_print;
/* Controls Python pretty-printing. */
/* If non-zero don't do Python pretty-printing. */
int raw;
/* If nonzero, print the value in "summary" form. */
/* If nonzero, print the value in "summary" form.
If raw and summary are both non-zero, don't print non-scalar values
("..." is printed instead). */
int summary;
/* If nonzero, when printing a pointer, print the symbol to which it