set varsize-limit: New GDB setting for maximum dynamic object size
authorJoel Brobecker <brobecker@adacore.com>
Tue, 27 Mar 2018 14:17:45 +0000 (09:17 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Tue, 27 Mar 2018 14:17:45 +0000 (10:17 -0400)
This is a command we somehow forgot to contribute at the time the Ada
language was first contributed to the FSF. This command allows
the user to change the maximum size we allow when reading memory
from dynamic objects (the default is 65536 bytes).

At the moment, this limit is only used by Ada, and so the implementation
is kept inside ada-lang.c. However, it is conceivable that other language
might want to use it also to handle the same kind of issues; for instance,
this might be useful when handling dynamic types in C. So the name
of the setting was made language-neutral, to allow for this.

Note that an alias for "set var" needs to be introduced as well.
We are not adding a test for that, since this is a feature that is
already exercized by numerous existing tests.

gdb/ChangeLog

        * NEWS: Add entry describing new "set|show varsize-limit" command.
        * ada-lang.c (_initialize_ada_language): Add "set/show varsize-limit"
        command.
        * printcmd.c (_initialize_printcmd): Add "set var" alias of
        "set variable".

gdb/doc/ChangeLog:

        * gdb.texinfo (Ada Settings): New subsubsection.

gdb/testsuite/ChangeLog:

        * gdb.ada/varsize_limit: New testcase.

Tested on x86_64-linux.

gdb/ChangeLog
gdb/NEWS
gdb/ada-lang.c
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/printcmd.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/varsize_limit.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/varsize_limit/pck.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/varsize_limit/pck.ads [new file with mode: 0644]
gdb/testsuite/gdb.ada/varsize_limit/vsizelim.adb [new file with mode: 0644]

index e78bfcb879558a78a16f8e811faccf00a59b090e..79c981de219f57c4f533b4774362db6dde9ae72b 100644 (file)
@@ -1,3 +1,11 @@
+2018-03-27  Joel Brobecker  <brobecker@adacore.com>
+
+       * NEWS: Add entry describing new "set|show varsize-limit" command.
+       * ada-lang.c (_initialize_ada_language): Add "set/show varsize-limit"
+       command.
+       * printcmd.c (_initialize_printcmd): Add "set var" alias of
+       "set variable".
+
 2018-03-27  Simon Marchi  <simon.marchi@ericsson.com>
 
        * Makefile.in (COMMON_SFILES): Add dwarf-index-common.c and
index 36790900de98904843c112ef59838fdc4df3f1f5..ef0313d97addb5b4489f887d38d7cffbbb85b18b 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -12,6 +12,11 @@ set debug fbsd-nat
 show debug fbsd-nat
   Control display of debugging info regarding the FreeBSD native target.
 
+set|show varsize-limit
+  This new setting allows the user to control the maximum size of Ada
+  objects being printed when those objects have a variable type,
+  instead of that maximum size being hardcoded to 65536 bytes.
+
 * New targets
 
 RiscV ELF                      riscv*-*-elf
index 191b7e44247ca46d37453934479a77d87ed139fe..505d0592446f54256e98eed389e81eddf1ae795a 100644 (file)
@@ -14689,6 +14689,13 @@ With an argument, catch only exceptions with the given name."),
                     CATCH_TEMPORARY);
 
   varsize_limit = 65536;
