Files
binutils-gdb/gdb/testsuite/boards/local-remote-host-native.exp
Tom de Vries 9121a23fa7 [gdb/testsuite] Fix local-remote-host-native.exp for gdb.server tests
When running test-case gdb.server/stop-reply-no-thread-multi.exp with
host+target board local-remote-host-native, I run into a time-out:
...
(gdb) PASS: gdb.server/stop-reply-no-thread-multi.exp: target-non-stop=off: \
  to_disable=: disconnect
builtin_spawn /usr/bin/ssh -t -l vries 127.0.0.1 gdbserver --once \
  localhost:2346 stop-reply-no-thread-multi^M
Process stop-reply-no-thread-multi created; pid = 32600^M
Listening on port 2346^M
set remote threads-packet off^M
FAIL: gdb.server/stop-reply-no-thread-multi.exp: target-non-stop=off: \
  to_disable=: set remote threads-packet off (timeout)
...

This is due to this line in ${board}_spawn:
...
    set board_info($board,fileid) $spawn_id
...

We have the following series of events:
- gdb is spawned, setting fileid
- a few gdb commands (set height etc) are send using fileid, arrive at gdb and
  are successful
- gdbserver is spawned, overwriting fileid
- the next gdb command is sent using fileid, so it's send
  to gdbserver instead of gdb, and we run into the timeout.

There is some notion of current gdb, tracked in both gdb_spawn_id and fileid
of the host board (see switch_gdb_spawn_id).  And because the host and target
board are the same, spawning something on the target overwrites the fileid on
host, and consequently the current gdb.

Fix this by only setting fileid when spawning gdb.

Tested on x86_64-linux.

Now gdb.server/*.exp passes for host+target board local-remote-host-native,
except for file-transfer.exp.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29734
2023-03-28 17:48:34 +02:00

97 lines
3.1 KiB
Plaintext

# 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 <http://www.gnu.org/licenses/>.
# This file is a dejagnu "board file" and is used to run the testsuite
# against local host, in remote host mode.
#
# This board file is used to emulate the real remote host testing, in
# which file system of host and build are not shared. This is achieved
# by copying files from source directory to ${host_dir}.
#
# To use this file:
# bash$ cd ${build_dir}/gdb
# bash$ make check RUNTESTFLAGS="--host_board=local-remote-host-native --target_board=local-remote-host-native HOST_DIR=/tmp/foo/"
#
# We set both target board and host board together to test a native gdb
# (host == target) on a remote host (host != build). $HOST_DIR is the
# directory for copying files to, to avoid messing up your HOME. When
# it is absent, files are copied to ./remote-host.
if { $board_type == "target" } {
set_board_info compiler gcc
}
# We have to explicitly specify GDB with the path to the copy in
# the build directory because otherwise it will be set to the
# result of "transform GDB" since the harness thinks we're using
# a remote host. See lib/gdb.exp.
set GDB [file join [pwd] "../gdb"]
verbose -log "Overriding setting of GDB to $GDB"
set_board_info hostname localhost
set_board_info username $env(USER)
save_vars {rsh_cmd res} {
set rsh_cmd \
[join \
[list \
[board_info $board rsh_prog] \
-l [board_info $board username] \
[board_info $board hostname]]]
if [info exists HOST_DIR] {
set_board_info remotedir $HOST_DIR
} else {
# Set remotedir by default, to force remote_download target to give an
# absolute file name.
set res [remote_exec build $rsh_cmd pwd]
if { [lindex $res 0] != 0 } {
error "Couldn't set remotedir using pwd"
}
set_board_info remotedir [string trim [lindex $res 1]]
}
}
# The ssh key should be correctly set up that you ssh to localhost
# without having to type password.
set_board_info rsh_prog /usr/bin/ssh
set_board_info rcp_prog /usr/bin/scp
set_board_info file_transfer "rsh"
if { $board_type == "host" } {
set_board_info gdb_opts "-d \"${HOST_DIR}\""
}
proc ${board}_spawn { board cmd } {
global board_info
set remote [board_info $board hostname]
set username [board_info $board username]
set RSH [board_info $board rsh_prog]
spawn $RSH -t -l $username $remote $cmd
if { [string match "$::GDB*" $cmd] } {
set board_info($board,fileid) $spawn_id
}
return $spawn_id
}
if { $board_type == "host" } {
set GDBFLAGS "${GDBFLAGS} -iex \"set style enabled off\""
}