diff options
author | Andrew Burgess <aburgess@redhat.com> | 2024-10-30 12:16:46 +0000 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2024-11-12 14:07:35 +0000 |
commit | 31fa6221bf88accee782e2c93cb869eee5d4113c (patch) | |
tree | e87552b433e6a21f05609e3def1f733e861a5207 /gdb/testsuite/lib | |
parent | gdb/readline: add readline library version to 'show configuration' (diff) | |
download | binutils-gdb-31fa6221bf88accee782e2c93cb869eee5d4113c.tar.gz binutils-gdb-31fa6221bf88accee782e2c93cb869eee5d4113c.tar.bz2 binutils-gdb-31fa6221bf88accee782e2c93cb869eee5d4113c.zip |
gdb/readline: don't get stuck thinking an EOF arrived
It was brought to my attention[1] that if a user makes use of Ctrl+d
to quit from a secondary prompt (e.g. the prompt used to enter lines
for the 'commands' command) then GDB will start displaying some
unexpected blank lines. Here's an example:
Reading symbols from /tmp/hello.x...
(gdb) break main
Breakpoint 1 at 0x401198: file hello.c, line 18.
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>quit # <----------- Use Ctrl+d to quit here.
(gdb) show architecture
# <----------- This blank line is unexpected.
The target architecture is set to "auto" (currently "i386:x86-64").
(gdb)
I've marked up where I press 'Ctrl+d', and also the unexpected blank
line.
This issue will only happen if bracketed-paste-mode is in use. If
this has been disabled (e.g. in ~/.inputrc) then this issue will not
occur.
The blank line is not just emitted for the 'show architecture'
command. The blank line is actually caused by an extra '\n' character
emitted by readline after it has gathered a complete line of input,
and so will occur for any command.
The problem is caused by readline getting "stuck" in a state where it
thinks that an EOF has just been delivered. This state is set when
the 'Ctrl+d' does deliver an EOF, but then this state is never fully
reset. As a result, every time readline completes a line, it thinks
that the line was completed due to an EOF and so adds an extra '\n'
character.
Obviously the real fix for this issue is to patch readline, and I do
have a patch for that[2], however, version 8.2 of readline has been
released, and contains this issue. As such, if GDB is linked against
the system readline, and that system readline is 8.2, then we can
expect to see this issue.
There's a pretty simple, and cheap workaround that we can add to GDB
that will mitigate this issue.
I propose that we add this workaround to GDB. If/when the readline
patch is accepted then I'll back-port this to our local readline copy,
but retaining the workaround will be harmless, and will make GDB play
nicer with system readline libraries (version 8.2).
[1] https://inbox.sourceware.org/gdb-patches/34ef5438-8644-44cd-8537-5068e0e5e434@redhat.com
[2] https://lists.gnu.org/archive/html/bug-readline/2024-10/msg00014.html
Reviewed-By: Keith Seitz <keiths@redhat.com>
Diffstat (limited to 'gdb/testsuite/lib')
-rw-r--r-- | gdb/testsuite/lib/gdb.exp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index a438a101fc9..410f99e3350 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -3740,6 +3740,34 @@ proc readline_is_used { } { } } +# Return true if readline has support for the EOF flag. + +proc readline_supports_eof_flag { } { + gdb_test_multiple "show configuration" "" { + -re -wrap "\r\nGNU Readline library version: ($::decimal)\\.($::decimal)\\s+\\((internal|system)\\)" { + set major $expect_out(1,string) + set minor $expect_out(2,string) + set type $expect_out(3,string) + + # The internal readline was patched with EOF support ahead + # of this landing in upstream readline. + if { $type eq "internal" } { + return true + } + + # The EOF flag support was added in readline 8.2. + if { $major > 8 || $major == 8 && $minor >= 2 } { + return true + } + + return false + } + -re ".*$::gdb_prompt $" { + return false + } + } +} + # Return 1 if target is ELF. gdb_caching_proc is_elf_target {} { set me "is_elf_target" |