From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30902 invoked by alias); 30 Jun 2013 03:12:45 -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 30891 invoked by uid 89); 30 Jun 2013 03:12:44 -0000 X-Spam-SWARE-Status: No, score=-4.6 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.1 Received: from mail-ve0-f202.google.com (HELO mail-ve0-f202.google.com) (209.85.128.202) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sun, 30 Jun 2013 03:12:40 +0000 Received: by mail-ve0-f202.google.com with SMTP id m1so436403ves.3 for ; Sat, 29 Jun 2013 20:12:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:mime-version:content-type:content-transfer-encoding:message-id :date:to:subject:in-reply-to:references:x-mailer:x-gm-message-state; bh=zaTVNtbVeOdns+uq2/Neahp+rrC2WFsfSf3hQOXkrKs=; b=QR54Powr5VnCRJXjy8AnGvtyRDD3aLfRccnL9SoJdd/RYn7mFcfr3vxrKSbY/runRg DNXeFZNiEVTKCPS+f/75rwK1hNxgcUb2iIE8hyxUftA6Najr3mCXiWjmLt+m+SyxUajL Cx3P3U5a8Mjz6EBHUC5KWF8pGdRwt5mY0/jNnrr0Q8xyicRT+LCv5eyPGkM4r1X3RVqY xRWnLXakZCzJE0WItgNKfX3GOJYw+Oo5kO5XK3bwiaSabTHf5P5P0I0iSUSn4DyG4DpR 61npoFxps7JQq2c9viENCOVgKLS2VtBqAKvY/iMXuC2WS95xmXtk3tkRPVZ+sc61zj88 xJjw== X-Received: by 10.236.148.101 with SMTP id u65mr11268954yhj.47.1372561958195; Sat, 29 Jun 2013 20:12:38 -0700 (PDT) Received: from corp2gmr1-1.hot.corp.google.com (corp2gmr1-1.hot.corp.google.com [172.24.189.92]) by gmr-mx.google.com with ESMTPS id f68si343020yhd.4.2013.06.29.20.12.38 for (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Sat, 29 Jun 2013 20:12:38 -0700 (PDT) Received: from ruffy.mtv.corp.google.com (ruffy.mtv.corp.google.com [172.17.128.44]) by corp2gmr1-1.hot.corp.google.com (Postfix) with ESMTP id CD7BC31C022 for ; Sat, 29 Jun 2013 20:12:37 -0700 (PDT) From: Doug Evans MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <20943.41509.270378.842286@ruffy.mtv.corp.google.com> Date: Sun, 30 Jun 2013 14:58:00 -0000 To: gdb-patches@sourceware.org Subject: Re: [RFA, doc RFA] set print frame-arguments-raw on|off In-Reply-To: References: X-Gm-Message-State: ALoCoQl/TbSsjWJqxtDjJaZUqThRaJmLHlQ1hw6YEfyrMTxgGlJqfbEEhe65A6SlE6BCqXgAr2SBvm80f0Mi7O0pvqjXhkigdYnLne2sZeNr1rLbFc1qoHsENcoDp7S8bM6lTiZaIZVuPQjmuDJUHcJCMDv8ZK2cKzOmC7UrNjXmY6UdFf+LYSQqZ+KkMz6S8Z1dHD2UYwYtq+BgaHsCBprsJwbRPUlhvxC+LnYThAOwBWkG/0AKkfI= X-SW-Source: 2013-06/txt/msg00938.txt.bz2 Doug Evans writes: > 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. Blech. This time with a NEWS entry. 2013-06-29 Doug Evans * NEWS: Mention "set print frame-arguments-raw". * 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: NEWS =================================================================== RCS file: /cvs/src/src/gdb/NEWS,v retrieving revision 1.605 diff -u -p -r1.605 NEWS --- NEWS 26 Jun 2013 08:17:26 -0000 1.605 +++ NEWS 30 Jun 2013 03:02:56 -0000 @@ -34,6 +34,11 @@ maint set|show per-command symtab * New options +set print frame-arguments-raw +show print frame-arguments-raw + Set/show whether to print frame arguments in raw mode, + not pretty-printed. + set remote trace-status-packet show remote trace-status-packet Set/show the use of remote protocol qTStatus packet. 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)