aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.server
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.server')
-rw-r--r--gdb/testsuite/gdb.server/server-kill.exp65
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
+}