[v2,2/3] gdb: New maintenance command to disable bfd sharing.
Commit Message
In some rare maintainer cases it is desirable to be able to disable bfd
sharing. This patch adds new commands maintenance set/show commands for
bfd-sharing, allowing gdb's bfd cache to be turned off.
gdb/ChangeLog:
* gdb_bfd.c (bfd_sharing): New variable.
(gdb_bfd_open): Check bfd_sharing variable.
(_initialize_gdb_bfd): Add new set/show command.
* NEWS: Mention new command.
gdb/doc/ChangeLog:
* gdb.texinfo (Maintenance Commands): Move documentation of "main
info bfds" to...
(File Caching): A New section. Outline bfd caching, and add new
description for "main set/show bfd-sharing".
---
gdb/ChangeLog | 7 +++++++
gdb/NEWS | 4 ++++
gdb/doc/ChangeLog | 7 +++++++
gdb/doc/gdb.texinfo | 35 ++++++++++++++++++++++++++++++-----
gdb/gdb_bfd.c | 29 +++++++++++++++++++++++++----
5 files changed, 73 insertions(+), 9 deletions(-)
Comments
> From: Andrew Burgess <andrew.burgess@embecosm.com>
> Cc: Andrew Burgess <andrew.burgess@embecosm.com>
> Date: Thu, 13 Aug 2015 13:44:59 +0100
>
> In some rare maintainer cases it is desirable to be able to disable bfd
> sharing. This patch adds new commands maintenance set/show commands for
> bfd-sharing, allowing gdb's bfd cache to be turned off.
>
> gdb/ChangeLog:
>
> * gdb_bfd.c (bfd_sharing): New variable.
> (gdb_bfd_open): Check bfd_sharing variable.
> (_initialize_gdb_bfd): Add new set/show command.
> * NEWS: Mention new command.
>
> gdb/doc/ChangeLog:
>
> * gdb.texinfo (Maintenance Commands): Move documentation of "main
> info bfds" to...
> (File Caching): A New section. Outline bfd caching, and add new
> description for "main set/show bfd-sharing".
OK for the documentation parts, with one comment:
> +Control whether @code{bfd} objects can be shared. When sharing is
> +enabled @value{GDBN} will reuse already open @code{bfd} objects rather
^
Please insert a comma where indicated.
Thanks.
On 08/13/2015 01:44 PM, Andrew Burgess wrote:
> In some rare maintainer cases it is desirable to be able to disable bfd
> sharing. This patch adds new commands maintenance set/show commands for
> bfd-sharing, allowing gdb's bfd cache to be turned off.
> * Support for process record-replay and reverse debugging on aarch64*-linux*
> diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
> index 846ac24..9d553db 100644
> --- a/gdb/doc/ChangeLog
> +++ b/gdb/doc/ChangeLog
> @@ -1,3 +1,10 @@
> +2015-08-11 Andrew Burgess <andrew.burgess@embecosm.com>
> +
> + * gdb.texinfo (Maintenance Commands): Move documentation of "main
> + info bfds" to...
> + (File Caching): A New section. Outline bfd caching, and add new
> + description for "main set/show bfd-sharing".
> +
> 2015-08-07 Pedro Alves <palves@redhat.com>
>
> * gdb.texinfo (Maintenance Commands): Document "maint set/show
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 900970b..3cfb1a7 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -18190,6 +18190,36 @@ Set whether a source file may have multiple base names.
> Show whether a source file may have multiple base names.
> @end table
>
> +@node File Caching
> +@section File Caching
> +@cindex caching of opened files
> +@cindex caching of bfd objects
> +
> +To speed up file loading, and reduce memory usage, @value{GDBN} will
> +reuse the @code{bfd} objects used to track open files. @xref{Top, ,
> +BFD, bfd, The Binary File Descriptor Library}. The following commands
> +allow visibility and control of the caching beaviour.
typo "beaviour". (While at it, I think the manual is meant to
standardize on USA spelling, thus "behavior".)
> +
> +@table @code
> +@kindex maint info bfds
> +@item maint info bfds
> +This prints information about each @code{bfd} object that is known to
> +@value{GDBN}.
> +
> +@kindex maint set bfd-sharing
> +@kindex maint show bfd-sharing
> +@kindex bfd caching
> +@item maint set bfd-sharing
> +@item maint show bfd-sharing
> +Control whether @code{bfd} objects can be shared. When sharing is
> +enabled @value{GDBN} will reuse already open @code{bfd} objects rather
I believe present tense is preferred in the manual, like:
s/will reuse/reuses/
> +than reopening the same file. Turning sharing off does not cause
> +already shared @code{bfd} objects to be unshared, but all future files
> +that are opened will create a new @code{bfd} object. Similarly,
> +re-enabling sharing will not cause multiple existing @code{bfd}
...re-enabling sharing does not cause...
> +objects to be collapsed into a single shared @code{bfd} object.
> +@end table
> +
> @node Separate Debug Files
> @section Debugging Information in Separate Files
> @cindex separate debugging information files
> @@ -33987,11 +34017,6 @@ Shared library events.
> @@ -111,6 +111,11 @@ DEFINE_REGISTRY (bfd, GDB_BFD_DATA_ACCESSOR)
>
> static htab_t gdb_bfd_cache;
>
> +/* When true gdb will reuse an existing bfd object if the filename,
> + modification time, and file size all match. */
> +
> +static int bfd_sharing;
Initialize it here? Like:
static int bfd_sharing = 1;
> gdb_bfd_ref (abfd);
> return abfd;
> @@ -942,4 +950,17 @@ _initialize_gdb_bfd (void)
> add_cmd ("bfds", class_maintenance, maintenance_info_bfds, _("\
> List the BFDs that are currently open."),
> &maintenanceinfolist);
> +
> + add_setshow_boolean_cmd ("bfd-sharing", no_class,
> + &bfd_sharing, _("\
> +Set whether gdb will share bfds that appear to be the same file."), _("\
> +Show whether gdb will share bfds that appear to be the same file."), _("\
> +When enabled gdb will reuse existing bfds rather than reopening the\n\
> +same file. To decide if two files are the same then gdb compares the\n\
> +filename, file size, file modification time, and file inode."),
> + NULL,
> + NULL,
Please add a show hook, for i18n.
> + &maintenance_set_cmdlist,
> + &maintenance_show_cmdlist);
> + bfd_sharing = 1;
See above.
> }
>
Otherwise LGTM.
Thanks,
Pedro Alves
@@ -1,5 +1,12 @@
2015-08-11 Andrew Burgess <andrew.burgess@embecosm.com>
+ * gdb_bfd.c (bfd_sharing): New variable.
+ (gdb_bfd_open): Check bfd_sharing variable.
+ (_initialize_gdb_bfd): Add new set/show command.
+ * NEWS: Mention new command.
+
+2015-08-11 Andrew Burgess <andrew.burgess@embecosm.com>
+
* gdb_bfd.c (struct gdb_bfd_data): Add size, inode, and device id
field.
(struct gdb_bfd_cache_search): Likewise.
@@ -16,6 +16,10 @@ maint show target-non-stop
"set non-stop" is "off". The default is "auto", meaning non-stop
mode is enabled if supported by the target.
+maint set bfd-sharing
+maint show bfd-sharing
+ Control the reuse of bfd objects.
+
*** Changes in GDB 7.10
* Support for process record-replay and reverse debugging on aarch64*-linux*
@@ -1,3 +1,10 @@
+2015-08-11 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.texinfo (Maintenance Commands): Move documentation of "main
+ info bfds" to...
+ (File Caching): A New section. Outline bfd caching, and add new
+ description for "main set/show bfd-sharing".
+
2015-08-07 Pedro Alves <palves@redhat.com>
* gdb.texinfo (Maintenance Commands): Document "maint set/show
@@ -18190,6 +18190,36 @@ Set whether a source file may have multiple base names.
Show whether a source file may have multiple base names.
@end table
+@node File Caching
+@section File Caching
+@cindex caching of opened files
+@cindex caching of bfd objects
+
+To speed up file loading, and reduce memory usage, @value{GDBN} will
+reuse the @code{bfd} objects used to track open files. @xref{Top, ,
+BFD, bfd, The Binary File Descriptor Library}. The following commands
+allow visibility and control of the caching beaviour.
+
+@table @code
+@kindex maint info bfds
+@item maint info bfds
+This prints information about each @code{bfd} object that is known to
+@value{GDBN}.
+
+@kindex maint set bfd-sharing
+@kindex maint show bfd-sharing
+@kindex bfd caching
+@item maint set bfd-sharing
+@item maint show bfd-sharing
+Control whether @code{bfd} objects can be shared. When sharing is
+enabled @value{GDBN} will reuse already open @code{bfd} objects rather
+than reopening the same file. Turning sharing off does not cause
+already shared @code{bfd} objects to be unshared, but all future files
+that are opened will create a new @code{bfd} object. Similarly,
+re-enabling sharing will not cause multiple existing @code{bfd}
+objects to be collapsed into a single shared @code{bfd} object.
+@end table
+
@node Separate Debug Files
@section Debugging Information in Separate Files
@cindex separate debugging information files
@@ -33987,11 +34017,6 @@ Shared library events.
@end table
-@kindex maint info bfds
-@item maint info bfds
-This prints information about each @code{bfd} object that is known to
-@value{GDBN}. @xref{Top, , BFD, bfd, The Binary File Descriptor Library}.
-
@kindex maint info btrace
@item maint info btrace
Pint information about raw branch tracing data.
@@ -111,6 +111,11 @@ DEFINE_REGISTRY (bfd, GDB_BFD_DATA_ACCESSOR)
static htab_t gdb_bfd_cache;
+/* When true gdb will reuse an existing bfd object if the filename,
+ modification time, and file size all match. */
+
+static int bfd_sharing;
+
/* The type of an object being looked up in gdb_bfd_cache. We use
htab's capability of storing one kind of object (BFD in this case)
and using a different sort of object for searching. */
@@ -394,7 +399,7 @@ gdb_bfd_open (const char *name, const char *target, int fd)
opening the BFD may fail; and this would violate hashtab
invariants. */
abfd = htab_find_with_hash (gdb_bfd_cache, &search, hash);
- if (abfd != NULL)
+ if (bfd_sharing && abfd != NULL)
{
close (fd);
gdb_bfd_ref (abfd);
@@ -405,9 +410,12 @@ gdb_bfd_open (const char *name, const char *target, int fd)
if (abfd == NULL)
return NULL;
- slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash, INSERT);
- gdb_assert (!*slot);
- *slot = abfd;
+ if (bfd_sharing)
+ {
+ slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash, INSERT);
+ gdb_assert (!*slot);
+ *slot = abfd;
+ }
gdb_bfd_ref (abfd);
return abfd;
@@ -942,4 +950,17 @@ _initialize_gdb_bfd (void)
add_cmd ("bfds", class_maintenance, maintenance_info_bfds, _("\
List the BFDs that are currently open."),
&maintenanceinfolist);
+
+ add_setshow_boolean_cmd ("bfd-sharing", no_class,
+ &bfd_sharing, _("\
+Set whether gdb will share bfds that appear to be the same file."), _("\
+Show whether gdb will share bfds that appear to be the same file."), _("\
+When enabled gdb will reuse existing bfds rather than reopening the\n\
+same file. To decide if two files are the same then gdb compares the\n\
+filename, file size, file modification time, and file inode."),
+ NULL,
+ NULL,
+ &maintenance_set_cmdlist,
+ &maintenance_show_cmdlist);
+ bfd_sharing = 1;
}