gdb: New maintenance command to disable bfd sharing.

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.
	(show_bfd_sharing): New function.
	(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".
This commit is contained in:
Andrew Burgess 2015-04-13 16:31:21 +01:00
parent c04fe68f6b
commit 18989b3c56
5 changed files with 79 additions and 9 deletions

View File

@ -1,3 +1,11 @@
2015-08-18 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb_bfd.c (bfd_sharing): New variable.
(show_bfd_sharing): New function.
(gdb_bfd_open): Check bfd_sharing variable.
(_initialize_gdb_bfd): Add new set/show command.
* NEWS: Mention new command.
2015-08-18 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb_bfd.c (struct gdb_bfd_data): Add size, inode, and device id

View File

@ -20,6 +20,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.
* The "disassemble" command accepts a new modifier: /s.
It prints mixed source+disassembly like /m with two differences:
- disassembled instructions are now printed in program order, and

View File

@ -1,3 +1,10 @@
2015-08-18 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-14 Doug Evans <xdje42@gmail.com>
* gdb.texinfo (Machine Code): Update docs for mixed source/assembly

View File

@ -18343,6 +18343,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 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} reuses 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 does 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
@ -34162,11 +34192,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.

View File

@ -111,6 +111,17 @@ 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 = 1;
static void
show_bfd_sharing (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
fprintf_filtered (file, _("BFD sharing is %s.\n"), value);
}
/* 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 +405,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 +416,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 +956,16 @@ _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,
&show_bfd_sharing,
&maintenance_set_cmdlist,
&maintenance_show_cmdlist);
}