| # This testcase is part of GDB, the GNU debugger. |
| |
| # Copyright 2021 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 attaching to a multi-threaded process using gdbserver's --attach flag. |
| |
| load_lib gdbserver-support.exp |
| |
| standard_testfile |
| |
| if { [skip_gdbserver_tests] } { |
| return 0 |
| } |
| |
| if {![can_spawn_for_attach]} { |
| return 0 |
| } |
| |
| # Start the test program, attach to it using gdbserver's --attach flag, connect |
| # to it with GDB, check that what we see makes sense. |
| |
| proc run_one_test { non-stop target-non-stop } { |
| save_vars { ::GDBFLAGS } { |
| # If GDB and GDBserver are both running locally, set the sysroot to avoid |
| # reading files via the remote protocol. |
| if { ![is_remote host] && ![is_remote target] } { |
| set ::GDBFLAGS "$::GDBFLAGS -ex \"set sysroot\"" |
| } |
| |
| if { [prepare_for_testing "failed to prepare" $::testfile $::srcfile \ |
| {debug pthreads}] } { |
| return -1 |
| } |
| } |
| |
| # Make sure we're disconnected, in case we're testing with an |
| # extended-remote board, therefore already connected. |
| gdb_test "disconnect" ".*" |
| |
| set target_exec [gdbserver_download_current_prog] |
| set test_spawn_id [spawn_wait_for_attach $::binfile] |
| set testpid [spawn_id_get_pid $test_spawn_id] |
| |
| lassign [gdbserver_start "" "--attach $testpid"] unused gdbserver_address |
| |
| gdb_test_no_output "set non-stop ${non-stop}" |
| gdb_test_no_output "maint set target-non-stop ${target-non-stop}" |
| gdb_target_cmd "remote" $gdbserver_address |
| |
| # There should be 11 threads. |
| gdb_test "thread 11" "Switching to thread 11.*" |
| |
| kill_wait_spawned_process $test_spawn_id |
| gdbserver_exit 0 |
| } |
| |
| foreach_with_prefix non-stop {0 1} { |
| foreach_with_prefix target-non-stop {0 1} { |
| # This combination does not make sense. |
| if { ${non-stop} == 1 && ${target-non-stop} == 0} { |
| continue |
| } |
| |
| run_one_test ${non-stop} ${target-non-stop} |
| } |
| } |