]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/cli] Clear line buffer on ^C
authorTom de Vries <tdevries@suse.de>
Tue, 22 Jul 2025 20:26:05 +0000 (22:26 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 22 Jul 2025 20:26:05 +0000 (22:26 +0200)
Gdb has the ability to gather input over several lines [1], for instance this:
...
(gdb) print 1
$1 = 1
(gdb)
...
can also be typed as:
...
(gdb) print\
 1
$2 = 1
(gdb)
...

Furthermore, if we type a command but change our mind, we can abort using ^C
and start over using a fresh gdb prompt [2]:
...
(gdb) print 1❌️ Quit
(gdb) echo 1\n
1
(gdb)
...

Now say we type a multi-line command but abort it, we get:
...
(gdb) print\
 1❌️ Quit
(gdb) echo 1\n
❌️ Undefined command: "printecho".  Try "help".
(gdb)
...

Using "set trace-commands on", we can see what happened:
...
+printecho 1\n
..

Gdb has prepended the first line of the cancelled multi-line command to the
following command.

Fix this by clearing current_ui->line_buffer on catching a gdb_exception in
start_event_loop.

Tested on x86_64-linux.

Approved-By: Andrew Burgess <aburgess@redhat.com>
PR cli/33063
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33063

[1] https://sourceware.org/gdb/current/onlinedocs/gdb.html/Output.html
[2] https://sourceware.org/gdb/current/onlinedocs/gdb.html/Quitting-GDB.html

gdb/main.c
gdb/testsuite/gdb.base/command-line-input.exp

index 1806ca0310d961fc8ad1365681ae3b1c20c97c24..bb8ddc37c010bbdfc9ccb2c4dd3c21522d1e3001 100644 (file)
@@ -420,6 +420,7 @@ start_event_loop ()
             get around to resetting the prompt, which leaves readline
             in a messed-up state.  Reset it here.  */
          current_ui->prompt_state = PROMPT_NEEDED;
+         current_ui->line_buffer.clear ();
          top_level_interpreter ()->on_command_error ();
          /* This call looks bizarre, but it is required.  If the user
             entered a command that caused an error,
index af228dc43c3a463ca3a75df63f831baa5dfee520..da559130d617b68296081f6e6e0bbbf695e95122 100644 (file)
@@ -21,6 +21,9 @@
 gdb_exit
 gdb_start
 
+set bs "\\"
+set re_bs [string_to_regexp $bs]
+
 set test "print 1\\\\n + 2"
 gdb_test_multiple "print 1\\\n + 2" $test {
     -re "^print 1\\\\\r\n \\+ 2\r\n\\\$$decimal = 3\r\n$gdb_prompt $" {
@@ -34,3 +37,30 @@ gdb_test_multiple "print 1\\\n2" $test {
        pass $test
     }
 }
+
+with_test_prefix "cancel multiline" {
+    send_gdb "print$bs\n 1"
+    gdb_test_multiple "" "setup" {
+       -re "print$re_bs\r\n 1" {
+           pass $gdb_test_name
+       }
+    }
+
+    send_gdb "\003"
+    gdb_test_multiple "" "cancel" {
+       -re -wrap "" {
+           pass $gdb_test_name
+       }
+    }
+
+    # Regression test for PR cli/33063.
+    gdb_test_multiple "print 2" "command after cancel" {
+       -re -wrap " = 2" {
+           pass $gdb_test_name
+       }
+       -re -wrap "" {
+           # Avoid undefined command error.
+           fail $gdb_test_name
+       }
+    }
+}