* 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:
parent
453e48a5a5
commit
e704570352
@ -1,5 +1,15 @@
|
|||||||
2013-07-17 Doug Evans <dje@google.com>
|
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
|
* cli/cli-cmds.c (init_cmd_lists): Delete unnecessary initialization
|
||||||
of all *list variables.
|
of all *list variables.
|
||||||
|
|
||||||
|
5
gdb/NEWS
5
gdb/NEWS
@ -34,6 +34,11 @@ maint set|show per-command symtab
|
|||||||
|
|
||||||
* New options
|
* 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
|
set remote trace-status-packet
|
||||||
show remote trace-status-packet
|
show remote trace-status-packet
|
||||||
Set/show the use of remote protocol qTStatus packet.
|
Set/show the use of remote protocol qTStatus packet.
|
||||||
|
@ -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>
|
2013-07-02 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
* gdb.texinfo (Target Commands): Don't mention "target nrom".
|
* gdb.texinfo (Target Commands): Don't mention "target nrom".
|
||||||
|
@ -9030,6 +9030,18 @@ thus speeding up the display of each Ada frame.
|
|||||||
@item show print frame-arguments
|
@item show print frame-arguments
|
||||||
Show how the value of arguments should be displayed when printing a frame.
|
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}
|
@anchor{set print entry-values}
|
||||||
@item set print entry-values @var{value}
|
@item set print entry-values @var{value}
|
||||||
@kindex set print entry-values
|
@kindex set print entry-values
|
||||||
|
@ -107,6 +107,10 @@ extern struct cmd_list_element *setprintlist;
|
|||||||
|
|
||||||
extern struct cmd_list_element *showprintlist;
|
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 *setprinttypelist;
|
||||||
|
|
||||||
extern struct cmd_list_element *showprinttypelist;
|
extern struct cmd_list_element *showprinttypelist;
|
||||||
|
13
gdb/stack.c
13
gdb/stack.c
@ -65,6 +65,9 @@ static const char *const print_frame_arguments_choices[] =
|
|||||||
{"all", "scalars", "none", NULL};
|
{"all", "scalars", "none", NULL};
|
||||||
static const char *print_frame_arguments = "scalars";
|
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
|
/* The possible choices of "set print entry-values", and the value
|
||||||
of this setting. */
|
of this setting. */
|
||||||
|
|
||||||
@ -277,6 +280,7 @@ print_frame_arg (const struct frame_arg *arg)
|
|||||||
|
|
||||||
get_no_prettyformat_print_options (&opts);
|
get_no_prettyformat_print_options (&opts);
|
||||||
opts.deref_ref = 1;
|
opts.deref_ref = 1;
|
||||||
|
opts.raw = print_raw_frame_arguments;
|
||||||
|
|
||||||
/* True in "summary" mode, false otherwise. */
|
/* True in "summary" mode, false otherwise. */
|
||||||
opts.summary = !strcmp (print_frame_arguments, "scalars");
|
opts.summary = !strcmp (print_frame_arguments, "scalars");
|
||||||
@ -2640,6 +2644,15 @@ Usage: func <name>\n"));
|
|||||||
_("Show printing of non-scalar frame arguments"),
|
_("Show printing of non-scalar frame arguments"),
|
||||||
NULL, NULL, NULL, &setprintlist, &showprintlist);
|
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,
|
add_setshow_auto_boolean_cmd ("disassemble-next-line", class_stack,
|
||||||
&disassemble_next_line, _("\
|
&disassemble_next_line, _("\
|
||||||
Set whether to disassemble next source line or insn when execution stops."),
|
Set whether to disassemble next source line or insn when execution stops."),
|
||||||
|
@ -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>
|
2013-07-16 Andrew Burgess <aburgess@broadcom.com>
|
||||||
|
|
||||||
* gdb.base/printcmds.exp (test_printf): Add tests for format
|
* gdb.base/printcmds.exp (test_printf): Add tests for format
|
||||||
|
60
gdb/testsuite/gdb.python/py-frame-args.c
Normal file
60
gdb/testsuite/gdb.python/py-frame-args.c
Normal 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;
|
||||||
|
}
|
70
gdb/testsuite/gdb.python/py-frame-args.exp
Normal file
70
gdb/testsuite/gdb.python/py-frame-args.exp
Normal 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}
|
75
gdb/testsuite/gdb.python/py-frame-args.py
Normal file
75
gdb/testsuite/gdb.python/py-frame-args.py
Normal 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)
|
@ -76,6 +76,9 @@ struct converted_character
|
|||||||
typedef struct converted_character converted_character_d;
|
typedef struct converted_character converted_character_d;
|
||||||
DEF_VEC_O (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 */
|
/* Prototypes for local functions */
|
||||||
|
|
||||||
@ -2686,6 +2689,21 @@ show_print (char *args, int from_tty)
|
|||||||
{
|
{
|
||||||
cmd_show_list (showprintlist, 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
|
void
|
||||||
_initialize_valprint (void)
|
_initialize_valprint (void)
|
||||||
@ -2703,6 +2721,14 @@ _initialize_valprint (void)
|
|||||||
add_alias_cmd ("p", "print", no_class, 1, &showlist);
|
add_alias_cmd ("p", "print", no_class, 1, &showlist);
|
||||||
add_alias_cmd ("pr", "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,
|
add_setshow_uinteger_cmd ("elements", no_class,
|
||||||
&user_print_options.print_max, _("\
|
&user_print_options.print_max, _("\
|
||||||
Set limit on string chars or array elements to print."), _("\
|
Set limit on string chars or array elements to print."), _("\
|
||||||
|
@ -81,10 +81,12 @@ struct value_print_options
|
|||||||
share one flag, why not Pascal too? */
|
share one flag, why not Pascal too? */
|
||||||
int pascal_static_field_print;
|
int pascal_static_field_print;
|
||||||
|
|
||||||
/* Controls Python pretty-printing. */
|
/* If non-zero don't do Python pretty-printing. */
|
||||||
int raw;
|
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;
|
int summary;
|
||||||
|
|
||||||
/* If nonzero, when printing a pointer, print the symbol to which it
|
/* If nonzero, when printing a pointer, print the symbol to which it
|
||||||
|
Loading…
Reference in New Issue
Block a user