From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1026 invoked by alias); 29 Jun 2013 22:35:15 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 1014 invoked by uid 89); 29 Jun 2013 22:35:14 -0000 X-Spam-SWARE-Status: No, score=-3.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.1 Received: from mail-qc0-f201.google.com (HELO mail-qc0-f201.google.com) (209.85.216.201) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sat, 29 Jun 2013 22:35:13 +0000 Received: by mail-qc0-f201.google.com with SMTP id u11so424722qcx.2 for ; Sat, 29 Jun 2013 15:35:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:subject:date:message-id:mime-version:content-type :x-gm-message-state; bh=cAX7vv8xsb5nPmRtLwd4qEyjKT7wogAiHL+LXBsfnIc=; b=ajJTILpP9C3D9cwuk2EmbvUlCTjcY8vmo5bsNR2hfzuA652YOW09b7kzdzWpMeG0WH Z7sOc9wEmXhrkulrB7WyRR03A+6Kyp5y6EcOVh0DBYbEgliA0iccvITjHG19/LAeH7kb kiBTkW0QQ+9sy8p7XlkxV8uzS4wgKtYeRbJvsp15Se3ZfQ4GycNsa7yTJFZvOI2BAZzf pTYFfRfpN5XZu/ezQLTzhV/tjSDcTy4OHdVTe5LTtagpoYVAa18EM04azNDykx5eaU6i UeLuZpHzQJB7XMGQ296wbsGSRvpMfEq6x4WtoO0tdU2Dt5WNchpfPSBqT6P455yGyI0d RxBg== X-Received: by 10.236.156.33 with SMTP id l21mr10066052yhk.18.1372545311167; Sat, 29 Jun 2013 15:35:11 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id x42si7524201yha.7.2013.06.29.15.35.11 for (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Sat, 29 Jun 2013 15:35:11 -0700 (PDT) Received: from ruffy.mtv.corp.google.com (ruffy.mtv.corp.google.com [172.17.128.44]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id BF7E75A4016 for ; Sat, 29 Jun 2013 15:35:10 -0700 (PDT) From: Doug Evans To: gdb-patches@sourceware.org Subject: [RFA, doc RFA] set print frame-arguments-raw on|off Date: Sun, 30 Jun 2013 00:37:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Gm-Message-State: ALoCoQkn7V30xiDJCnst5kIsksrhoibT1lj1B0B+t2pourt3CmMuEe2n9znsygB92Ur0xpMR7TZ7Zwn0GreOkhZ4/wvlPER+D9iK4Ud9O6AnvzWt7VftNLopzl60hrkSh/JJi/u9UCn7DPqwSoOAp0W4KTpgbLIasJ+E3s42h0ocrKZNBK2yW/LdshGVDjzrv4s3JvavtWiXjMGJf9PcukVEeOuLcDNTieHK6HjUWAJyyiPOo+aIYvc= X-SW-Source: 2013-06/txt/msg00935.txt.bz2 Hi. Sometimes it's nice to print stack frame arguments in raw form. [And not just as one-offs, but as the default.] I thought of extending "set print frame-arguments" into something like none, raw-scalars, raw-all, scalars, all. But I like this better: raw-vs-pretty is orthogonal to scalars-vs-all. E.g., If we later extend "print frame-arguments" it'll be easier if raw-ness is a separate parameter. A later patch can add, e.g., /r (etc.) options to "bt" and "frame" to override the default settings. Ok to check in? 2013-06-29 Doug Evans * stack.c (print_frame_arguments_raw): New static global. (print_frame_arg): Set opts.raw from print_frame_arguments_raw. (_initialize_stack): Add "print frame-arguments-raw" parameter. * valprint.h (value_print_options): Improve comments. doc/ * gdb.texinfo (Print Settings): Document "print frame-arguments-raw". 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. Index: stack.c =================================================================== RCS file: /cvs/src/src/gdb/stack.c,v retrieving revision 1.273 diff -u -p -r1.273 stack.c --- stack.c 12 Jun 2013 12:16:47 -0000 1.273 +++ stack.c 29 Jun 2013 22:11:03 -0000 @@ -65,6 +65,9 @@ static const char *const print_frame_arg {"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_frame_arguments_raw; + /* 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 get_raw_print_options (&opts); opts.deref_ref = 1; + opts.raw = print_frame_arguments_raw; /* True in "summary" mode, false otherwise. */ opts.summary = !strcmp (print_frame_arguments, "scalars"); @@ -2644,6 +2648,15 @@ Usage: func \n")); _("Show printing of non-scalar frame arguments"), NULL, NULL, NULL, &setprintlist, &showprintlist); + add_setshow_boolean_cmd ("frame-arguments-raw", no_class, + &print_frame_arguments_raw, _("\ +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, + &setprintlist, &showprintlist); + 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."), Index: valprint.h =================================================================== RCS file: /cvs/src/src/gdb/valprint.h,v retrieving revision 1.46 diff -u -p -r1.46 valprint.h --- valprint.h 13 Mar 2013 18:34:54 -0000 1.46 +++ valprint.h 29 Jun 2013 22:11:03 -0000 @@ -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 Index: doc/gdb.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v retrieving revision 1.1099 diff -u -p -r1.1099 gdb.texinfo --- doc/gdb.texinfo 26 Jun 2013 08:17:26 -0000 1.1099 +++ doc/gdb.texinfo 29 Jun 2013 22:11:03 -0000 @@ -9030,6 +9030,17 @@ thus speeding up the display of each Ada @item show print frame-arguments Show how the value of arguments should be displayed when printing a frame. +@item set print frame-arguments-raw on +Print frame arguments in raw, non pretty-printed, form. + +@item set print frame-arguments-raw 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. + +@item show print frame-arguments-raw +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 Index: testsuite/gdb.python/py-frame-args.c =================================================================== RCS file: testsuite/gdb.python/py-frame-args.c diff -N testsuite/gdb.python/py-frame-args.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.python/py-frame-args.c 29 Jun 2013 22:11:03 -0000 @@ -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 . */ + +#include + +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; +} Index: testsuite/gdb.python/py-frame-args.exp =================================================================== RCS file: testsuite/gdb.python/py-frame-args.exp diff -N testsuite/gdb.python/py-frame-args.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.python/py-frame-args.exp 29 Jun 2013 22:11:03 -0000 @@ -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 . + +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 frame-arguments-raw 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 frame-arguments-raw 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} Index: testsuite/gdb.python/py-frame-args.py =================================================================== RCS file: testsuite/gdb.python/py-frame-args.py diff -N testsuite/gdb.python/py-frame-args.py --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.python/py-frame-args.py 29 Jun 2013 22:11:03 -0000 @@ -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 . + +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)