* [PATCH 0/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host
@ 2026-09-19 8:42 Tom de Vries
2026-09-19 8:42 ` [PATCH 1/3] [gdb/testsuite] Add gdb_exit_cleanup Tom de Vries
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Tom de Vries @ 2026-09-19 8:42 UTC (permalink / raw)
To: gdb-patches
A few patches that fix test-case gdb.base/quit-live.exp for remote host.
Tom de Vries (3):
[gdb/testsuite] Add gdb_exit_cleanup
[gdb/testsuite] Use gdb_exit_cleanup a bit more
[gdb/testsuite] Fix gdb.base/quit-live.exp for remote host
gdb/testsuite/gdb.base/quit-live.exp | 14 +++--
.../gdb.server/monitor-exit-quit.exp | 7 +--
gdb/testsuite/gdb.threads/killed.exp | 1 +
gdb/testsuite/lib/gdb.exp | 52 ++++++++++++++++---
4 files changed, 57 insertions(+), 17 deletions(-)
base-commit: dd41575147933228c3996204b68c6c6e6ed3d9e8
--
2.51.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/3] [gdb/testsuite] Add gdb_exit_cleanup
2026-09-19 8:42 [PATCH 0/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host Tom de Vries
@ 2026-09-19 8:42 ` Tom de Vries
2026-09-27 8:52 ` Andrew Burgess
2026-09-19 8:42 ` [PATCH 2/3] [gdb/testsuite] Use gdb_exit_cleanup a bit more Tom de Vries
2026-09-19 8:42 ` [PATCH 3/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host Tom de Vries
2 siblings, 1 reply; 7+ messages in thread
From: Tom de Vries @ 2026-09-19 8:42 UTC (permalink / raw)
To: gdb-patches
Proc default_gdb_exit does two things:
- it tries to make gdb exit, and
- it does cleanup that needs doing after gdb exits.
Factor out the second part as new proc gdb_exit_cleanup.
---
.../gdb.server/monitor-exit-quit.exp | 7 +-----
gdb/testsuite/lib/gdb.exp | 23 ++++++++++++-------
2 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/gdb/testsuite/gdb.server/monitor-exit-quit.exp b/gdb/testsuite/gdb.server/monitor-exit-quit.exp
index cb90169ef0c..75c3e6e2221 100644
--- a/gdb/testsuite/gdb.server/monitor-exit-quit.exp
+++ b/gdb/testsuite/gdb.server/monitor-exit-quit.exp
@@ -70,10 +70,5 @@ gdb_test_multiple "quit" "" {
# Cleanup, as in default_gdb_exit.
if { $do_cleanup } {
- if { ![is_remote host] } {
- remote_close host
- }
- unset gdb_spawn_id
- unset ::gdb_tty_name
- unset inferior_spawn_id
+ gdb_exit_cleanup
}
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 1ebdaf6ba10..7bdc5dad0a7 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -2505,6 +2505,20 @@ proc gdb_reinitialize_dir { subdir } {
}
}
+# Clean up after the current gdb instance that has exited.
+
+proc gdb_exit_cleanup {} {
+ if {![is_remote host]} {
+ if {[catch { remote_close host } message]} {
+ warning "closing gdb failed with: $message"
+ }
+ }
+
+ unset ::gdb_spawn_id
+ unset ::gdb_tty_name
+ unset ::inferior_spawn_id
+}
+
#
# gdb_exit -- exit the GDB, killing the target program if necessary
#
@@ -2547,14 +2561,7 @@ proc default_gdb_exit {} {
}
}
- if {![is_remote host]} {
- if {[catch { remote_close host } message]} {
- warning "closing gdb failed with: $message"
- }
- }
- unset gdb_spawn_id
- unset ::gdb_tty_name
- unset inferior_spawn_id
+ gdb_exit_cleanup
}
# Load a file into the debugger.
--
2.51.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/3] [gdb/testsuite] Use gdb_exit_cleanup a bit more
2026-09-19 8:42 [PATCH 0/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host Tom de Vries
2026-09-19 8:42 ` [PATCH 1/3] [gdb/testsuite] Add gdb_exit_cleanup Tom de Vries
@ 2026-09-19 8:42 ` Tom de Vries
2026-09-27 8:52 ` Andrew Burgess
2026-09-19 8:42 ` [PATCH 3/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host Tom de Vries
2 siblings, 1 reply; 7+ messages in thread
From: Tom de Vries @ 2026-09-19 8:42 UTC (permalink / raw)
To: gdb-patches
I ran into trouble running test-case gdb.base/quit-live.exp using a remote
host configuration:
- host board local-remote-host
- target board remote-gdbserver-on-localhost.
The problem is that the test-case makes gdb quit without updating
gdb_spawn_id. Consequently, default_gdb_exit tries to exit gdb.
It does so by sending quit to gdb and waiting for it to exit, which get us:
...
ERROR: : spawn id exp9 not open
...
Fix this using gdb_exit_cleanup. Likewise in gdb.threads/killed.exp.
---
gdb/testsuite/gdb.base/quit-live.exp | 1 +
gdb/testsuite/gdb.threads/killed.exp | 1 +
2 files changed, 2 insertions(+)
diff --git a/gdb/testsuite/gdb.base/quit-live.exp b/gdb/testsuite/gdb.base/quit-live.exp
index 14f87f9b7f8..8dae4fe2aca 100644
--- a/gdb/testsuite/gdb.base/quit-live.exp
+++ b/gdb/testsuite/gdb.base/quit-live.exp
@@ -152,6 +152,7 @@ proc quit_with_live_inferior {appear_how extra_inferior quit_how} {
gdb_test_multiple "" $test {
eof {
pass $test
+ gdb_exit_cleanup
}
}
}
diff --git a/gdb/testsuite/gdb.threads/killed.exp b/gdb/testsuite/gdb.threads/killed.exp
index 39b60dff8dd..a52ae552a2c 100644
--- a/gdb/testsuite/gdb.threads/killed.exp
+++ b/gdb/testsuite/gdb.threads/killed.exp
@@ -76,6 +76,7 @@ gdb_expect {
}
eof {
pass "GDB exits after multi-threaded program exits messily"
+ gdb_exit_cleanup
}
-re "Cannot find thread ${decimal}: generic error\[\r\n\]*$gdb_prompt $" {
kfail "gdb/568" "GDB exits after multi-threaded program exits messily"
--
2.51.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host
2026-09-19 8:42 [PATCH 0/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host Tom de Vries
2026-09-19 8:42 ` [PATCH 1/3] [gdb/testsuite] Add gdb_exit_cleanup Tom de Vries
2026-09-19 8:42 ` [PATCH 2/3] [gdb/testsuite] Use gdb_exit_cleanup a bit more Tom de Vries
@ 2026-09-19 8:42 ` Tom de Vries
2 siblings, 0 replies; 7+ messages in thread
From: Tom de Vries @ 2026-09-19 8:42 UTC (permalink / raw)
To: gdb-patches
I ran into trouble running test-case gdb.base/quit-live.exp using a remote
host configuration:
- host board local-remote-host
- target board remote-gdbserver-on-localhost.
The test-case uses kill to send a signal to gdb_spawn_id, but with remote host
the gdb_spawn_id points to an ssh session, not gdb.
Detect this more clearly by factoring out a proc kill_gdb (and
remote_kill_spawn_id and remote_kill_spawn_id_p), and erroring out for remote
host/target.
Then fix this by skipping the relevant tests using remote_kill_spawn_id_p.
---
gdb/testsuite/gdb.base/quit-live.exp | 13 ++++++++++---
gdb/testsuite/lib/gdb.exp | 29 ++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/gdb/testsuite/gdb.base/quit-live.exp b/gdb/testsuite/gdb.base/quit-live.exp
index 8dae4fe2aca..8e1b4a428c7 100644
--- a/gdb/testsuite/gdb.base/quit-live.exp
+++ b/gdb/testsuite/gdb.base/quit-live.exp
@@ -43,8 +43,7 @@ if {[build_executable "failed to build" $testfile $srcfile debug]} {
# Send signal SIG to GDB, and expect GDB to exit.
proc test_quit_with_sig {sig} {
- set gdb_pid [exp_pid -i [board_info host fileid]]
- remote_exec host "kill -$sig ${gdb_pid}"
+ kill_gdb $sig
set test "quit with SIG$sig"
# If GDB mishandles the signal and doesn't exit, this should FAIL
@@ -176,7 +175,15 @@ foreach_with_prefix appear_how {"run" "attach" "attach-nofile"} {
}
foreach_with_prefix extra_inferior {0 1} {
- foreach_with_prefix quit_how {"quit" "sigterm" "sighup"} {
+ set qhs {}
+ lappend qhs "quit"
+ foreach sig {"sigterm" "sighup"} {
+ if {[remote_kill_spawn_id_p host $sig]} {
+ lappend qhs $sig
+ }
+ }
+
+ foreach_with_prefix quit_how $qhs {
quit_with_live_inferior $appear_how $extra_inferior $quit_how
}
}
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 7bdc5dad0a7..b249425528d 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -12473,6 +12473,35 @@ proc unprintable_to_octal { input_string } {
# Ignore args and don't do anything. Can be used with proc with_override.
proc nop {args} {}
+# Return 1 if SIG can be delivered to a spawn_id on board.
+proc remote_kill_spawn_id_p { board sig } {
+ if {$board == "host" || $board == "target"} {
+ if {[isremote $board]} {
+ # For remote host/target, the spawn_id holds the pid of the ssh
+ # session, so we'd end up sending signals to ssh instead.
+ return 0
+ }
+ }
+
+ return 1
+}
+
+# Send SIG to PID on BOARD.
+proc remote_kill_spawn_id { board spawn_id sig } {
+ set pid [exp_pid -i $spawn_id]
+
+ if {![remote_kill_spawn_id_p $board $sig]} {
+ error "Can't send signal $sig to $pid on remote $board"
+ }
+
+ return [remote_exec $board "kill -$sig $pid"]
+}
+
+# Send SIG to GDB.
+proc kill_gdb { sig } {
+ return [remote_kill_spawn_id host $::gdb_spawn_id $sig]
+}
+
require {tcl_version_at_least 8 6 2}
# Always load compatibility stuff.
--
2.51.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] [gdb/testsuite] Use gdb_exit_cleanup a bit more
2026-09-19 8:42 ` [PATCH 2/3] [gdb/testsuite] Use gdb_exit_cleanup a bit more Tom de Vries
@ 2026-09-27 8:52 ` Andrew Burgess
2026-09-28 8:59 ` Tom de Vries
0 siblings, 1 reply; 7+ messages in thread
From: Andrew Burgess @ 2026-09-27 8:52 UTC (permalink / raw)
To: Tom de Vries, gdb-patches
Tom de Vries <tdevries@suse.de> writes:
> I ran into trouble running test-case gdb.base/quit-live.exp using a remote
> host configuration:
> - host board local-remote-host
> - target board remote-gdbserver-on-localhost.
>
> The problem is that the test-case makes gdb quit without updating
> gdb_spawn_id. Consequently, default_gdb_exit tries to exit gdb.
> It does so by sending quit to gdb and waiting for it to exit, which get us:
> ...
> ERROR: : spawn id exp9 not open
> ...
>
> Fix this using gdb_exit_cleanup. Likewise in gdb.threads/killed.exp.
> ---
> gdb/testsuite/gdb.base/quit-live.exp | 1 +
> gdb/testsuite/gdb.threads/killed.exp | 1 +
> 2 files changed, 2 insertions(+)
>
> diff --git a/gdb/testsuite/gdb.base/quit-live.exp b/gdb/testsuite/gdb.base/quit-live.exp
> index 14f87f9b7f8..8dae4fe2aca 100644
> --- a/gdb/testsuite/gdb.base/quit-live.exp
> +++ b/gdb/testsuite/gdb.base/quit-live.exp
> @@ -152,6 +152,7 @@ proc quit_with_live_inferior {appear_how extra_inferior quit_how} {
> gdb_test_multiple "" $test {
> eof {
> pass $test
> + gdb_exit_cleanup
There's another place in this test script which detects eof from GDB,
but you've not added the gdb_exit_cleanup call there.
Should we also be patching that location? If not why not? And if the
answer is there's a good reason why not, then I think it is worth
mentioning in the commit message, and as a comment at that location in
the code.
Thanks,
Andrew
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] [gdb/testsuite] Add gdb_exit_cleanup
2026-09-19 8:42 ` [PATCH 1/3] [gdb/testsuite] Add gdb_exit_cleanup Tom de Vries
@ 2026-09-27 8:52 ` Andrew Burgess
0 siblings, 0 replies; 7+ messages in thread
From: Andrew Burgess @ 2026-09-27 8:52 UTC (permalink / raw)
To: Tom de Vries, gdb-patches
Tom de Vries <tdevries@suse.de> writes:
> Proc default_gdb_exit does two things:
> - it tries to make gdb exit, and
> - it does cleanup that needs doing after gdb exits.
>
> Factor out the second part as new proc gdb_exit_cleanup.
LGTM.
Approved-By: Andrew Burgess <aburgess@redhat.com>
Thanks,
Andrew
> ---
> .../gdb.server/monitor-exit-quit.exp | 7 +-----
> gdb/testsuite/lib/gdb.exp | 23 ++++++++++++-------
> 2 files changed, 16 insertions(+), 14 deletions(-)
>
> diff --git a/gdb/testsuite/gdb.server/monitor-exit-quit.exp b/gdb/testsuite/gdb.server/monitor-exit-quit.exp
> index cb90169ef0c..75c3e6e2221 100644
> --- a/gdb/testsuite/gdb.server/monitor-exit-quit.exp
> +++ b/gdb/testsuite/gdb.server/monitor-exit-quit.exp
> @@ -70,10 +70,5 @@ gdb_test_multiple "quit" "" {
>
> # Cleanup, as in default_gdb_exit.
> if { $do_cleanup } {
> - if { ![is_remote host] } {
> - remote_close host
> - }
> - unset gdb_spawn_id
> - unset ::gdb_tty_name
> - unset inferior_spawn_id
> + gdb_exit_cleanup
> }
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index 1ebdaf6ba10..7bdc5dad0a7 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -2505,6 +2505,20 @@ proc gdb_reinitialize_dir { subdir } {
> }
> }
>
> +# Clean up after the current gdb instance that has exited.
> +
> +proc gdb_exit_cleanup {} {
> + if {![is_remote host]} {
> + if {[catch { remote_close host } message]} {
> + warning "closing gdb failed with: $message"
> + }
> + }
> +
> + unset ::gdb_spawn_id
> + unset ::gdb_tty_name
> + unset ::inferior_spawn_id
> +}
> +
> #
> # gdb_exit -- exit the GDB, killing the target program if necessary
> #
> @@ -2547,14 +2561,7 @@ proc default_gdb_exit {} {
> }
> }
>
> - if {![is_remote host]} {
> - if {[catch { remote_close host } message]} {
> - warning "closing gdb failed with: $message"
> - }
> - }
> - unset gdb_spawn_id
> - unset ::gdb_tty_name
> - unset inferior_spawn_id
> + gdb_exit_cleanup
> }
>
> # Load a file into the debugger.
> --
> 2.51.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] [gdb/testsuite] Use gdb_exit_cleanup a bit more
2026-09-27 8:52 ` Andrew Burgess
@ 2026-09-28 8:59 ` Tom de Vries
0 siblings, 0 replies; 7+ messages in thread
From: Tom de Vries @ 2026-09-28 8:59 UTC (permalink / raw)
To: Andrew Burgess, gdb-patches
On 9/27/26 10:52 AM, Andrew Burgess wrote:
> Tom de Vries <tdevries@suse.de> writes:
>
>> I ran into trouble running test-case gdb.base/quit-live.exp using a remote
>> host configuration:
>> - host board local-remote-host
>> - target board remote-gdbserver-on-localhost.
>>
>> The problem is that the test-case makes gdb quit without updating
>> gdb_spawn_id. Consequently, default_gdb_exit tries to exit gdb.
>> It does so by sending quit to gdb and waiting for it to exit, which get us:
>> ...
>> ERROR: : spawn id exp9 not open
>> ...
>>
>> Fix this using gdb_exit_cleanup. Likewise in gdb.threads/killed.exp.
>> ---
>> gdb/testsuite/gdb.base/quit-live.exp | 1 +
>> gdb/testsuite/gdb.threads/killed.exp | 1 +
>> 2 files changed, 2 insertions(+)
>>
>> diff --git a/gdb/testsuite/gdb.base/quit-live.exp b/gdb/testsuite/gdb.base/quit-live.exp
>> index 14f87f9b7f8..8dae4fe2aca 100644
>> --- a/gdb/testsuite/gdb.base/quit-live.exp
>> +++ b/gdb/testsuite/gdb.base/quit-live.exp
>> @@ -152,6 +152,7 @@ proc quit_with_live_inferior {appear_how extra_inferior quit_how} {
>> gdb_test_multiple "" $test {
>> eof {
>> pass $test
>> + gdb_exit_cleanup
>
> There's another place in this test script which detects eof from GDB,
> but you've not added the gdb_exit_cleanup call there.
>
> Should we also be patching that location? If not why not? And if the
> answer is there's a good reason why not, then I think it is worth
> mentioning in the commit message, and as a comment at that location in
> the code.
>
Hi Andrew,
thanks for the review(s).
The focus of this commit is to address a specific error, and the
addition in quit_with_live_inferior fixes it.
I did not encounter the same error in test_quit_with_sig, but it's
probably a good idea to apply the same pattern.
[ It might even be necessary on msys2, but AFAIR currently the test-case
fails in such a way that the eof is not reached. I briefly tried making
the testcase work using some kill equivalent, but that didn't work out. ]
Anyway, I've added the gdb_exit_cleanup in test_quit_with_sig, and I've
updated the commit message to:
...
Fix this in quit_with_live_inferior using gdb_exit_cleanup.
Likewise in gdb.threads/killed.exp.
While we're at it, also add default_gdb_exit for another eof clause
in gdb.base/quit-live.exp, in proc test_quit_with_sig.
...
and pushed.
Thanks,
- Tom
> Thanks,
> Andrew
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-09-28 9:00 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-19 8:42 [PATCH 0/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host Tom de Vries
2026-09-19 8:42 ` [PATCH 1/3] [gdb/testsuite] Add gdb_exit_cleanup Tom de Vries
2026-09-27 8:52 ` Andrew Burgess
2026-09-19 8:42 ` [PATCH 2/3] [gdb/testsuite] Use gdb_exit_cleanup a bit more Tom de Vries
2026-09-27 8:52 ` Andrew Burgess
2026-09-28 8:59 ` Tom de Vries
2026-09-19 8:42 ` [PATCH 3/3] [gdb/testsuite] Fix gdb.base/quit-live.exp for remote host Tom de Vries
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox