[gdb/testsuite] Fix gdb.threads/fork-plus-threads.exp with readnow
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.threads / fork-plus-threads.exp
index 53d110224db1154d73b761bb9f6a7e7c0532358b..7fe3c603bcde2e8057b1a554ed4567674d425038 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Free Software Foundation, Inc.
+# Copyright (C) 2015-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
 #
 # 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 } {
+proc do_test { detach-on-fork } {
     global GDBFLAGS
     global srcfile testfile
     global gdb_prompt
@@ -39,11 +46,11 @@ 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
     }
 
-    gdb_test_no_output "set detach-on-fork $detach_on_fork"
+    gdb_test_no_output "set detach-on-fork ${detach-on-fork}"
     set test "continue &"
     gdb_test_multiple $test $test {
        -re "$gdb_prompt " {
@@ -51,19 +58,61 @@ proc do_test { detach_on_fork } {
        }
     }
 
+    # 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|LWP) \[^\r\n\]+ exited" {
+           # Avoid timeout with check-read1
+           exp_continue
+       }
+       -re "New (Thread|LWP) \[^\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\]+Connection\[ \t\]+Executable\[ \t\]+\r\n\\* 1 \[^\r\n\]+" \
+       "only inferior 1 left"
 }
 
-foreach detach_on_fork {"on" "off"} {
-    with_test_prefix "detach-on-fork=$detach_on_fork" {
-       do_test $detach_on_fork
-    }
+foreach_with_prefix detach-on-fork {"on" "off"} {
+    do_test ${detach-on-fork}
 }
This page took 0.025793 seconds and 4 git commands to generate.