diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2020-01-22 18:21:58 +0000 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2020-03-02 18:59:38 +0000 |
commit | 63e163f24fe80fe1509527e6ccfcfb9622f5e99e (patch) | |
tree | 36d85fd9d5a52b110ecfcd4dd5f70fdf4d36304d /gdb/top.c | |
parent | 81b86b9702b5be9d022e9b0c96c1ee2ce339b5b9 (diff) | |
download | fsf-binutils-gdb-63e163f24fe80fe1509527e6ccfcfb9622f5e99e.zip fsf-binutils-gdb-63e163f24fe80fe1509527e6ccfcfb9622f5e99e.tar.gz fsf-binutils-gdb-63e163f24fe80fe1509527e6ccfcfb9622f5e99e.tar.bz2 |
gdb: Allow GDB to _not_ load a previous command history
This commit aims to give a cleaner mechanism by which the user can
prevent GDB from trying to load any previous command history.
Currently the user can change the path to the history file, either
using a command line flag, or by setting the GDBHISTFILE environment
variable, and if the path is set to a non-existent file, then
obviously GDB wont load any command history. However, this feels like
a bit of a bodge, I'd like to add an official mechanism by which we
can disable command history loading.
Why would we want to prevent command history loading? The specific
use case I have is GDB starting with a CWD that is a network mounted
directory, and there is no command history present. Still GDB will
access the network in order to check for the file. In my particular
use case I'm actually starting a large number of GDB instances in
parallel, all in the same network mounted directory, the large number
of network accesses looking for this file introduces a noticeable
delay at GDB startup.
The approach I'm proposing here is a slight adjustment to the current
rules for setting up the history filename. Currently, if a user does
this, they see an error:
(gdb) set history filename
Argument required (filename to set it to.).
However, if a user does this:
$ GDBHISTFILE= gdb --quiet
(gdb) set history save on
(gdb) q
warning: Could not rename -gdb18416~ to : No such file or directory
So, we already have a bug in this area. My plan is to allow the empty
filename to be accepted, and for this to mean, neither load, nor save
the command history.
This does mean that we now have two mechanisms to prevent saving the
command history:
(gdb) set history filename
or
(gdb) set history save off
But the only way to prevent loading the command history is to set the
filename to the empty string _before_ you get to a GDB prompt, either
using a command line option, or the environment variable.
I've updated some of the show commands, for example this session:
(gdb) set history filename
(gdb) show history filename
There is no filename currently set for recording the command history in.
(gdb) show history save
Saving of the history record on exit is off.
(gdb) set history save on
(gdb) show history save
Saving of the history is disabled due to the value of 'history filename'.
(gdb) set history filename /tmp/hist
(gdb) show history save
Saving of the history record on exit is on.
I've updated the manual, and added some tests.
gdb/ChangeLog:
* NEWS: Mention new behaviour of the history filename.
* top.c (write_history_p): Add comment.
(show_write_history_p): Add header comment, give a different
message when history writing is on, but the history filename is
empty.
(history_filename): Add comment.
(history_filename_empty): New function.
(show_history_filename): Add header comment, give a different
message when the filename is empty.
(init_history): Compare history_filename against nullptr, and only
read history if the filename is not empty.
(set_history_filename): Add header comment, and only make
non-empty filenames absolute.
(init_main): Make the filename argument to 'set history filename'
optional.
gdb/doc/ChangeLog:
* gdb.texinfo (Command History): Extend description for
GDBHISTFILE and GDBHISTSIZE, add detail about the filename for
'set history filename' being optional. Describe the effect of an
empty history filename on 'set history save on'.
gdb/testsuite/ChangeLog:
* gdb.base/default.exp: Remove test of 'set history filename'.
* gdb.base/gdbinit-history.exp: Add tests for setting the history
filename to the empty string.
* lib/gdb.exp (gdb_init): Unset environment variables GDBHISTFILE
and GDBHISTSIZE.
Change-Id: Ia586e4311182fac99113b60f11ef8a11fbd5450b
Diffstat (limited to 'gdb/top.c')
-rw-r--r-- | gdb/top.c | 51 |
1 files changed, 41 insertions, 10 deletions
@@ -84,6 +84,8 @@ extern void initialize_all_files (void); +static bool history_filename_empty (void); + #define PROMPT(X) the_prompts.prompt_stack[the_prompts.top + X].prompt #define PREFIX(X) the_prompts.prompt_stack[the_prompts.top + X].prefix #define SUFFIX(X) the_prompts.prompt_stack[the_prompts.top + X].suffix @@ -884,13 +886,22 @@ static bool command_editing_p; /* static */ bool history_expansion_p; +/* Should we write out the command history on exit? In order to write out + the history both this flag must be true, and the history_filename + variable must be set to something sensible. */ static bool write_history_p; + +/* Implement 'show history save'. */ static void show_write_history_p (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (file, _("Saving of the history record on exit is %s.\n"), - value); + if (!write_history_p || !history_filename_empty ()) + fprintf_filtered (file, _("Saving of the history record on exit is %s.\n"), + value); + else + fprintf_filtered (file, _("Saving of the history is disabled due to " + "the value of 'history filename'.\n")); } /* The variable associated with the "set/show history size" @@ -919,14 +930,30 @@ show_history_remove_duplicates (struct ui_file *file, int from_tty, value); } +/* The name of the file in which GDB history will be written. If this is + set to NULL, of the empty string then history will not be written. */ static char *history_filename; + +/* Return true if the history_filename is either NULL or the empty string, + indicating that we should not try to read, nor write out the history. */ +static bool +history_filename_empty (void) +{ + return (history_filename == nullptr || *history_filename == '\0'); +} + +/* Implement 'show history filename'. */ static void show_history_filename (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (file, _("The filename in which to record " - "the command history is \"%ps\".\n"), - styled_string (file_name_style.style (), value)); + if (!history_filename_empty ()) + fprintf_filtered (file, _("The filename in which to record " + "the command history is \"%ps\".\n"), + styled_string (file_name_style.style (), value)); + else + fprintf_filtered (file, _("There is no filename currently set for " + "recording the command history in.\n")); } /* This is like readline(), but it has some gdb-specific behavior. @@ -2017,9 +2044,9 @@ init_history (void) set_readline_history_size (history_size_setshow_var); tmpenv = getenv ("GDBHISTFILE"); - if (tmpenv) + if (tmpenv != nullptr) history_filename = xstrdup (tmpenv); - else if (!history_filename) + else if (history_filename == nullptr) { /* We include the current directory so that if the user changes directories the file written will be the same as the one @@ -2034,7 +2061,9 @@ init_history (void) gdb::unique_xmalloc_ptr<char> temp (gdb_abspath (fname)); history_filename = temp.release (); } - read_history (history_filename); + + if (!history_filename_empty ()) + read_history (history_filename); } static void @@ -2103,6 +2132,8 @@ show_gdb_datadir (struct ui_file *file, int from_tty, gdb_datadir.c_str ())); } +/* Implement 'set history filename'. */ + static void set_history_filename (const char *args, int from_tty, struct cmd_list_element *c) @@ -2110,7 +2141,7 @@ set_history_filename (const char *args, /* We include the current directory so that if the user changes directories the file written will be the same as the one that was read. */ - if (!IS_ABSOLUTE_PATH (history_filename)) + if (!history_filename_empty () && !IS_ABSOLUTE_PATH (history_filename)) { gdb::unique_xmalloc_ptr<char> temp (gdb_abspath (history_filename)); @@ -2217,7 +2248,7 @@ By default this option is set to 0."), show_history_remove_duplicates, &sethistlist, &showhistlist); - add_setshow_filename_cmd ("filename", no_class, &history_filename, _("\ + add_setshow_optional_filename_cmd ("filename", no_class, &history_filename, _("\ Set the filename in which to record the command history."), _("\ Show the filename in which to record the command history."), _("\ (the list of previous commands of which a record is kept)."), |