blob: 83de771902b4a428244499ab8ac7708e309d0179 [file] [log] [blame]
# This testcase is part of GDB, the GNU debugger.
# Copyright 2007-2026 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/>.
# Test running programs using extended-remote.
load_lib gdbserver-support.exp
standard_testfile server.c
require allow_gdbserver_tests
if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} {
return -1
}
# allow_xml_test must be called while gdb is not running.
set do_xml_test [allow_xml_test]
# This is used as an override function.
proc do_nothing {} { return 0 }
# Start an extended-remote gdbserver, connect to it, and then use
# 'run' to start an inferior.
#
# If CLEAR_SYSROOT is true then the 'set sysroot' command is issued,
# clearing the sysroot, otherwise the sysroot is left unchanged.
#
# If SET_REMOTE_EXEC is true then the 'set remote exec-file ...'
# command is used to point GDB at the executable on the target (after
# copying the executable over). Otherwise, we rely on GDB and
# gdbserver being able to see the same filesystem, remote exec-file is
# not set, and GDB will just use the path to the executable.
proc do_test { clear_sysroot set_remote_exec fetch_exec_and_args } {
# If we don't clear the sysroot, then the sysroot will remain as
# 'target:'. In this case, if we don't 'set remote exec-file'
# then GDB will not be able to start a remote inferior.
if { !$clear_sysroot && !$set_remote_exec } {
return
}
clean_restart $::testfile
# Disable, or enable, use of the qExecAndArgs packet.
gdb_test "set remote fetch-exec-and-args-packet ${fetch_exec_and_args}"
# Make sure we're disconnected, in case we're testing with an
# extended-remote board, therefore already connected.
gdb_test "disconnect"
if { $clear_sysroot } {
gdb_test_no_output "set sysroot" \
"clear sysroot"
} else {
set sysroot "UNKNOWN"
gdb_test_multiple "show sysroot" "" {
-re -wrap "^The current system root is \"(\[^\r\n\]*)\"\\." {
set sysroot $expect_out(1,string)
pass $gdb_test_name
}
}
if { $sysroot eq "" } {
gdb_test_no_output "set sysroot target:"
} elseif { $sysroot ne "target:" } {
unsupported "unexpected sysroot value"
return
}
}
gdbserver_start_extended
# Check the 'remote exec-file' setting before we (possibly) set it
# ourselves.
if { !$fetch_exec_and_args } {
set suffix "the default remote executable will be used"
} elseif { !$clear_sysroot} {
set suffix "the remote has no default executable set"
} else {
set file_re [string_to_regexp $::binfile]
set suffix "using automatic value \"$file_re\""
}
gdb_test "show remote exec-file" \
"The remote exec-file is unset, ${suffix}\\." \
"check remote exec-file is unset"
if { $set_remote_exec } {
set target_exec [gdbserver_download_current_prog]
gdb_test_no_output "set remote exec-file $target_exec" \
"set remote exec-file"
# Check GDB reflect the value we just set.
set file_re [string_to_regexp $target_exec]
gdb_test "show remote exec-file" \
"The remote exec-file is \"$file_re\"\\." \
"check remote exec-file after set"
}
gdb_breakpoint main
gdb_test_multiple "run" "continue to main" {
-re -wrap "Breakpoint.* main .*" {
pass $gdb_test_name
}
-re -wrap "Running the default executable on the remote target failed; try \"set remote exec-file\"." {
# If 'set remote exec-file' has been used then we should
# not get here.
gdb_assert {!$set_remote_exec} \
"confirm remote exec-file is not set"
if {!$fetch_exec_and_args} {
# We deliberately disabled GDB's ability to know that
# the remote doesn't have a default executable set (by
# disabling the qDefaultExecAndArgs packet). We got
# the result we expected, but the inferior is not
# running, so we're done with this phase of testing.
pass $gdb_test_name
return
}
}
}
if { [istarget *-*-linux*] } {
# On Linux, gdbserver can also report the list of processes.
# But only if xml support is compiled in.
if { $::do_xml_test } {
# This is done in a way to avoid the timeout that can occur from
# applying .* regexp to large output.
gdb_test_lines "info os processes" "get process list" \
"^pid +user +command.*\r\n1 +root +\[/a-z\]*(init|systemd|bash)"
}
}
gdb_test "kill" "" "kill" "Kill the program being debugged. .y or n. " "y"
gdb_load $::binfile
gdb_test "monitor help" "The following monitor commands.*" \
"load new file without any gdbserver inferior"
gdb_test_no_output "monitor exit"
}
set clear_sysroot_modes { false }
set set_remote_exec_modes { true }
if {![is_remote target] && ![is_remote host]} {
lappend set_remote_exec_modes false
lappend clear_sysroot_modes true
}
# This override prevents GDB from automatically setting the 'remote
# exec-file' when using the extended-remote protocol. If we want the
# exec-file set, then this test takes care of it.
with_override extended_gdbserver_load_last_file do_nothing {
foreach_with_prefix clear_sysroot $clear_sysroot_modes {
foreach_with_prefix set_remote_exec $set_remote_exec_modes {
foreach_with_prefix fetch_exec_and_args { on off } {
do_test $clear_sysroot $set_remote_exec $fetch_exec_and_args
}
}
}
}