Automatic Copyright Year update after running gdb/copyright.py
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.base / attach-wait-input.exp
CommitLineData
88b9d363 1# Copyright 2014-2022 Free Software Foundation, Inc.
7180e04a
PA
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>. */
15
16# Verify that GDB waits for the "attach" command to finish before
17# processing the following command.
18#
19# GDB used to have a race where on async targets, in the small window
20# between the attach request and the initial stop for the attach, GDB
21# was still processing user input.
22#
23# The issue was originally detected with:
24#
25# echo -e "attach PID\nset xxx=1" | gdb
26#
27# In that scenario, stdin is not a tty, which disables readline.
28# Explicitly turning off editing exercises the same code path, and is
29# simpler to do, so we test with both editing on and off.
30
31# The test uses the "attach" command.
079670b9 32if [use_gdb_stub] {
7180e04a
PA
33 return
34}
35
36standard_testfile
37
38if {[build_executable "failed to build" $testfile $srcfile debug]} {
39 return -1
40}
41
42# Start the program running, and return its PID, ready for attaching.
43
44proc start_program {binfile} {
45 global gdb_prompt
46 global decimal
47
48 clean_restart $binfile
49
50 if ![runto setup_done] then {
bc6c7af4 51 fail "can't run to setup_done"
7180e04a
PA
52 return 0
53 }
54
55 # Get the PID of the test process.
56 set testpid ""
57 set test "get inferior process ID"
58 gdb_test_multiple "p mypid" $test {
59 -re " = ($decimal)\r\n$gdb_prompt $" {
60 set testpid $expect_out(1,string)
61 pass $test
62 }
63 }
64
65 gdb_test "detach" "Detaching from program: .*"
66
67 if {$testpid == ""} {
68 return
69 }
70
71 return $testpid
72}
73
74# Do test proper. EDITING indicates whether "set editing" is on or
75# off.
76
77proc test { editing } {
78 global gdb_prompt
79 global binfile
80 global decimal
81
82 with_test_prefix "editing $editing" {
83
84 set testpid [start_program $binfile]
85 if {$testpid == ""} {
86 return
87 }
88
89 # Enable/disable readline.
90 gdb_test_no_output "set editing $editing"
91
92 # Send both commands at once.
93 send_gdb "attach $testpid\nprint should_exit = 1\n"
94
95 # Use gdb_expect directly instead of gdb_test_multiple to
96 # avoid races with the double prompt.
97 set test "attach and print"
98 gdb_expect {
99 -re "Attaching to program.*process $testpid\r\n.*$gdb_prompt.*$decimal = 1\r\n$gdb_prompt $" {
100 pass "$test"
101 }
102 timeout {
103 fail "$test (timeout)"
104 }
105 }
106
107 # As we've used attach, on quit, we'll detach from the
108 # program. Explicitly kill it in case we failed above.
109 gdb_test "kill" \
110 "" \
111 "after attach, exit" \
112 "Kill the program being debugged.*y or n. $" \
113 "y"
114 }
115}
116
117foreach editing {"on" "off"} {
118 test $editing
119}
This page took 0.963842 seconds and 4 git commands to generate.