diff options
Diffstat (limited to 'gdb/testsuite/gdb.server')
-rw-r--r-- | gdb/testsuite/gdb.server/server-kill.exp | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/gdb/testsuite/gdb.server/server-kill.exp b/gdb/testsuite/gdb.server/server-kill.exp index 80d78f8..655821c 100644 --- a/gdb/testsuite/gdb.server/server-kill.exp +++ b/gdb/testsuite/gdb.server/server-kill.exp @@ -30,6 +30,21 @@ if { [build_executable "failed to prepare" ${testfile}] } { return -1 } +# Global control variable used by the proc prepare. Should be set to +# either 'inferior' or 'server'. +# +# In the proc prepare we start gdbserver and extract a pid, which will +# later be killed by calling the proc kill_server. +# +# When KILL_PID_OF is set to 'inferior' then the pid we kill is that +# of the inferior running under gdbserver, when this process dies +# gdbserver itself will exit. +# +# When KILL_PID_OF is set to 'server' then the pid we kill is that of +# the gdbserver itself, this is a much more aggressive strategy and +# exposes different bugs within GDB. +set kill_pid_of "inferior" + # Spawn GDBserver, run to main, extract GDBserver's PID and save it in # the SERVER_PID global. @@ -54,18 +69,22 @@ proc prepare {} { gdbserver_run "" - # Continue past server_pid assignment. - gdb_breakpoint ${srcfile}:[gdb_get_line_number "i = 0;"] - gdb_continue_to_breakpoint "after server_pid assignment" - - # Get the pid of GDBServer. - set test "p server_pid" - set server_pid 0 - gdb_test_multiple $test $test { - -re " = ($decimal)\r\n$gdb_prompt $" { - set server_pid $expect_out(1,string) - pass $test + if { $::kill_pid_of == "inferior" } { + # Continue past server_pid assignment. + gdb_breakpoint ${srcfile}:[gdb_get_line_number "i = 0;"] + gdb_continue_to_breakpoint "after server_pid assignment" + + # Get the pid of GDBServer. + set test "p server_pid" + set server_pid 0 + gdb_test_multiple $test $test { + -re " = ($decimal)\r\n$gdb_prompt $" { + set server_pid $expect_out(1,string) + pass $test + } } + } else { + set server_pid [exp_pid -i $::server_spawn_id] } if {$server_pid == 0} { @@ -132,6 +151,24 @@ proc_with_prefix test_unwind_syms {} { gdb_test "bt" "(Target disconnected|Remote connection closed|Remote communication error).*" } -test_tstatus -test_unwind_nosyms -test_unwind_syms +# Test performing a stepi right after the connection is dropped. + +proc_with_prefix test_stepi {} { + if ![prepare] { + return + } + + kill_server + + gdb_test "stepi" "(Target disconnected|Remote connection closed|Remote communication error).*" +} + +# Run each test twice, see the description of KILL_PID_OF earlier in +# this file for more details. + +foreach_with_prefix kill_pid_of { "inferior" "server" } { + test_tstatus + test_unwind_nosyms + test_unwind_syms + test_stepi +} |