From: Pedro Alves <pedro@palves.net>
To: Tom Tromey <tromey@adacore.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH v2 00/47] Windows non-stop mode
Date: Thu, 12 Jun 2025 00:51:43 +0100 [thread overview]
Message-ID: <747c4557-0eb3-4f5a-8ad0-cf734d69d59e@palves.net> (raw)
In-Reply-To: <87ldq6ax6c.fsf@tromey.com>
[-- Attachment #1: Type: text/plain, Size: 3107 bytes --]
On 2025-06-05 18:57, Tom Tromey wrote:
>
> I'm not quite as sure about the last one. This test sets a couple of
> breakpoints that have 'commands', where the commands delete the
> breakpoint, like:
>
> [ break main.adb:4 then ... ]
> "silent",
> 'printf "Breakpoint hit #1.\\n"',
> "clear main.adb:4",
> "continue",
> "end",
>
> When running the expected output is seen but gdb says:
>
> (gdb) run
> Starting program: C:\[...]
> Breakpoint hit #1.
> Breakpoint hit #2.
> No unwaited-for children left.
>
> It's that last line that causes the problem. The test expects an "exit
> notification", which is kind of complicated in this test suite, but I
> think for native testing boils down to a message like "[Inferior
> ... exited ...]".
>
> I see this "unwaited-for" text in infrun.c. But I wonder if this is
> really intended.
Hmm, I'm not sure how you're seeing that. That is the output of a TARGET_WAITKIND_NO_RESUMED
event. But it can also be a TARGET_WAITKIND_THREAD_EXITED, which GDB treats as
TARGET_WAITKIND_NO_RESUMED in some cases, but only if the target backend is not in non-stop mode.
In any case, TARGET_WAITKIND_NO_RESUMED means that infrun now believes that the target
has no resumed threads left running, so if it went back to waiting for events, it
would be stuck there forever, as no thread would ever report an event -- none is resumed.
"No unwaited-for children left" is the text I came up with back when I added
TARGET_WAITKIND_NO_RESUMED, and I based it on "man waitpid", which says:
ERRORS
ECHILD (for wait()) The calling process does not have any unwaited-for children.
I kind of regret it, though. Something like "No resumed threads left." would be
probably clearer and less implementer-speak.
Is the test using scheduler locking (and was previously ignoring the error
that "set scheduler-locking on" currently issues on Windows) ?
I ask because that is expected output if you continue with scheduler locking enabled,
and the thread exits. E.g., the new gdb.threads/leader-exit-schedlock.exp testcase added
by the series, has:
Thread 1 "leader-exit-schedlock" hit Breakpoint 2, main () at /home/alves/rocm/gdb/src/gdb/testsuite/gdb.threads/leader-exit-schedlock.c:55
55 return 0; /* break-here */
(gdb) PASS: gdb.threads/leader-exit-schedlock.exp: target-non-stop=off: exit-threads-first=0: schedlock=on: continue to breakpoint: break-here
set scheduler-locking on
(gdb) PASS: gdb.threads/leader-exit-schedlock.exp: target-non-stop=off: exit-threads-first=0: schedlock=on: set scheduler-locking on
c
Continuing.
[Thread 11496.0x150 exited]
No unwaited-for children left.
But I don't suppose your test was really doing that.
Maybe some logs like:
set debug infrun
set debugevents on
set debugexceptions on
set debugexec on
would help see what's going on.
I wrote a new testcase based on your description, see attached. It passes cleanly here.
Can you help pointing me to what would need to be changed in the test to make it closer to the AdaCore test?
Pedro Alves
[-- Attachment #2: 0001-New-gdb.threads-continue-break-command.exp-testcase.patch --]
[-- Type: text/x-patch, Size: 5301 bytes --]
From 326bf95fb5b5b92145d6b2aa30fc30cb7fcd2171 Mon Sep 17 00:00:00 2001
From: Pedro Alves <pedro@palves.net>
Date: Wed, 11 Jun 2025 23:35:57 +0100
Subject: [PATCH] New gdb.threads/continue-break-command.exp testcase
Change-Id: Ie57493bb5032f28619db418d9d8068aae2d40b09
---
.../gdb.threads/continue-break-command.c | 94 +++++++++++++++++++
.../gdb.threads/continue-break-command.exp | 76 +++++++++++++++
2 files changed, 170 insertions(+)
create mode 100644 gdb/testsuite/gdb.threads/continue-break-command.c
create mode 100644 gdb/testsuite/gdb.threads/continue-break-command.exp
diff --git a/gdb/testsuite/gdb.threads/continue-break-command.c b/gdb/testsuite/gdb.threads/continue-break-command.c
new file mode 100644
index 00000000000..78fabdc5d33
--- /dev/null
+++ b/gdb/testsuite/gdb.threads/continue-break-command.c
@@ -0,0 +1,94 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2025 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
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <pthread.h>
+#include <assert.h>
+#include <unistd.h>
+
+#define NUM_THREADS 3
+
+static pthread_barrier_t threads_started_barrier;
+
+static pthread_barrier_t may_exit_barrier;
+
+static void *
+thread_func (void *arg)
+{
+ /* Wait until all threads have started. */
+ pthread_barrier_wait (&threads_started_barrier);
+
+ /* Wait until the main thread lets us exit. */
+ pthread_barrier_wait (&may_exit_barrier);
+
+ return NULL;
+}
+
+static void
+threads_started (void)
+{
+}
+
+static void
+foo ()
+{
+}
+
+static void
+bar ()
+{
+}
+
+int
+main (void)
+{
+ pthread_t thread[NUM_THREADS];
+ int i;
+
+ alarm (30);
+
+ pthread_barrier_init (&threads_started_barrier, NULL, NUM_THREADS + 1);
+ pthread_barrier_init (&may_exit_barrier, NULL, NUM_THREADS + 1);
+
+ for (i = 0; i < NUM_THREADS; i++)
+ {
+ int ret;
+
+ ret = pthread_create (&thread[i], NULL, thread_func, NULL);
+ assert (ret == 0);
+ }
+
+ pthread_barrier_wait (&threads_started_barrier);
+
+ threads_started ();
+
+ /* The testcase sets breakpoints on these two, that when hit, are
+ removed. */
+ foo ();
+ bar ();
+
+ /* Call them again to make sure the breakpoints are really
+ deleted. */
+ foo ();
+ bar ();
+
+ pthread_barrier_wait (&may_exit_barrier);
+
+ for (i = 0; i < NUM_THREADS; i++)
+ pthread_join (thread[i], NULL);
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.threads/continue-break-command.exp b/gdb/testsuite/gdb.threads/continue-break-command.exp
new file mode 100644
index 00000000000..5f020425419
--- /dev/null
+++ b/gdb/testsuite/gdb.threads/continue-break-command.exp
@@ -0,0 +1,76 @@
+# Copyright 2025 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
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# XXX, some meaninful explanation here.
+
+standard_testfile .c
+
+if { [build_executable "failed to prepare" $testfile $srcfile \
+ {debug pthreads}] \
+ == -1 } {
+ return
+}
+
+proc test {} {
+ clean_restart $::binfile
+
+ if ![runto threads_started] {
+ return
+ }
+
+ # Disable "[Thread 14192.0x3618 exited with code 0]" messages.
+ gdb_test_no_output "set print thread-events off"
+
+ gdb_breakpoint "foo" message
+ gdb_test_multiple "commands" "command for foo" {
+ -re "End with" {
+ gdb_test \
+ [multi_line_input \
+ {silent} \
+ {printf "Breakpoint hit #1.\n"} \
+ {clear foo} \
+ {continue} \
+ {end}] \
+ "" \
+ $gdb_test_name
+ }
+ }
+
+ gdb_breakpoint "bar" message
+ gdb_test_multiple "commands" "commands for bar" {
+ -re "End with" {
+ gdb_test \
+ [multi_line_input \
+ {silent} \
+ {printf "Breakpoint hit #2.\n"} \
+ {clear bar} \
+ {continue} \
+ {end}] \
+ "" \
+ $gdb_test_name
+ }
+ }
+
+ gdb_test "info breakpoints" ".*"
+
+ gdb_test_sequence "continue" "" \
+ [list \
+ "Continuing\\." \
+ "^\r\nBreakpoint hit #1\\." \
+ "^\r\nBreakpoint hit #2\\." \
+ "^\r\n$::inferior_exited_re normally"]
+}
+
+test
base-commit: eb6c9310ee4d6cbde509d251fafb54ae45f5a5bf
--
2.49.0
next prev parent reply other threads:[~2025-06-11 23:52 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-19 13:22 Pedro Alves
2025-05-19 13:22 ` [PATCH v2 01/47] Make default_gdb_exit resilient to failed closes Pedro Alves
2025-05-19 13:56 ` Andrew Burgess
2025-06-06 13:56 ` Pedro Alves
2025-05-19 13:22 ` [PATCH v2 02/47] Add test for continuing with some threads running Pedro Alves
2025-05-21 19:36 ` Kevin Buettner
2026-04-02 13:07 ` Pedro Alves
2025-05-19 13:22 ` [PATCH v2 03/47] infrun: Remove unnecessary currently_stepping call Pedro Alves
2025-05-21 19:44 ` Kevin Buettner
2026-04-02 13:17 ` Pedro Alves
2025-05-19 13:22 ` [PATCH v2 04/47] infrun: Split currently_stepping, fix sw watchpoints issue Pedro Alves
2026-04-02 13:33 ` Pedro Alves
2025-05-19 13:22 ` [PATCH v2 05/47] thread_info::executing+resumed -> thread_info::internal_state Pedro Alves
2026-04-06 18:01 ` Pedro Alves
2025-05-19 13:22 ` [PATCH v2 06/47] Windows gdb: Dead code in windows_nat_target::do_initial_windows_stuff Pedro Alves
2025-05-19 13:22 ` [PATCH v2 07/47] Windows gdb: Eliminate global current_process.dr[8] global Pedro Alves
2025-05-28 19:09 ` Tom Tromey
2026-04-06 19:44 ` Pedro Alves
2025-05-19 13:22 ` [PATCH v2 08/47] Windows gdb+gdbserver: New find_thread, replaces thread_rec(DONT_INVALIDATE_CONTEXT) Pedro Alves
2025-05-19 13:22 ` [PATCH v2 09/47] Windows gdb: handle_output_debug_string return type Pedro Alves
2025-05-19 13:22 ` [PATCH v2 10/47] Windows gdb: Eliminate reload_context Pedro Alves
2025-05-19 13:22 ` [PATCH v2 11/47] Windows gdb+gdbserver: Eliminate thread_rec(INVALIDATE_CONTEXT) calls Pedro Alves
2025-05-19 13:22 ` [PATCH v2 12/47] Windows gdb+gdbserver: Eliminate DONT_SUSPEND Pedro Alves
2025-05-19 13:22 ` [PATCH v2 13/47] Windows gdb+gdbserver: Eliminate windows_process_info::thread_rec Pedro Alves
2025-05-19 13:22 ` [PATCH v2 14/47] Windows gdb: Simplify windows_nat_target::wait Pedro Alves
2025-05-28 19:16 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 15/47] Windows gdb+gdbserver: Move suspending thread to when returning event Pedro Alves
2025-05-28 19:17 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 16/47] Windows gdb: Introduce continue_last_debug_event_main_thread Pedro Alves
2025-05-28 19:18 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 17/47] Windows gdb: Introduce windows_continue_flags Pedro Alves
2025-05-19 13:22 ` [PATCH v2 18/47] Windows gdb: Factor code out of windows_nat_target::windows_continue Pedro Alves
2025-05-19 13:22 ` [PATCH v2 19/47] Windows gdb: Pending stop and current_event Pedro Alves
2025-05-19 13:22 ` [PATCH v2 20/47] Windows gdb+gdbserver: Elim desired_stop_thread_id / rework pending_stops Pedro Alves
2025-05-30 20:41 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 21/47] Windows gdb+gdbserver: Introduce get_last_debug_event_ptid Pedro Alves
2025-05-28 19:21 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 22/47] Windows gdb: Can't pass signal to thread other than last stopped thread Pedro Alves
2025-05-28 19:22 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 23/47] Windows gdbserver: Fix scheduler-locking Pedro Alves
2025-05-30 20:37 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 24/47] Windows gdb: Enable "set scheduler-locking on" Pedro Alves
2025-05-19 13:22 ` [PATCH v2 25/47] Windows gdbserver: Eliminate soft-interrupt mechanism Pedro Alves
2025-05-19 13:22 ` [PATCH v2 26/47] Windows gdb+gdbserver: Make current_event per-thread state Pedro Alves
2025-05-28 19:30 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 27/47] Windows gdb+gdbserver: Make last_sig " Pedro Alves
2025-05-28 19:31 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 28/47] Windows gdb+gdbserver: Make siginfo_er " Pedro Alves
2025-05-28 19:33 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 29/47] Add backpointer from windows_thread_info to windows_process_info Pedro Alves
2025-05-19 13:22 ` [PATCH v2 30/47] Windows gdb+gdbserver: Share $_siginfo reading code Pedro Alves
2025-05-19 13:22 ` [PATCH v2 31/47] Windows gdb+gdbserver: Eliminate struct pending_stop Pedro Alves
2025-05-28 19:36 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 32/47] Windows gdb: Change serial_event management Pedro Alves
2025-05-28 19:37 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 33/47] Windows gdb: cygwin_set_dr => windows_set_dr, etc Pedro Alves
2025-05-19 13:22 ` [PATCH v2 34/47] Windows gdb: Avoid writing debug registers if watchpoint hit pending Pedro Alves
2025-05-30 20:43 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 35/47] Windows gdb+gdbserver: Check whether DBG_REPLY_LATER is available Pedro Alves
2025-05-19 13:22 ` [PATCH v2 36/47] linux-nat: Factor out get_detach_signal code to common code Pedro Alves
2025-05-28 19:44 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 37/47] Windows GDB: make windows_thread_info be private thread_info data Pedro Alves
2025-05-28 19:52 ` Tom Tromey
2025-05-19 13:22 ` [PATCH v2 38/47] Introduce windows_nat::event_code_to_string Pedro Alves
2025-05-28 19:53 ` Tom Tromey
2025-05-19 13:23 ` [PATCH v2 39/47] Windows gdb: Add non-stop support Pedro Alves
2025-06-05 16:21 ` Tom Tromey
2025-05-19 13:23 ` [PATCH v2 40/47] Windows gdb: Eliminate invalidate_context Pedro Alves
2025-05-28 19:54 ` Tom Tromey
2025-05-19 13:23 ` [PATCH v2 41/47] Windows gdb: Watchpoints while running (internal vs external stops) Pedro Alves
2025-05-30 20:50 ` Tom Tromey
2025-05-19 13:23 ` [PATCH v2 42/47] gdb_test_multiple: Anchor prompt match if -lbl Pedro Alves
2025-05-21 15:19 ` Tom de Vries
2025-05-27 22:41 ` Pedro Alves
2025-05-27 23:20 ` Pedro Alves
2025-05-28 11:59 ` [PATCH v2] of " Pedro Alves
2025-06-05 16:37 ` Pedro Alves
2025-06-05 17:20 ` [PATCH v3] " Pedro Alves
2025-06-06 9:58 ` Tom de Vries
2025-06-06 13:53 ` Pedro Alves
2025-05-19 13:23 ` [PATCH v2 43/47] Windows gdb: extra thread info => show exiting Pedro Alves
2025-05-28 19:58 ` Tom Tromey
2025-05-19 13:23 ` [PATCH v2 44/47] Add gdb.threads/leader-exit-schedlock.exp Pedro Alves
2025-05-29 16:09 ` Tom Tromey
2025-05-19 13:23 ` [PATCH v2 45/47] infrun: with AS+NS, prefer process exit over thread exit Pedro Alves
2025-05-19 13:23 ` [PATCH v2 46/47] Windows gdb: Always non-stop (default to "maint set target-non-stop on") Pedro Alves
2025-05-29 16:02 ` Tom Tromey
2025-05-19 13:23 ` [PATCH v2 47/47] Mention Windows scheduler-locking and non-stop support in NEWS Pedro Alves
2025-05-19 14:07 ` Eli Zaretskii
2025-06-05 17:57 ` [PATCH v2 00/47] Windows non-stop mode Tom Tromey
2025-06-11 22:06 ` [PATCH] Improve attach on Windows (was: Re: [PATCH v2 00/47] Windows non-stop mode) Pedro Alves
2026-04-02 12:21 ` [PATCH] Improve attach on Windows Pedro Alves
2026-04-02 18:52 ` Tom Tromey
2025-06-11 23:51 ` Pedro Alves [this message]
2025-06-12 19:23 ` [PATCH v2 00/47] Windows non-stop mode Tom Tromey
2025-06-13 10:34 ` Pedro Alves
2025-06-13 14:23 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=747c4557-0eb3-4f5a-8ad0-cf734d69d59e@palves.net \
--to=pedro@palves.net \
--cc=gdb-patches@sourceware.org \
--cc=tromey@adacore.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox