diff options
author | Doug Evans <dje@google.com> | 2013-07-17 20:35:11 +0000 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2013-07-17 20:35:11 +0000 |
commit | e7045703528f2fb0d4cadf2ddab16d1887046f35 (patch) | |
tree | 627d5ca62a8379cc2eb29a718094adb3334ccd9f /gdb/testsuite/gdb.python | |
parent | 453e48a5a576472ddf5b099a1c0a0e00ff1da657 (diff) | |
download | gdb-e7045703528f2fb0d4cadf2ddab16d1887046f35.zip gdb-e7045703528f2fb0d4cadf2ddab16d1887046f35.tar.gz gdb-e7045703528f2fb0d4cadf2ddab16d1887046f35.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/testsuite/gdb.python')
-rw-r--r-- | gdb/testsuite/gdb.python/py-frame-args.c | 60 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-frame-args.exp | 70 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-frame-args.py | 75 |
3 files changed, 205 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.python/py-frame-args.c b/gdb/testsuite/gdb.python/py-frame-args.c new file mode 100644 index 0000000..7cc3dbe --- /dev/null +++ b/gdb/testsuite/gdb.python/py-frame-args.c @@ -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; +} diff --git a/gdb/testsuite/gdb.python/py-frame-args.exp b/gdb/testsuite/gdb.python/py-frame-args.exp new file mode 100644 index 0000000..ff082dd --- /dev/null +++ b/gdb/testsuite/gdb.python/py-frame-args.exp @@ -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} diff --git a/gdb/testsuite/gdb.python/py-frame-args.py b/gdb/testsuite/gdb.python/py-frame-args.py new file mode 100644 index 0000000..65c9ad7 --- /dev/null +++ b/gdb/testsuite/gdb.python/py-frame-args.py @@ -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) |