* [PATCH v2] [gdb/remote] Reimplement escape_buffer
@ 2026-03-21 9:44 Tom de Vries
2026-03-23 14:12 ` Tom Tromey
0 siblings, 1 reply; 5+ messages in thread
From: Tom de Vries @ 2026-03-21 9:44 UTC (permalink / raw)
To: gdb-patches
With Fedora RH, using Tcl 9.0.2, I run into:
...
(gdb) break -q main^M
[remote] Sending packet: $qXfer:auxv:read::0,1000#6b^M
[remote] Packet received: l!\000\000\000\000\000\000\000\000 ERROR: \
i_read(spawn_id fd=9): invalid or incomplete multibyte or wide character
...
UNRESOLVED: gdb.server/bkpt-other-inferior.exp: inf 2: set breakpoint
...
For reference, on openSUSE Leap 16.0, with Tcl 8.6.15 the initial part of the
problematic string looks like:
...
[remote] Packet received: l!\000\000\000\000\000\000\000\000`ü÷ÿ\177\000...
...
With Tcl 9.0, something (dejagnu/expect/gdb testsuite infrastructure)
has problems with gdb IO containing non-utf-8 chars.
Having said that, I don't think having chars like 'ü' in the debug output is
particularly helpful.
The easiest and most robust approach would be to just print octal escape
sequences, but that would mean we no longer print 'l', which indicates to us
what kind of qXfer reply we're looking at [1].
Reimplement function escape_buffer in gdb/remote.c, to print c_isprint chars
like the actual chars, and others like octal escape sequences, getting us
instead:
...
[remote] Packet received: \
l!\000\000\000\000\000\000\000\000`\374\367\377\177\000...
...
Note that this is ambiguous, because one char '\0' and 4 chars '\\' '0' '0' '0'
are printed the same: \000, but I guess that's a pre-existing problem.
This also fixes test-case gdb.python/py-send-packet.exp, where we run into a
similar problem with the "Sending packet:" line.
Tested on x86_64-linux, with Tcl 9.0.2 and 8.6.15.
A v1 submitted was submitted here [2].
Changes in v2:
- use c_isprint instead of std::isprint
- use string_appendf instead of std::ostringstream
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34012
[1] https://sourceware.org/gdb/current/onlinedocs/gdb.html/General-Query-Packets.html#index-qXfer-packet
[2] v1 https://sourceware.org/pipermail/gdb-patches/2026-March/226110.html
---
gdb/remote.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/gdb/remote.c b/gdb/remote.c
index e84a0dc578b..8c3d60bd326 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -10509,15 +10509,27 @@ remote_target::remote_serial_send_break ()
}
/* Return a string representing an escaped version of BUF, of len N.
- E.g. \n is converted to \\n, \t to \\t, etc. */
+ E.g. '\0' is converted to "\000", etc. */
static std::string
escape_buffer (const char *buf, int n)
{
- string_file stb;
+ std::string str;
- stb.putstrn (buf, n, '\\');
- return stb.release ();
+ for (int i = 0; i < n; ++i)
+ {
+ char c = buf[i];
+ if (c_isprint (c))
+ {
+ str += c;
+ continue;
+ }
+
+ /* Append 3-wide leading zero octal \ooo. */
+ string_appendf (str, "\\%03hho", c);
+ }
+
+ return str;
}
int
base-commit: c3d4baadd233635c13c306d9fdff3342710633ed
--
2.51.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] [gdb/remote] Reimplement escape_buffer
2026-03-21 9:44 [PATCH v2] [gdb/remote] Reimplement escape_buffer Tom de Vries
@ 2026-03-23 14:12 ` Tom Tromey
2026-03-23 17:20 ` Tom de Vries
0 siblings, 1 reply; 5+ messages in thread
From: Tom Tromey @ 2026-03-23 14:12 UTC (permalink / raw)
To: Tom de Vries; +Cc: gdb-patches
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:
Tom> Reimplement function escape_buffer in gdb/remote.c, to print c_isprint chars
Tom> like the actual chars, and others like octal escape sequences, getting us
Tom> instead:
Tom> - stb.putstrn (buf, n, '\\');
Supposedly putstrn does this quoting already.
Why doesn't that work? See ui_file::printchar.
Tom> + /* Append 3-wide leading zero octal \ooo. */
Tom> + string_appendf (str, "\\%03hho", c);
I wonder if %hh actually works properly with the gdb format code.
I don't recall ever seeing this before.
Tom
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] [gdb/remote] Reimplement escape_buffer
2026-03-23 14:12 ` Tom Tromey
@ 2026-03-23 17:20 ` Tom de Vries
2026-03-23 18:28 ` Tom Tromey
0 siblings, 1 reply; 5+ messages in thread
From: Tom de Vries @ 2026-03-23 17:20 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On 3/23/26 3:12 PM, Tom Tromey wrote:
>>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:
>
> Tom> Reimplement function escape_buffer in gdb/remote.c, to print c_isprint chars
> Tom> like the actual chars, and others like octal escape sequences, getting us
> Tom> instead:
>
> Tom> - stb.putstrn (buf, n, '\\');
>
> Supposedly putstrn does this quoting already.
> Why doesn't that work? See ui_file::printchar.
>
Aha, I read the header comment of putstr/putstrn and concluded from it
that it wouldn't quote such chars.
Anyway, the way to make this work using putstrn is:
...
@@ -10515,6 +10515,7 @@ static std::string
escape_buffer (const char *buf, int n)
{
string_file stb;
+ scoped_restore reset = make_scoped_restore (&sevenbit_strings, true);
stb.putstrn (buf, n, '\\');
return stb.release ();
...
> Tom> + /* Append 3-wide leading zero octal \ooo. */
> Tom> + string_appendf (str, "\\%03hho", c);
>
> I wonder if %hh actually works properly with the gdb format code.
> I don't recall ever seeing this before.
>
The %hh is supported since c++11, so I suppose this is supported by the
underlying vsprintf.
Thanks,
- Tom
> Tom
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] [gdb/remote] Reimplement escape_buffer
2026-03-23 17:20 ` Tom de Vries
@ 2026-03-23 18:28 ` Tom Tromey
2026-03-24 15:34 ` Tom de Vries
0 siblings, 1 reply; 5+ messages in thread
From: Tom Tromey @ 2026-03-23 18:28 UTC (permalink / raw)
To: Tom de Vries; +Cc: Tom Tromey, gdb-patches
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:
Tom> Anyway, the way to make this work using putstrn is:
Tom> ...
Tom> @@ -10515,6 +10515,7 @@ static std::string
Tom> escape_buffer (const char *buf, int n)
Tom> {
Tom> string_file stb;
Tom> + scoped_restore reset = make_scoped_restore (&sevenbit_strings, true);
I think this would be fine, maybe with some suitable comment.
Tom
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] [gdb/remote] Reimplement escape_buffer
2026-03-23 18:28 ` Tom Tromey
@ 2026-03-24 15:34 ` Tom de Vries
0 siblings, 0 replies; 5+ messages in thread
From: Tom de Vries @ 2026-03-24 15:34 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On 3/23/26 7:28 PM, Tom Tromey wrote:
>>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:
>
> Tom> Anyway, the way to make this work using putstrn is:
> Tom> ...
> Tom> @@ -10515,6 +10515,7 @@ static std::string
> Tom> escape_buffer (const char *buf, int n)
> Tom> {
> Tom> string_file stb;
> Tom> + scoped_restore reset = make_scoped_restore (&sevenbit_strings, true);
>
> I think this would be fine, maybe with some suitable comment.
I've submitted a v3 (
https://sourceware.org/pipermail/gdb-patches/2026-March/226183.html ).
Thanks,
- Tom
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-03-24 15:34 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-03-21 9:44 [PATCH v2] [gdb/remote] Reimplement escape_buffer Tom de Vries
2026-03-23 14:12 ` Tom Tromey
2026-03-23 17:20 ` Tom de Vries
2026-03-23 18:28 ` Tom Tromey
2026-03-24 15:34 ` 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