mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-19 17:18:24 +08:00
* 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:
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)
|
Reference in New Issue
Block a user