{
/* Can't set the breakpoint. */
+ /* If the target has closed then it will have deleted any
+ breakpoints inserted within the target inferior, as a result
+ any further attempts to interact with the breakpoint objects
+ is not possible. Just rethrow the error. */
+ if (bp_excpt.error == TARGET_CLOSE_ERROR)
+ throw bp_excpt;
+ gdb_assert (bl->owner != nullptr);
+
/* In some cases, we might not be able to insert a
breakpoint in a shared library that has already been
removed, but we have not yet processed the shlib unload
+2021-06-22 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.server/server-kill.exp: Introduce global kill_pid_of, and
+ make use of this in prepare to select which pid we should kill.
+ Run all the tests twice with a different kill_pid_of value.
+ (prepare): Make use of kill_pid_of.
+ (test_stepi): New proc.
+
2021-06-21 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.python/py-frame.exp: Add Frame.level tests.
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.
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} {
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
+}