[Lldb-commits] [lldb] [lldb] Fix broken pipe error (PR #127100)

Georgiy Samoylov via lldb-commits lldb-commits at lists.llvm.org
Thu Feb 13 09:54:53 PST 2025


https://github.com/sga-sc created https://github.com/llvm/llvm-project/pull/127100

During LLDB testing on slow machines with the remote-linux platform all tests from llgs category fail with python exception `BrokenPipeError`. The main reason of these failures is slow start of lldb-server in gdbserver mode. Due to this desired gdbserver socket does not have time to open by the time the Python script tries to establish a connection.

List of failed tests:

```
TestAppleSimulatorOSType.py
TestGdbRemoteAttach.py
TestGdbRemoteAuxvSupport.py
TestGdbRemoteCompletion.py
TestGdbRemoteExitCode.py
TestGdbRemoteExpeditedRegisters.py
TestGdbRemoteHostInfo.py
TestGdbRemoteKill.py
TestGdbRemoteLaunch.py
TestGdbRemoteModuleInfo.py
TestGdbRemotePlatformFile.py
TestGdbRemoteProcessInfo.py
TestGdbRemoteRegisterState.py
TestGdbRemoteSaveCore.py
TestGdbRemoteSingleStep.py
TestGdbRemoteThreadsInStopReply.py
TestGdbRemote_qThreadStopInfo.py
TestGdbRemote_vCont.py
TestLldbGdbServer.py
TestNonStop.py
TestPtyServer.py
TestGdbRemoteAttachWait.py
TestGdbRemoteConnection.py
TestStubSetSID.py
TestGdbRemoteAbort.py
TestGdbRemoteSegFault.py
TestGdbRemoteLibrariesSvr4Support.py
TestGdbRemoteMemoryAllocation.py
TestGdbRemoteMemoryTagging.py
TestGdbRemoteGPacket.py
TestGdbRemoteTargetXmlPacket.py
TestGdbRemote_QPassSignals.py
TestGdbRemoteThreadName.py
TestPartialResume.py
TestSignal.py
```

This patch implements an additional check for the opened socket on lldb-server side and fixes this error.

>From 1fdc2f811c239bc8992fba9aa8e3d4eb9c76e96a Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <g.samoylov at syntacore.com>
Date: Thu, 6 Feb 2025 13:23:13 +0300
Subject: [PATCH 1/2] [lldb] Fixed a typo

---
 .../test/tools/lldb-server/gdbremote_testcase.py          | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
index cbe430c92fa7f..cf94bf08a5bce 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
@@ -397,13 +397,13 @@ def connect_to_debug_monitor(self, attach_pid=None):
             # Schedule debug monitor to be shut down during teardown.
             logger = self.logger
 
-            connect_attemps = 0
+            connect_attempts = 0
             MAX_CONNECT_ATTEMPTS = 10
 
-            while connect_attemps < MAX_CONNECT_ATTEMPTS:
+            while connect_attempts < MAX_CONNECT_ATTEMPTS:
                 # Create a socket to talk to the server
                 try:
-                    logger.info("Connect attempt %d", connect_attemps + 1)
+                    logger.info("Connect attempt %d", connect_attempts + 1)
                     self.sock = self.create_socket()
                     self._server = Server(self.sock, server)
                     return server
@@ -411,7 +411,7 @@ def connect_to_debug_monitor(self, attach_pid=None):
                     # Ignore, and try again.
                     pass
                 time.sleep(0.5)
-                connect_attemps += 1
+                connect_attempts += 1
 
             # We should close the server here to be safe.
             server.terminate()

>From 8844cd67967e7a55682f2b0fd06e8bebe63dd604 Mon Sep 17 00:00:00 2001
From: Georgiy Samoylov <g.samoylov at syntacore.com>
Date: Thu, 6 Feb 2025 13:21:42 +0300
Subject: [PATCH 2/2] [lldb] Added function for socket checking

---
 .../tools/lldb-server/gdbremote_testcase.py   | 36 ++++++++++++++-----
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
index cf94bf08a5bce..8ee41563da59d 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
@@ -343,6 +343,22 @@ def get_target_byte_order(self):
         target = self.dbg.CreateTarget(inferior_exe_path)
         return target.GetByteOrder()
 
+    def is_port_opened(self):
+        connect_port = self.port
+    
+        err, retcode, cmd_output = self.run_platform_command(f"netstat -ltn | grep {connect_port} | grep LISTEN")
+        
+        self.assertTrue(
+            err.Success(),
+            "Failed to get opened tcp sockets: %s, retcode: %d"
+            % (err.GetCString(), retcode),
+        )
+        
+        if retcode == 0:
+            return True
+        else:
+            return False
+
     def launch_debug_monitor(self, attach_pid=None, logfile=None):
         if self.reverse_connect:
             family, type, proto, _, addr = socket.getaddrinfo(
@@ -401,15 +417,17 @@ def connect_to_debug_monitor(self, attach_pid=None):
             MAX_CONNECT_ATTEMPTS = 10
 
             while connect_attempts < MAX_CONNECT_ATTEMPTS:
-                # Create a socket to talk to the server
-                try:
-                    logger.info("Connect attempt %d", connect_attempts + 1)
-                    self.sock = self.create_socket()
-                    self._server = Server(self.sock, server)
-                    return server
-                except _ConnectionRefused as serr:
-                    # Ignore, and try again.
-                    pass
+                if self.is_port_opened():
+                    # Create a socket to talk to the server
+                    try:
+                        logger.info("Connect attempt %d", connect_attempts + 1)
+                        self.sock = self.create_socket()
+                        self._server = Server(self.sock, server)
+                        return server
+                    except _ConnectionRefused as serr:
+                        # Ignore, and try again.
+                        pass
+                        
                 time.sleep(0.5)
                 connect_attempts += 1
 



More information about the lldb-commits mailing list