| # This testcase is part of GDB, the GNU debugger. | |
| # | |
| # Copyright 2025-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 what happens if we try to start gdbserver with an empty string | |
| # for the executable name. In theory we could choose to accept this | |
| # for the extended-remote case, indeed, in the extended-remote case | |
| # it's OK to start gdbserver with no program name or arguments. | |
| # | |
| # But actually specifying an empty executable name seems different, | |
| # and wrong, so for now at least, we don't allow this. If that | |
| # position changes in the future, then this test will need updating. | |
| # Skip test if target does not support argument passing. | |
| require {!target_info exists noargs} | |
| load_lib gdbserver-support.exp | |
| standard_testfile | |
| require allow_gdbserver_tests | |
| set gdbserver [find_gdbserver] | |
| if { $gdbserver == "" } { | |
| unsupported "could not find gdbserver" | |
| return | |
| } | |
| clean_restart | |
| # Try starting gdbserver in extended, and non-extended mode. | |
| foreach_with_prefix proto { extended-remote remote } { | |
| if { $proto eq "extended-remote" } { | |
| set server_flag "--multi" | |
| } else { | |
| set server_flag "" | |
| } | |
| # Try starting gdbserver with and without arguments. | |
| foreach_with_prefix args { " a b c" "" } { | |
| # Start gdbserver on its own. This makes it easier to check | |
| # the error message that gdbserver emits. The program name is | |
| # the empty string. gdbserver should exit. | |
| set gdbserver_cmd \ | |
| "$gdbserver $server_flag --once - \"\"${args}" | |
| set spawn_id [remote_spawn target $gdbserver_cmd] | |
| set testname "start gdbserver" | |
| expect { | |
| -i $spawn_id | |
| -re "No program to debug\r\nExiting" { pass $testname } | |
| eof { fail $testname } | |
| timeout { fail $testname } | |
| } | |
| catch { | |
| close -i $spawn_id | |
| wait -nowait -i $spawn_id | |
| } | |
| # Try connecting to gdbserver from GDB. The connection should | |
| # immediately close as gdbserver exits. The inferior should | |
| # be left with no connection. | |
| gdb_test "disconnect" ".*" \ | |
| "disconnect before remote connection" | |
| gdb_test "target $proto | ${::gdbserver} $server_flag --once - \"\"${args}" \ | |
| [multi_line \ | |
| "Remote debugging using \\| \[^\r\n\]+" \ | |
| "Remote communication error\\. Target disconnected: .*"] \ | |
| "start gdbserver over stdin" | |
| gdb_test "info inferiors" \ | |
| "\\*\\s+1\\s+<null>\\s*" \ | |
| "check inferior 1 has no connection" | |
| } | |
| } |