gdb/testsuite: don't try to set non-stop mode on a running target
authorAndrew Burgess <aburgess@redhat.com>
Thu, 24 Nov 2022 19:36:23 +0000 (19:36 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Sat, 4 Feb 2023 16:15:38 +0000 (16:15 +0000)
The test gdb.threads/thread-specific-bp.exp tries to set non-stop mode
on a running target, something which the manual makes clear is not
allowed.

This commit restructures the test a little, we now set the non-stop
mode as part of the GDBFLAGS, so the mode will be set before GDB
connects to the target.  As a consequence I'm able to move the
with_test_prefix out of the check_thread_specific_breakpoint proc.
The check_thread_specific_breakpoint proc is now called within a loop.

After this commit the gdb.threads/thread-specific-bp.exp test still
has some failures, this is because of an issue GDB currently has
printing "Thread ... exited" messages.  This problem should be
addressed by this patch:

  https://sourceware.org/pipermail/gdb-patches/2022-December/194694.html

when it is merged.

gdb/testsuite/gdb.threads/thread-specific-bp.exp

index f603b24fa31fa272c01fe52f1102eccb96331c59..f440574d780fea5b51e5d942afdc4d5ae8200ca7 100644 (file)
@@ -24,8 +24,6 @@ if {[gdb_compile_pthreads \
     return -1
 }
 
-clean_restart ${binfile}
-
 # Extract and return the thread ID of the thread stopped at function
 # FUNC.
 
@@ -45,86 +43,84 @@ proc get_thread_id {func} {
     return $thre
 }
 
-proc check_thread_specific_breakpoint {mode} {
-    with_test_prefix "$mode" {
-       global gdb_prompt
+proc check_thread_specific_breakpoint {non_stop} {
+    global gdb_prompt
 
-       if ![runto_main] {
-           return -1
-       }
+    if { ![runto_main] } {
+       return -1
+    }
 
-       set main_thre [get_thread_id "main"]
-       if { $main_thre < 0 } {
-           return -1
-       }
+    set main_thre [get_thread_id "main"]
+    if { $main_thre < 0 } {
+       return -1
+    }
 
-       gdb_breakpoint "start"
-       gdb_continue_to_breakpoint "start"
+    gdb_breakpoint "start"
+    gdb_continue_to_breakpoint "start"
 
-       set start_thre [get_thread_id "start"]
-       if { $start_thre < 0 } {
-           return -1
-       }
+    set start_thre [get_thread_id "start"]
+    if { $start_thre < 0 } {
+       return -1
+    }
 
-       # Set a thread-specific breakpoint at "main".  This can't ever
-       # be hit, but that's OK.
-       gdb_breakpoint "main thread $start_thre"
-       gdb_test "info break" ".*breakpoint.*thread $start_thre" "breakpoint set"
-
-       # Set breakpoint at a place only reacheable after the "start"
-       # thread exits.
-       gdb_breakpoint "end"
-
-       # Switch back to the main thread, and resume all threads.  The
-       # "start" thread exits, and the main thread reaches "end".
-       gdb_test "thread $main_thre" \
-           "Switching to thread $main_thre.*" \
-           "thread $main_thre selected"
-
-       if { $mode == "non-stop" } {
-           set cmd "continue -a"
-       } else {
-           set cmd "continue"
-       }
-       set test "continue to end"
-       set thread_exited 0
-       set prompt 0
-       gdb_test_multiple "$cmd" $test -lbl {
-           -re "(^|\r\n)\\\[Thread \[^\r\n\]* exited](?=\r\n)" {
-               if { $prompt } {
-                   pass $gdb_test_name
-               } else {
-                   set thread_exited 1
-                   exp_continue
-               }
+    # Set a thread-specific breakpoint at "main".  This can't ever
+    # be hit, but that's OK.
+    gdb_breakpoint "main thread $start_thre"
+    gdb_test "info break" ".*breakpoint.*thread $start_thre" "breakpoint set"
+
+    # Set breakpoint at a place only reacheable after the "start"
+    # thread exits.
+    gdb_breakpoint "end"
+
+    # Switch back to the main thread, and resume all threads.  The
+    # "start" thread exits, and the main thread reaches "end".
+    gdb_test "thread $main_thre" \
+       "Switching to thread $main_thre.*" \
+       "thread $main_thre selected"
+
+    if { $non_stop } {
+       set cmd "continue -a"
+    } else {
+       set cmd "continue"
+    }
+    set test "continue to end"
+    set thread_exited 0
+    set prompt 0
+    gdb_test_multiple "$cmd" $test -lbl {
+       -re "(^|\r\n)\\\[Thread \[^\r\n\]* exited](?=\r\n)" {
+           if { $prompt } {
+               pass $gdb_test_name
+           } else {
+               set thread_exited 1
+               exp_continue
            }
-           -re "\r\n$gdb_prompt " {
-               if { $thread_exited } {
-                   pass $gdb_test_name
-               } else {
-                   set prompt 1
-                   exp_continue
-               }
+       }
+       -re "\r\n$gdb_prompt " {
+           if { $thread_exited } {
+               pass $gdb_test_name
+           } else {
+               set prompt 1
+               exp_continue
            }
        }
+    }
 
-       set test "thread-specific breakpoint was deleted"
-       gdb_test_multiple "info breakpoint" $test {
-           -re "thread $start_thre\n$gdb_prompt $" {
-               fail $test
-           }
-           -re "$gdb_prompt $" {
-               pass $test
-           }
+    set test "thread-specific breakpoint was deleted"
+    gdb_test_multiple "info breakpoint" $test {
+       -re "thread $start_thre\n$gdb_prompt $" {
+           fail $test
+       }
+       -re "$gdb_prompt $" {
+           pass $test
        }
     }
 }
 
-# Test all-stop mode.
-check_thread_specific_breakpoint "all-stop"
-
-clean_restart ${binfile}
+foreach_with_prefix non_stop {on off} {
+    save_vars { GDBFLAGS } {
+       append GDBFLAGS " -ex \"set non-stop $non_stop\""
+       clean_restart $binfile
+    }
 
-# Test non-stop mode.
-gdb_test_no_output "set non-stop on" "set non-stop mode"
-check_thread_specific_breakpoint "non-stop"
+    check_thread_specific_breakpoint $non_stop
+}