+  add_setshow_uinteger_cmd ("varsize-limit", class_support,
+                           &varsize_limit, _("\
+Set the maximum number of bytes allowed in a variable-size object."), _("\
+Show the maximum number of bytes allowed in a variable-size object."), _("\
+Attempts to access an object whose size is not a compile-time constant\n\
+and exceeds this limit will cause an error."),
+                           NULL, NULL, &setlist, &showlist);
 
   add_info ("exceptions", info_exceptions_command,
            _("\
index 4da77deb85ce0540cb682fcca24df142a677b2d7..f11fa0c3e1266ff784c5904ad6148b262fd9c9d2 100644 (file)
@@ -1,3 +1,7 @@
+2018-03-27  Joel Brobecker  <brobecker@adacore.com>
+
+       * gdb.texinfo (Ada Settings): New subsubsection.
+
 2018-03-26  Tom Tromey  <tom@tromey.com>
 
        PR backtrace/15582:
index d37b107a51da4b45ff587aab8e17e5d30a659679..bd20b39c63d9abc76691e653585b9550a7e8fb26 100644 (file)
@@ -16272,6 +16272,7 @@ to be difficult.
 * Ada Tasks and Core Files::    Tasking Support when Debugging Core Files
 * Ravenscar Profile::           Tasking Support when using the Ravenscar
                                    Profile
+* Ada Settings::                New settable GDB parameters for Ada.
 * Ada Glitches::                Known peculiarities of Ada mode.
 @end menu
 
@@ -16927,6 +16928,37 @@ using the Ravenscar Profile.
 
 @end table
 
+@node Ada Settings
+@subsubsection Ada Settings
+@cindex Ada settings
+
+@table @code
+@kindex set varsize-limit
+@item set varsize-limit @var{size}
+Prevent @value{GDBN} from attempting to evaluate objects whose size
+is above the given limit (@var{size}) when those sizes are computed
+from run-time quantities.  This is typically the case when the object
+has a variable size, such as an array whose bounds are not known at
+compile time for example.  Setting @var{size} to @code{unlimited}
+removes the size limitation.  By default, the limit is about 65KB.
+
+The purpose of having such a limit is to prevent @value{GDBN} from
+trying to grab enormous chunks of virtual memory when asked to evaluate
+a quantity whose bounds have been corrupted or have not yet been fully
+initialized.  The limit applies to the results of some subexpressions
+as well as to complete expressions.  For example, an expression denoting
+a simple integer component, such as @code{x.y.z}, may fail if the size of
+@code{x.y} is variable and exceeds @code{size}.  On the other hand,
+@value{GDBN} is sometimes clever; the expression @code{A(i)}, where
+@code{A} is an array variable with non-constant size, will generally
+succeed regardless of the bounds on @code{A}, as long as the component
+size is less than @var{size}.
+
+@kindex show varsize-limit
+@item show varsize-limit
+Show the limit on types whose size is determined by run-time quantities.
+@end table
+
 @node Ada Glitches
 @subsubsection Known Peculiarities of Ada Mode
 @cindex Ada, problems
index dd81d8fda13c2954dd89e254b99874da787da6e1..58bdac61921e4505b1bedddb7a2394aca4a2ac12 100644 (file)
@@ -2737,6 +2737,7 @@ with $), a register (a few standard names starting with $), or an actual\n\
 variable in the program being debugged.  EXP is any valid expression.\n\
 This may usually be abbreviated to simply \"set\"."),
           &setlist);
+  add_alias_cmd ("var", "variable", class_vars, 0, &setlist);
 
   c = add_com ("print", class_vars, print_command, _("\
 Print value of expression EXP.\n\
index 8dffab55da99557f89859cb9416928661ebcb990..806744dd45b2a5a1fd74f598d097050dae03bd90 100644 (file)
@@ -1,3 +1,7 @@
+2018-03-27  Joel Brobecker  <brobecker@adacore.com>
+
+       * gdb.ada/varsize_limit: New testcase.
+
 2018-03-27  Joel Brobecker  <brobecker@adacore.com>
 
        * gdb.ada/maint_with_ada.exp: Remove PR gdb/22670 setup_kfail.
diff --git a/gdb/testsuite/gdb.ada/varsize_limit.exp b/gdb/testsuite/gdb.ada/varsize_limit.exp
new file mode 100644 (file)
index 0000000..b201755
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright 2018 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/>.
+
+load_lib "ada.exp"
+
+standard_ada_testfile vsizelim
+
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
+  return -1
+}
+
+clean_restart ${testfile}
+
+set bp_location [gdb_get_line_number "STOP" ${testdir}/vsizelim.adb]
+if ![runto "vsizelim.adb:$bp_location" ] then {
+  perror "Couldn't run ${testfile}"
+  return
+}
+
+gdb_test_no_output "set varsize-limit 16"
+
+gdb_test "print small" " = \"1234567890\""
+
+gdb_test "print larger" "object size is larger than varsize-limit.*"
+
+
diff --git a/gdb/testsuite/gdb.ada/varsize_limit/pck.adb b/gdb/testsuite/gdb.ada/varsize_limit/pck.adb
new file mode 100644 (file)
index 0000000..d4acf86
--- /dev/null
@@ -0,0 +1,25 @@
+--  Copyright 2018 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/>.
+
+package body Pck is
+   procedure Do_Nothing (A : System.Address) is
+   begin
+      null;
+   end Do_Nothing;
+   function Ident (S : String) return String is
+   begin
+      return S;
+   end Ident;
+end Pck;
diff --git a/gdb/testsuite/gdb.ada/varsize_limit/pck.ads b/gdb/testsuite/gdb.ada/varsize_limit/pck.ads
new file mode 100644 (file)
index 0000000..b0043fa
--- /dev/null
@@ -0,0 +1,20 @@
+--  Copyright 2018 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/>.
+
+with System;
+package Pck is
+   procedure Do_Nothing (A : System.Address);
+   function Ident (S : String) return String;
+end Pck;
diff --git a/gdb/testsuite/gdb.ada/varsize_limit/vsizelim.adb b/gdb/testsuite/gdb.ada/varsize_limit/vsizelim.adb
new file mode 100644 (file)
index 0000000..e65ebfd
--- /dev/null
@@ -0,0 +1,23 @@
+--  Copyright 2018 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/>.
+
+with Pck; use Pck;
+procedure VsizeLim is
+   Small : String := Ident ("1234567890");
+   Larger : String := Ident ("1234567890|1234567890|1234567890");
+begin
+   Do_Nothing (Small'Address); -- STOP
+   Do_Nothing (Larger'Address);
+end VsizeLim;