From: Tom de Vries <tdevries@suse.de>
To: Kevin Buettner <kevinb@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH] [gdb/testsuite, Tcl 9] Fix EILSEQ problems for UTF8 related tests
Date: Tue, 26 May 2026 11:22:19 +0200 [thread overview]
Message-ID: <6032850a-7dcf-4daf-8b1e-258ab0906754@suse.de> (raw)
In-Reply-To: <20260525051442.2805651-2-kevinb@redhat.com>
On 5/25/26 7:14 AM, Kevin Buettner wrote:
> On Fedora 44 and Rawhide (Fedora 45), these tests...
>
> gdb.ada/non-ascii-utf-8.exp
> gdb.base/utf8-identifiers.exp
> gdb.rust/unicode.exp
>
> ...all die due to these errors:
>
> Running ...gdb/testsuite/gdb.base/utf8-identifiers.exp ...
> ERROR: tcl error sourcing .../gdb/testsuite/gdb.base/utf8-identifiers.exp.
> ERROR: tcl error code POSIX EILSEQ {invalid or incomplete multibyte or wide character}
> error writing "file6": invalid or incomplete multibyte or wide character
> ...
>
> (I've shortened some of the pathnames for brevity.)
>
> These Fedora systems are using Tcl 9 and also an updated version of
> dejagnu with this change applied:
>
> * Thu Apr 16 2026 Jakub Jelinek <jakub@redhat.com> - 1:1.6.3-17
> - Apply full set of Tcl 9 compatibility fixes from upstream PR80674 branch
> (#2448542)
>
> That runtest change is responsible for the POSIX EILSEQ errors on
> machines with that change. The change to runtest causing the change
> in behavior for GDB is the addition of these lines near the top of
> the runtest script:
>
> # Ensure that DejaGnu will be run in the POSIX locale
> LC_ALL=C
> export LC_ALL
>
> TCL 8 used a permissive encoding strategy: bytes that could not be
> represented in the current encoding were silently mangled or
> substituted. TCL 9 changed this default to a strict profile, which
> means that any attempt to write a character that cannot be expressed
> in the channel's encoding raises a POSIX EILSEQ error ("invalid or
> incomplete multibyte or wide character").
>
> So, together, this Tcl 9 behavior combined with the dejagnu change
> to runtest causes the EILSEQ error for the tests mentioned earlier.
>
> Fix it by using "fconfigure $handle -encoding utf-8 -profile replace"
> in proc spawn_capture_tty_name, and proc gdb_stdin_log_init. Also,
> the open_logs wrapper has been changed to invoke fconfigure using only
> "-encoding utf-8". Testing showed that "-profile replace" wasn't
> necessary there.
>
Hi Kevin,
this LGTM, so:
Reviewed-By: Tom de Vries <tdevries@suse.de>
I also reviewed this using Claude code, and there were two notes:
- using catch for one fconfigure, but not the other two.
- it might be a good idea to add a comment in open_logs to make it
explicit that unlike elsewhere, "-profile replace" isn't used.
Thanks,
- Tom
> Tested on Fedora 28 (Tcl 8.6.8), Fedora 43 (Tcl 9.0.2 / 8.6.16; expect
> uses 8.6.16), Fedora 44 (Tcl 9.0.2 / 8.6.17; expect uses 9.0.2), and
> Rawhide / Fedora 45 (Tcl 9.0.3 / 8.6.18; expect uses 9.0.3).
> ---
> gdb/testsuite/lib/gdb.exp | 33 +++++++++++++++++++++++++++++++++
> 1 file changed, 33 insertions(+)
>
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index 28709004570..52e4be9122d 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -166,6 +166,27 @@ proc load_lib { file } {
> return $result
> }
>
> +# Tcl 9.0 changed the default channel encoding profile to "strict". When
> +# runtest sets LC_ALL=C the system encoding is iso8859-1, so file channels
> +# opened by DejaGNU (gdb.sum, gdb.log) and spawn channels (for GDB and
> +# subprocesses) default to iso8859-1 with strict profile. Writing
> +# non-Latin-1 characters in test names then raises EILSEQ, and sending them
> +# to GDB truncates the command at the unrepresentable character.
> +#
> +# Fix this by:
> +# 1. Overriding open_logs to reconfigure gdb.sum to utf-8 after DejaGNU
> +# opens it with the system (iso8859-1) encoding.
> +# 2. Reconfiguring each new spawn channel to utf-8 in
> +# spawn_capture_tty_name, which wraps every spawn call.
> +# 3. Reconfiguring gdb.in to utf-8 in gdb_stdin_log_init.
> +
> +rename open_logs saved_open_logs
> +proc open_logs {} {
> + saved_open_logs
> + global sum_file
> + fconfigure $sum_file -encoding utf-8
> +}
> +
> load_lib libgloss.exp
> load_lib cache.exp
> load_lib gdb-utils.exp
> @@ -2633,6 +2654,7 @@ proc gdb_file_cmd { arg {kill_flag 1} } {
> proc spawn_capture_tty_name { args } {
> set result [uplevel builtin_spawn $args]
> upvar spawn_out spawn_out
> + upvar spawn_id spawn_id
> if { [info exists spawn_out(slave,name)] } {
> set ::last_spawn_tty_name $spawn_out(slave,name)
> } else {
> @@ -2648,6 +2670,12 @@ proc spawn_capture_tty_name { args } {
> # use -nocomplain here we would otherwise get an error.
> unset -nocomplain ::last_spawn_tty_name
> }
> + # Tcl 9.0 defaults spawn channels to iso8859-1/strict, which raises
> + # EILSEQ when non-Latin-1 characters (e.g. function names with UTF-8
> + # letters) are written to or read from the channel. Use utf-8 instead.
> + if {[tcl_version_at_least 9 0 0]} {
> + catch {fconfigure $spawn_id -encoding utf-8 -profile replace}
> + }
> return $result
> }
>
> @@ -10419,6 +10447,11 @@ proc gdb_stdin_log_init { } {
> set logfile [standard_output_file_with_gdb_instance gdb.in]
> set in_file [open $logfile w]
>
> + if {[tcl_version_at_least 9 0 0]} {
> + # Tcl 9 strict profile: gdb.in must accept UTF-8 command strings.
> + fconfigure $in_file -encoding utf-8 -profile replace
> + }
> +
> verbose -log ""
> verbose -log "Starting logfile: $logfile"
> verbose -log ""
next prev parent reply other threads:[~2026-05-26 9:23 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-25 5:14 Kevin Buettner
2026-05-26 9:22 ` Tom de Vries [this message]
2026-05-26 19:42 ` Kevin Buettner
2026-05-28 8:14 ` Tom de Vries
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=6032850a-7dcf-4daf-8b1e-258ab0906754@suse.de \
--to=tdevries@suse.de \
--cc=gdb-patches@sourceware.org \
--cc=kevinb@redhat.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