[binutils-gdb] gdb/testsuite: fix step-over-thread-exit.exp with native-gdbserver
Simon Marchi via Gdb-cvs <[email protected]> Fri, 19 Jun 2026 20:09:18 +0000 (GMT)
| Newsgroups | gmane.comp.gdb.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f3a1f9596b7f39e1cdd005af9b40fc6cd0307de9 commit f3a1f9596b7f39e1cdd005af9b40fc6cd0307de9 Author: Simon Marchi <[email protected]> Date: Wed May 6 16:27:52 2026 -0400 gdb/testsuite: fix step-over-thread-exit.exp with native-gdbserver This test uses "set args N" to control how many threads the inferior spawns: 1 in some cases and 100 in others. However, "set args" doesn't work with the native-gdbserver board. As a result, with that board, the inferior always uses its default of 100 threads. It sometimes causes failures like: p $_thread == 2 $1 = 1 (gdb) [New Thread 2790806.2790823 (id 3)] Thread 3 "step-over-threa" hit Breakpoint 2, 0x00005555555552ab in my_exit_syscall () at /.../testsuite/lib/my-syscalls.S:85 85 SYSCALL (my_exit, __NR_exit) FAIL: gdb.threads/step-over-thread-exit.exp: step_over_mode=inline: non-stop=on: target-non-stop=on: schedlock=off: cmd=next: ns_stop_all=0: selected thread didn't change (timeout) Here, GDB steps over thread 2's exit. As soon as thread 2 exits, the main thread spawns a new thread (thread 3), which hits the breakpoint placed over the exit syscall, and that event gets reported asynchronously, confusing the testsuite. The point of setting n_threads to 1 is exactly to avoid things like that. Fix it by passing the args via the new -inferior-args option, which works correctly with the native-gdbserver board. Change the test program to requiring the number of threads to be passed as an argument, which would have caught this problem. Change-Id: Ifc8856aa582706fd7207d0035d35dee749eb83a5 Reported-By: Tankut Baris Aktemur <[email protected]> Reviewed-By: Tankut Baris Aktemur <[email protected]> Diff: --- gdb/testsuite/gdb.threads/step-over-thread-exit.c | 16 +++++++++++----- gdb/testsuite/gdb.threads/step-over-thread-exit.exp | 8 ++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/gdb/testsuite/gdb.threads/step-over-thread-exit.c b/gdb/testsuite/gdb.threads/step-over-thread-exit.c index 6cda1a4f1b0..3952e7a9867 100644 --- a/gdb/testsuite/gdb.threads/step-over-thread-exit.c +++ b/gdb/testsuite/gdb.threads/step-over-thread-exit.c @@ -17,6 +17,7 @@ #include <pthread.h> #include <assert.h> +#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "../lib/my-syscalls.h" @@ -31,16 +32,21 @@ thread_func (void *arg) abort (); } -/* Number of threads we'll create. */ -int n_threads = 100; - int main (int argc, char **argv) { int i; - if (argc > 1) - n_threads = atoi (argv[1]); + /* Number of threads we'll create. Set from argv[1]. */ + int n_threads; + + if (argc != 2) + { + fprintf (stderr, "Usage: %s N_THREADS\n", argv[0]); + return 1; + } + + n_threads = atoi (argv[1]); /* Spawn and join a thread, N_THREADS times. */ for (i = 0; i < n_threads; i++) diff --git a/gdb/testsuite/gdb.threads/step-over-thread-exit.exp b/gdb/testsuite/gdb.threads/step-over-thread-exit.exp index f398538058d..aeca985dec0 100644 --- a/gdb/testsuite/gdb.threads/step-over-thread-exit.exp +++ b/gdb/testsuite/gdb.threads/step-over-thread-exit.exp @@ -71,9 +71,7 @@ proc test {step_over_mode non-stop target-non-stop schedlock cmd ns_stop_all} { if {$schedlock || (${non-stop} == "on" && $ns_stop_all)} { - gdb_test_no_output "set args 1" - - if { ![runto my_exit_syscall] } { + if { ![runto my_exit_syscall -inferior-args 1] } { return } @@ -148,9 +146,7 @@ proc test {step_over_mode non-stop target-non-stop schedlock cmd ns_stop_all} { set n_threads 100 } - gdb_test_no_output "set args $n_threads" - - if { ![runto_main] } { + if { ![runto_main -inferior-args $n_threads] } { return }