[binutils-gdb] [gdb/remote] Use sevenbit_strings == true in escape_buffer

Tom de Vries via Gdb-cvs <[email protected]>
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7e9614552f205e417366357562afbd21b8d07c29

commit 7e9614552f205e417366357562afbd21b8d07c29
Author: Tom de Vries <[email protected]>
Date:   Wed Mar 25 08:03:01 2026 +0100

    [gdb/remote] Use sevenbit_strings == true in escape_buffer
    
    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.
    
    Fix this by forcing sevenbit_strings to true in escape_buffer, getting us
    instead:
    ...
    [remote] Packet received: \
      l!\000\000\000\000\000\000\000\000`\374\367\377\177\000...
    ...
    
    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 [3]:
    - use c_isprint instead of std::isprint
    - use string_appendf instead of std::ostringstream
    
    Changes in v3:
    - Rather than re-implementing escape_buffer, change it to use
      sevenbit_strings == true.
    - update $subject to indicate new approach
    
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34012
    
    Approved-By: Tom Tromey <[email protected]>
    
    [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
    [3] v2 https://sourceware.org/pipermail/gdb-patches/2026-March/226119.html

Diff:
---
 gdb/remote.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/gdb/remote.c b/gdb/remote.c
index e84a0dc578b..3ec56a6d61b 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -10509,14 +10509,20 @@ 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. '\n' is converted to R"(\012)", '\t' to R"(\011)", etc.  */
 
 static std::string
 escape_buffer (const char *buf, int n)
 {
   string_file stb;
 
+  /* Temporarily set sevenbit_strings to true to make sure that we print
+     chars >= 0x80 as octal escape \ooo, independent of the current
+     sevenbit_strings setting.  This conservative choice is appropriate for
+     debug logs.  */
+  scoped_restore reset = make_scoped_restore (&sevenbit_strings, true);
   stb.putstrn (buf, n, '\\');
+
   return stb.release ();
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.