# Copyright 2014-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 . # Test "set auto-connect-native-target off" and "target native" on # native targets. standard_testfile if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { return -1 } # Whether this GDB is configured with a "native" target. set have_native 0 set test "help target native" gdb_test_multiple $test $test { -re "Undefined target command.*$gdb_prompt $" { set have_native 0 } -re "Native process.*$gdb_prompt $" { set have_native 1 } } if { !$have_native } { unsupported "no \"target native\" support." return } # Returns the topmost target pushed on the target stack. TEST is used # as test message. proc get_topmost_target {test} { global gdb_prompt set topmost "unknown" gdb_test_multiple "maint print target-stack" $test { -re "The current target stack is:\r\n - (\[^ \]+) .*$gdb_prompt $" { set topmost $expect_out(1,string) pass $test } } return $topmost } set topmost [get_topmost_target "check whether a target is already connected"] # Testing against the extended-remote board, for example? if { $topmost != "exec" } { unsupported "already connected to target $topmost." return } # Check which target this board connects to. If testing with a native # target board, this should cause the native target to auto connect. if ![runto_main] then { fail "can't run to main" return 0 } # Returns true if the native target is pushed on the target stack. # TEST is used as test message. proc check_native_target {test} { global gdb_prompt gdb_test_multiple "maint print target-stack" $test { -re " native .*$gdb_prompt $" { pass $test return 1 } -re "$gdb_prompt $" { pass $test } } return 0 } # Testing against a remote board, for example? if { ![check_native_target "check whether board tests the native target"] } { unsupported "not testing the native target." return } # Kill program. TEST is used as test message. proc kill_program {test} { global gdb_prompt gdb_test_multiple "kill" $test { -re "Kill the program being debugged\\? .y or n. $" { send_gdb "y\n" exp_continue } -re "$gdb_prompt $" { pass $test } } } # Kill the program. This should pop the target. The "start" test # below will fail otherwise. kill_program "kill" # Now prevent the native target from auto connecting. gdb_test_no_output "set auto-connect-native-target off" # Commands that rely on the native target auto-connecting should no longer work. gdb_test "start" "Don't know how to run.*" "start no longer works" # Explicitly connect to the native target. gdb_test "target native" \ "Done. Use the \"run\" command to start a process.*" \ "explicitly connect to the native target" proc test_native_target_remains_pushed {} { gdb_test "maint print target-stack" \ "The current target stack is:\r\n .* native .* exec .*" \ "native target remains pushed" } # Test a set of "inferior gone" scenarios, making sure the target # remains pushed. with_test_prefix "kill" { gdb_test "start" "main.*" kill_program "kill" test_native_target_remains_pushed } with_test_prefix "detach" { gdb_test "start" "main.*" set test "detach" gdb_test_multiple $test $test { -re "Detach the program being debugged\\? .y or n. $" { send_gdb "y\n" exp_continue } -re "$gdb_prompt $" { pass $test } } test_native_target_remains_pushed } with_test_prefix "run to exit" { gdb_test "start" "Temporary breakpoint .* main .*" gdb_test "c" "$inferior_exited_re normally.*" test_native_target_remains_pushed } # Now test disconnecting. Commands that rely on the native target # auto-connecting should no longer work (again) after this. with_test_prefix "disconnect" { gdb_test "start" "Temporary breakpoint .* main .*" set test "disconnect" gdb_test_multiple $test $test { -re "A program is being debugged already.* .y or n. $" { send_gdb "y\n" exp_continue } -re "$gdb_prompt $" { pass $test } } set topmost \ [get_topmost_target "check whether the target is no longer connected"] set test "no longer connected to a target" if { $topmost == "exec" } { pass $test } else { fail $test } gdb_test "start" "Don't know how to run.*" "start no longer works" } # Reenable auto-connecting to the native target. Plain "start" should # start working again. gdb_test_no_output "set auto-connect-native-target on" gdb_test "start" "Temporary breakpoint .* main .*" \ "start auto-connects to the native target after reenabling auto-connect"