From: Pedro Alves <palves@redhat.com>
To: Patrick Palka <patrick@parcs.ath.cx>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] Append to input history file instead of overwriting it
Date: Fri, 05 Dec 2014 10:45:00 -0000 [thread overview]
Message-ID: <54818CCE.5010701@redhat.com> (raw)
In-Reply-To: <alpine.DEB.2.11.1412041913060.2232@idea>
On 12/05/2014 12:19 AM, Patrick Palka wrote:
> On Thu, 4 Dec 2014, Pedro Alves wrote:
>
>> On 11/29/2014 02:01 AM, Patrick Palka wrote:
>>> This patch makes readline append new history lines to the GDB history
>>> file on exit instead of overwriting the entire history file on exit.
>>> This change allows us to run multiple simultaneous GDB sessions without
>>> having each session overwrite the added history of each other session on
>>> exit. It is particularly helpful when debugging GDB with GDB.
>>>
>>> Does this look OK to commit? Tested on x86_64-unknown-linux-gnu.
>>
>> Does this mean the history file will keep growing forever, rather than
>> be trimmed by the history size?
>
> That it does... my .gdb_history is up to 2200 lines already!
>
> Looks like we have to explicitly truncate the history file on exit after
> appending to it. Here's v2 of the patch that initializes the static
> variable command_count, and calls history_truncate_file() appropriately.
> Does it look OK?
I'd like to hear how does bash (the canonical readline/history user)
handle this scenario, if at all. It seems like we're opening ourselves
up for more chances of history file corruption, considering that e.g.,
you may be quitting several gdb's simultaneously (e.g., when SIGTERM
is sent to all processes). A single write call with O_APPEND should
be atomic, but history_do_write uses mmap if available. And then
seems like the truncation operation could end up with a broken hist
file as well.
ISTM that if we go this path, we should be doing an atomic update:
create a new file under a parallel name, and then move to final destination.
> This patch makes readline append new history lines to the GDB history
> file on exit instead of overwriting the entire history file on exit.
> This change allows us to run multiple simultaneous GDB sessions without
> having each session overwrite the added history of each other session on
> exit.
> It is particularly helpful when debugging GDB with GDB.
I'd like to have the description of how this helps that use case
expanded. I mean, why would you want the history of the top
level gdb mixed with the inferior gdb's history? Like, in:
$ ./gdb ./gdb
(top-gdb) b foo; whatever
(top-gdb) run
(gdb) whatever commands to trigger bug
(gdb) quit // appends "whatever commands to trigger bug" to history
(top-gdb) quit // appends commands to history
$ ./gdb ./gdb
(top-gdb) show commands // history contains top gdb's commands.
(top-gdb) run
(gdb) most recent history is the top-gdb's history
I'd suggest that a better way to handle that use case is to start
the inferior gdb with a different history file, like, e.g.:
$ export g="./gdb -data-directory=data-directory"
$ gdb --args $g -ex "set history file /tmp/hist"
(I have that $g export in my .bashrc, since I use it so often.)
>
> gdb/ChangeLog:
>
> * top.h (gdb_add_history): Declare.
> * top.c (command_count): New variable.
> (gdb_add_history): New function.
> (quit_force): Append to history file instead of overwriting it.
> Truncate the history file afterwards.
> (command_line_input): Use gdb_add_history instead of
> add_history.
> * event-top.c (command_line_handler): Likewise.
> ---
> gdb/event-top.c | 2 +-
> gdb/top.c | 20 +++++++++++++++++---
> gdb/top.h | 2 ++
> 3 files changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/gdb/event-top.c b/gdb/event-top.c
> index cb438ac..490bca6 100644
> --- a/gdb/event-top.c
> +++ b/gdb/event-top.c
> @@ -667,7 +667,7 @@ command_line_handler (char *rl)
>
> /* Add line to history if appropriate. */
> if (*linebuffer && input_from_terminal_p ())
> - add_history (linebuffer);
> + gdb_add_history (linebuffer);
>
> /* Note: lines consisting solely of comments are added to the command
> history. This is useful when you type a command, and then
> diff --git a/gdb/top.c b/gdb/top.c
> index c4b5c2c..9a5ed1e 100644
> --- a/gdb/top.c
> +++ b/gdb/top.c
> @@ -895,7 +895,20 @@ gdb_rl_operate_and_get_next (int count, int key)
>
> return rl_newline (1, key);
> }
> -
> +
> +/* Number of user commands executed during this session. */
> +
> +static int command_count = 0;
> +
> +/* Add the user command COMMAND to the input history list. */
> +
> +void
> +gdb_add_history (const char *command)
> +{
> + add_history (command);
> + command_count++;
> +}
> +
> /* Read one line from the command input stream `instream'
> into the local static buffer `linebuffer' (whose current length
> is `linelength').
> @@ -1090,7 +1103,7 @@ command_line_input (char *prompt_arg, int repeat, char *annotation_suffix)
>
> /* Add line to history if appropriate. */
> if (*linebuffer && input_from_terminal_p ())
> - add_history (linebuffer);
> + gdb_add_history (linebuffer);
>
> /* Save into global buffer if appropriate. */
> if (repeat)
> @@ -1441,7 +1454,8 @@ quit_force (char *args, int from_tty)
> {
> if (write_history_p && history_filename
> && input_from_terminal_p ())
> - write_history (history_filename);
> + append_history (command_count, history_filename);
> + history_truncate_file (history_filename, history_max_entries);
> }
> DO_PRINT_EX;
>
> diff --git a/gdb/top.h b/gdb/top.h
> index 94f6c48..d8baea8 100644
> --- a/gdb/top.h
> +++ b/gdb/top.h
> @@ -79,6 +79,8 @@ extern int history_expansion_p;
> extern int server_command;
> extern char *lim_at_start;
>
> +extern void gdb_add_history (const char *);
> +
> extern void show_commands (char *args, int from_tty);
>
> extern void set_history (char *, int);
>
Thanks,
Pedro Alves
next prev parent reply other threads:[~2014-12-05 10:45 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-29 2:01 Patrick Palka
2014-12-01 20:50 ` Sergio Durigan Junior
2014-12-04 16:18 ` Pedro Alves
2014-12-05 0:19 ` Patrick Palka
2014-12-05 10:45 ` Pedro Alves [this message]
2014-12-05 14:11 ` Patrick Palka
2014-12-10 16:54 ` Pedro Alves
2014-12-10 17:17 ` Eli Zaretskii
2014-12-10 17:23 ` Pedro Alves
2015-01-10 14:10 ` Patrick Palka
2015-01-10 15:16 ` Patrick Palka
2015-01-10 15:18 ` Patrick Palka
2015-01-10 15:39 ` Eli Zaretskii
2015-01-10 15:48 ` Patrick Palka
2015-01-10 16:03 ` Eli Zaretskii
2015-01-10 16:18 ` Patrick Palka
2015-01-10 16:41 ` Eli Zaretskii
2015-01-10 18:17 ` Patrick Palka
2015-01-10 18:46 ` Patrick Palka
2015-01-12 19:05 ` Pedro Alves
2015-01-12 22:56 ` Patrick Palka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54818CCE.5010701@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=patrick@parcs.ath.cx \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox