# Copyright 2014-2023 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 . */ # Verify that GDB waits for the "attach" command to finish before # processing the following command. # # GDB used to have a race where on async targets, in the small window # between the attach request and the initial stop for the attach, GDB # was still processing user input. # # The issue was originally detected with: # # echo -e "attach PID\nset xxx=1" | gdb # # In that scenario, stdin is not a tty, which disables readline. # Explicitly turning off editing exercises the same code path, and is # simpler to do, so we test with both editing on and off. # The test uses the "attach" command. if [use_gdb_stub] { return } standard_testfile if {[build_executable "failed to build" $testfile $srcfile debug]} { return -1 } # Start the program running, and return its PID, ready for attaching. proc start_program {binfile} { global gdb_prompt global decimal clean_restart $binfile if {![runto setup_done]} { return 0 } # Get the PID of the test process. set testpid "" set test "get inferior process ID" gdb_test_multiple "p mypid" $test { -re " = ($decimal)\r\n$gdb_prompt $" { set testpid $expect_out(1,string) pass $test } } gdb_test "detach" "Detaching from program: .*" if {$testpid == ""} { return } return $testpid } # Do test proper. EDITING indicates whether "set editing" is on or # off. proc test { editing } { global gdb_prompt global binfile global decimal with_test_prefix "editing $editing" { set testpid [start_program $binfile] if {$testpid == ""} { return } # Enable/disable readline. gdb_test_no_output "set editing $editing" # Send both commands at once. send_gdb "attach $testpid\nprint should_exit = 1\n" # Use gdb_expect directly instead of gdb_test_multiple to # avoid races with the double prompt. set test "attach and print" gdb_expect { -re "Attaching to program.*process $testpid\r\n.*$gdb_prompt.*$decimal = 1\r\n$gdb_prompt $" { pass "$test" } timeout { fail "$test (timeout)" } } # As we've used attach, on quit, we'll detach from the # program. Explicitly kill it in case we failed above. gdb_test "kill" \ "" \ "after attach, exit" \ "Kill the program being debugged.*y or n. $" \ "y" } } foreach editing {"on" "off"} { test $editing }