-# Copyright (C) 2015 Free Software Foundation, Inc.
+# Copyright (C) 2015-2020 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
#
# See https://sourceware.org/bugzilla/show_bug.cgi?id=18600
+# In remote mode, we cannot continue debugging after all
+# inferiors have terminated, and this test requires that.
+if { [target_info exists gdb_protocol]
+ && [target_info gdb_protocol] == "remote" } {
+ continue
+}
+
standard_testfile
proc do_test { detach_on_fork } {
set GDBFLAGS $saved_gdbflags
if ![runto_main] then {
- fail "Can't run to main"
+ fail "can't run to main"
return 0
}
}
}
+ # gdbserver had a bug that resulted in reporting the fork child's
+ # initial stop to gdb, which gdb does not expect, in turn
+ # resulting in a broken session, like:
+ #
+ # [Thread 31536.31536] #16 stopped. <== BAD
+ # [New Thread 31547.31547]
+ # [Inferior 10 (process 31536) exited normally]
+ # [New Thread 31547.31560]
+ #
+ # [Thread 31547.31547] #18 stopped. <== BAD
+ # Cannot remove breakpoints because program is no longer writable. <== BAD
+ # Further execution is probably impossible. <== BAD
+ # [Inferior 11 (process 31547) exited normally]
+ # [Inferior 1 (process 31454) exited normally]
+ #
+ # These variables track whether we see such broken behavior.
+ set saw_cannot_remove_breakpoints 0
+ set saw_thread_stopped 0
+
set test "inferior 1 exited"
gdb_test_multiple "" $test {
+ -re "Cannot remove breakpoints" {
+ set saw_cannot_remove_breakpoints 1
+ exp_continue
+ }
+ -re "Thread \[^\r\n\]+ stopped\\." {
+ set saw_thread_stopped 1
+ exp_continue
+ }
+ -re "Thread \[^\r\n\]+ exited" {
+ # Avoid timeout with check-read1
+ exp_continue
+ }
+ -re "New Thread \[^\r\n\]+" {
+ # Avoid timeout with check-read1
+ exp_continue
+ }
-re "Inferior 1 \(\[^\r\n\]+\) exited normally" {
pass $test
}
}
+ gdb_assert !$saw_cannot_remove_breakpoints \
+ "no failure to remove breakpoints"
+ gdb_assert !$saw_thread_stopped \
+ "no spurious thread stop"
+
gdb_test "info threads" "No threads\." \
"no threads left"
gdb_test "info inferiors" \
- "Num\[ \t\]+Description\[ \t\]+Executable\[ \t\]+\r\n\\* 1 \[^\r\n\]+" \
+ "Num\[ \t\]+Description\[ \t\]+Connection\[ \t\]+Executable\[ \t\]+\r\n\\* 1 \[^\r\n\]+" \
"only inferior 1 left"
}