mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
8f3babfaf8
After these two commits: commit4fb7bc4b14
Date: Mon Mar 7 13:49:21 2022 +0000 readline: back-port changes needed to properly detect EOF commit91395d97d9
Date: Tue Feb 15 17:28:03 2022 +0000 gdb: handle bracketed-paste-mode and EOF correctly It was observed that, if a previous command is selected at the readline prompt using the up arrow key, then when the command is accepted (by pressing return) an unexpected 'quit' message will be printed by GDB. Here's an example session: (gdb) p 123 $1 = 123 (gdb) p 123 quit $2 = 123 (gdb) In this session the second 'p 123' was entered not by typing 'p 123', but by pressing the up arrow key to select the previous command. It is important that the up arrow key is used, typing Ctrl-p will not trigger the bug. The problem here appears to be readline's EOF detection when handling multi-character input sequences. I have raised this issue on the readline mailing list here: https://lists.gnu.org/archive/html/bug-readline/2022-04/msg00012.html a solution has been proposed here: https://lists.gnu.org/archive/html/bug-readline/2022-04/msg00016.html This patch includes a test for this issue as well as a back-port of (the important bits of) readline commit: commit 2ef9cec8c48ab1ae3a16b1874a49bd1f58eaaca1 Date: Wed May 4 11:18:04 2022 -0400 fix for setting RL_STATE_EOF in callback mode That commit also includes some updates to the readline documentation and tests that I have not included in this commit. With this commit in place the unexpected 'quit' messages are resolved.
212 lines
4.9 KiB
Plaintext
212 lines
4.9 KiB
Plaintext
# Copyright 2002-2022 Free Software Foundation, Inc.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# This file was written by Tom Tromey <tromey@redhat.com>
|
|
|
|
# This file is part of the gdb testsuite.
|
|
|
|
#
|
|
# Tests for readline operations.
|
|
#
|
|
|
|
# This function is used to test operate-and-get-next.
|
|
# NAME is the name of the test.
|
|
# ARGS is a list of alternating commands and expected results.
|
|
proc operate_and_get_next {name args} {
|
|
global gdb_prompt
|
|
|
|
set my_gdb_prompt "($gdb_prompt| >)"
|
|
|
|
set reverse {}
|
|
foreach {item result} $args {
|
|
verbose "sending $item"
|
|
sleep 1
|
|
|
|
# We can't use gdb_test here because we might see a " >" prompt.
|
|
set status 0
|
|
send_gdb "$item\n"
|
|
gdb_expect {
|
|
-re "$item" {
|
|
# Ok
|
|
}
|
|
timeout {
|
|
set status 1
|
|
}
|
|
}
|
|
|
|
if {! $status} {
|
|
gdb_expect {
|
|
-re "$result" {
|
|
# Ok.
|
|
}
|
|
timeout {
|
|
set status 1
|
|
}
|
|
}
|
|
}
|
|
|
|
if {$status} {
|
|
fail "$name - send $item"
|
|
return 0
|
|
}
|
|
pass "$name - send $item"
|
|
|
|
set reverse [linsert $reverse 0 $item $result]
|
|
}
|
|
|
|
# Now use C-p to go back to the start.
|
|
foreach {item result} $reverse {
|
|
# Actually send C-p followed by C-l. This lets us recognize the
|
|
# command when gdb prints it again.
|
|
send_gdb "\x10\x0c"
|
|
set status 0
|
|
gdb_expect {
|
|
-re "$item" {
|
|
# Ok
|
|
}
|
|
timeout {
|
|
set status 1
|
|
}
|
|
}
|
|
if {$status} {
|
|
fail "$name - C-p to $item"
|
|
return 0
|
|
}
|
|
pass "$name - C-p to $item"
|
|
}
|
|
|
|
# Now C-o through the list. Don't send the command, since it is
|
|
# already there. Strip off the first command from the list so we
|
|
# can see the next command inside the loop.
|
|
set count 0
|
|
foreach {item result} $args {
|
|
set status 0
|
|
|
|
# If this isn't the first item, make sure we see the command at
|
|
# the prompt.
|
|
if {$count > 0} {
|
|
gdb_expect {
|
|
-re ".*$item" {
|
|
# Ok
|
|
}
|
|
timeout {
|
|
set status 1
|
|
}
|
|
}
|
|
}
|
|
|
|
if {! $status} {
|
|
# For the last item, send a simple \n instead of C-o.
|
|
if {$count == [llength $args] - 2} {
|
|
send_gdb "\n"
|
|
} else {
|
|
# 15 is C-o.
|
|
send_gdb [format %c 15]
|
|
}
|
|
set status 0
|
|
gdb_expect {
|
|
-re "$result" {
|
|
# Ok
|
|
}
|
|
timeout {
|
|
set status 1
|
|
}
|
|
}
|
|
}
|
|
|
|
if {$status} {
|
|
fail "$name - C-o for $item"
|
|
return 0
|
|
}
|
|
pass "$name - C-o for $item"
|
|
|
|
set count [expr {$count + 2}]
|
|
}
|
|
|
|
# Match the prompt so the next test starts at the right place.
|
|
gdb_test "" ".*" "$name - final prompt"
|
|
|
|
return 1
|
|
}
|
|
|
|
save_vars { env(TERM) } {
|
|
# The arrow key test relies on the standard VT100 bindings, so
|
|
# make sure that an appropriate terminal is selected. The same
|
|
# bug doesn't show up if we use ^P / ^N instead.
|
|
setenv TERM vt100
|
|
|
|
gdb_start
|
|
gdb_reinitialize_dir $srcdir/$subdir
|
|
|
|
if { ![readline_is_used] } {
|
|
unsupported "readline isn't used."
|
|
return -1
|
|
}
|
|
|
|
save_vars { timeout env(GDBHISTSIZE) env(GDBHISTFILE) } {
|
|
set timeout 30
|
|
|
|
# A simple test of operate-and-get-next.
|
|
operate_and_get_next "Simple operate-and-get-next" \
|
|
"p 1" ".* = 1" \
|
|
"p 2" ".* = 2" \
|
|
"p 3" ".* = 3"
|
|
|
|
# Test operate-and-get-next with a secondary prompt.
|
|
operate_and_get_next "operate-and-get-next with secondary prompt" \
|
|
"if 1 > 0" "" \
|
|
"p 5" "" \
|
|
"end" ".* = 5"
|
|
|
|
# Verify that arrow keys work in secondary prompts. The control
|
|
# sequence is a hard-coded VT100 up arrow.
|
|
gdb_test "print 42" "\\\$\[0-9\]* = 42"
|
|
set msg "arrow keys with secondary prompt"
|
|
gdb_test_multiple "if 1 > 0\n\033\[A\033\[A\nend" $msg {
|
|
-re ".*\\\$\[0-9\]* = 42\r\n$gdb_prompt $" {
|
|
pass $msg
|
|
}
|
|
-re ".*Undefined command:.*$gdb_prompt $" {
|
|
fail $msg
|
|
}
|
|
}
|
|
|
|
# Use the up arrow to select a previous command. Check that
|
|
# no unexpected output is added between the previously
|
|
# selected command, and the output of that command.
|
|
gdb_test "print 123" "\\\$\[0-9\]* = 123"
|
|
gdb_test_multiple "\033\[A" "use up arrow" {
|
|
-re -wrap "print 123\r\n\\\$\[0-9\]* = 123" {
|
|
pass $gdb_test_name
|
|
}
|
|
}
|
|
|
|
# Now repeat the first test with a history file that fills the entire
|
|
# history list.
|
|
|
|
set env(GDBHISTFILE) "${srcdir}/${subdir}/gdb_history"
|
|
set env(GDBHISTSIZE) "10"
|
|
|
|
gdb_exit
|
|
gdb_start
|
|
gdb_reinitialize_dir $srcdir/$subdir
|
|
|
|
operate_and_get_next "Simple operate-and-get-next, two" \
|
|
"p 7" ".* = 7" \
|
|
"p 8" ".* = 8" \
|
|
"p 9" ".* = 9"
|
|
}
|
|
}
|