https://github.com/charles-zablit created 
https://github.com/llvm/llvm-project/pull/201884

`ProcessGDBRemote::PutSTDIN` calls `SendStdinNotification` with 
`interrupt_timeout  == 0`. While the debuggee is running, 
`GDBRemoteClientBase::Lock::SyncWithContinueThread` treats that as "do not 
interrupt the continue thread" and returns without acquiring the lock, so 
`SendPacketAndWaitForResponse` fails and does not send the I packet. This 
silently drops the STDIN keystroke.

This patch plumbs the process's `GetInterruptTimeout()` through 
`SendStdinNotification` so that we:
- Send \x03
- Wait for the SIGSTOP stop reply
- Delivers the I packet
- Let `ContinueLock::lock` to re-issue the continue.

This patch fixes STDIN under `LLDB_USE_LLDB_SERVER=1` on Windows.

>From c2dac3c3935134100bcd5820ddfd836dd1006278 Mon Sep 17 00:00:00 2001
From: Charles Zablit <[email protected]>
Date: Fri, 5 Jun 2026 17:17:20 +0100
Subject: [PATCH] [lldb][gdb-remote] Plumb interrupt_timeout through
 SendStdinNotification

---
 .../Process/gdb-remote/GDBRemoteCommunicationClient.cpp   | 7 ++++---
 .../Process/gdb-remote/GDBRemoteCommunicationClient.h     | 8 +++++++-
 .../Plugins/Process/gdb-remote/ProcessGDBRemote.cpp       | 2 +-
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git 
a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp 
b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
index 8df7936786b04..3a69a1d21f906 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
@@ -1442,13 +1442,14 @@ bool GDBRemoteCommunicationClient::GetHostInfo(bool 
force) {
   return m_qHostInfo_is_valid == eLazyBoolYes;
 }
 
-int GDBRemoteCommunicationClient::SendStdinNotification(const char *data,
-                                                        size_t data_len) {
+int GDBRemoteCommunicationClient::SendStdinNotification(
+    const char *data, size_t data_len, std::chrono::seconds interrupt_timeout) 
{
   StreamString packet;
   packet.PutCString("I");
   packet.PutBytesAsRawHex8(data, data_len);
   StringExtractorGDBRemote response;
-  if (SendPacketAndWaitForResponse(packet.GetString(), response) ==
+  if (SendPacketAndWaitForResponse(packet.GetString(), response,
+                                   interrupt_timeout) ==
       PacketResult::Success) {
     return 0;
   }
diff --git 
a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h 
b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
index 79ca0bcd3ed22..66d21969fd80b 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
@@ -127,10 +127,16 @@ class GDBRemoteCommunicationClient : public 
GDBRemoteClientBase {
   /// \param[in] data_len
   ///     The number of bytes available at \a data.
   ///
+  /// \param[in] interrupt_timeout
+  ///     If the inferior is running, how long to wait for a `\x03` BREAK
+  ///     to interrupt it before giving up. Pass zero only when the caller 
knows the inferior is stopped.
+  ///
   /// \return
   ///     Zero if the attach was successful, or an error indicating
   ///     an error code.
-  int SendStdinNotification(const char *data, size_t data_len);
+  int SendStdinNotification(
+      const char *data, size_t data_len,
+      std::chrono::seconds interrupt_timeout = std::chrono::seconds(0));
 
   /// Sets the path to use for stdin/out/err for a process
   /// that will be launched with the 'A' packet.
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp 
b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index f6eaf5851338b..110c2702e39ec 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -3338,7 +3338,7 @@ size_t ProcessGDBRemote::PutSTDIN(const char *src, size_t 
src_len,
     ConnectionStatus status;
     m_stdio_communication.WriteAll(src, src_len, status, nullptr);
   } else if (m_stdin_forward) {
-    m_gdb_comm.SendStdinNotification(src, src_len);
+    m_gdb_comm.SendStdinNotification(src, src_len, GetInterruptTimeout());
   }
   return 0;
 }

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to