[Lldb-commits] [lldb] [lldb] Expose Platform::Attach through the SB API (PR #68050)

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 2 16:39:46 PDT 2023


https://github.com/JDevlieghere created https://github.com/llvm/llvm-project/pull/68050

Expose Platform::Attach through the SB API.

rdar://116188959

>From 6cf631f5acf3eb18e7cf12a2b996c9f974a360e2 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Sun, 1 Oct 2023 20:48:50 -0700
Subject: [PATCH] [lldb] Expose Platform::Attach through the SB API

Expose Platform::Attach through the SB API.

rdar://116188959
---
 lldb/include/lldb/API/SBAttachInfo.h          |  1 +
 lldb/include/lldb/API/SBDebugger.h            |  1 +
 lldb/include/lldb/API/SBPlatform.h            |  5 ++
 lldb/include/lldb/API/SBProcess.h             |  1 +
 .../Python/lldbsuite/test/gdbclientutils.py   |  6 ++
 lldb/source/API/SBPlatform.cpp                | 25 ++++++++
 .../gdb_remote_client/TestPlatformAttach.py   | 58 +++++++++++++++++++
 7 files changed, 97 insertions(+)
 create mode 100644 lldb/test/API/functionalities/gdb_remote_client/TestPlatformAttach.py

diff --git a/lldb/include/lldb/API/SBAttachInfo.h b/lldb/include/lldb/API/SBAttachInfo.h
index ea1145e625856f0..c18655fee77e0ac 100644
--- a/lldb/include/lldb/API/SBAttachInfo.h
+++ b/lldb/include/lldb/API/SBAttachInfo.h
@@ -197,6 +197,7 @@ class LLDB_API SBAttachInfo {
 
 protected:
   friend class SBTarget;
+  friend class SBPlatform;
 
   friend class lldb_private::ScriptInterpreter;
 
diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h
index 29cf2c16fad4bd7..218113a7a391f35 100644
--- a/lldb/include/lldb/API/SBDebugger.h
+++ b/lldb/include/lldb/API/SBDebugger.h
@@ -487,6 +487,7 @@ class LLDB_API SBDebugger {
   friend class SBProcess;
   friend class SBSourceManager;
   friend class SBStructuredData;
+  friend class SBPlatform;
   friend class SBTarget;
   friend class SBTrace;
 
diff --git a/lldb/include/lldb/API/SBPlatform.h b/lldb/include/lldb/API/SBPlatform.h
index 6567277a5d161e7..614ee3202def5bc 100644
--- a/lldb/include/lldb/API/SBPlatform.h
+++ b/lldb/include/lldb/API/SBPlatform.h
@@ -10,6 +10,7 @@
 #define LLDB_API_SBPLATFORM_H
 
 #include "lldb/API/SBDefines.h"
+#include "lldb/API/SBProcess.h"
 
 #include <functional>
 
@@ -19,6 +20,7 @@ struct PlatformShellCommand;
 namespace lldb {
 
 class SBLaunchInfo;
+class SBAttachInfo;
 
 class LLDB_API SBPlatformConnectOptions {
 public:
@@ -149,6 +151,9 @@ class LLDB_API SBPlatform {
 
   SBError Launch(SBLaunchInfo &launch_info);
 
+  SBProcess Attach(SBAttachInfo &attach_info, const SBDebugger &debugger,
+                   SBTarget &target, SBError &error);
+
   SBError Kill(const lldb::pid_t pid);
 
   SBError
diff --git a/lldb/include/lldb/API/SBProcess.h b/lldb/include/lldb/API/SBProcess.h
index 16527bb0291fcb4..8c1c81418f83d12 100644
--- a/lldb/include/lldb/API/SBProcess.h
+++ b/lldb/include/lldb/API/SBProcess.h
@@ -449,6 +449,7 @@ class LLDB_API SBProcess {
   friend class SBExecutionContext;
   friend class SBFunction;
   friend class SBModule;
+  friend class SBPlatform;
   friend class SBTarget;
   friend class SBThread;
   friend class SBValue;
diff --git a/lldb/packages/Python/lldbsuite/test/gdbclientutils.py b/lldb/packages/Python/lldbsuite/test/gdbclientutils.py
index a0104d36df8d903..1784487323ad6be 100644
--- a/lldb/packages/Python/lldbsuite/test/gdbclientutils.py
+++ b/lldb/packages/Python/lldbsuite/test/gdbclientutils.py
@@ -196,6 +196,9 @@ def respond(self, packet):
             return self.vFile(packet)
         if packet.startswith("vRun;"):
             return self.vRun(packet)
+        if packet.startswith("qLaunchGDBServer;"):
+            _, host = packet.partition(";")[2].split(":")
+            return self.qLaunchGDBServer(host)
         if packet.startswith("qLaunchSuccess"):
             return self.qLaunchSuccess()
         if packet.startswith("QEnvironment:"):
@@ -329,6 +332,9 @@ def vFile(self, packet):
     def vRun(self, packet):
         return ""
 
+    def qLaunchGDBServer(self, host):
+        raise self.UnexpectedPacketException()
+
     def qLaunchSuccess(self):
         return ""
 
diff --git a/lldb/source/API/SBPlatform.cpp b/lldb/source/API/SBPlatform.cpp
index f8300a5bab30e41..7dfbb1373989c02 100644
--- a/lldb/source/API/SBPlatform.cpp
+++ b/lldb/source/API/SBPlatform.cpp
@@ -7,12 +7,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "lldb/API/SBPlatform.h"
+#include "lldb/API/SBDebugger.h"
 #include "lldb/API/SBEnvironment.h"
 #include "lldb/API/SBError.h"
 #include "lldb/API/SBFileSpec.h"
 #include "lldb/API/SBLaunchInfo.h"
 #include "lldb/API/SBModuleSpec.h"
 #include "lldb/API/SBPlatform.h"
+#include "lldb/API/SBTarget.h"
 #include "lldb/API/SBUnixSignals.h"
 #include "lldb/Host/File.h"
 #include "lldb/Target/Platform.h"
@@ -574,6 +576,29 @@ SBError SBPlatform::Launch(SBLaunchInfo &launch_info) {
   });
 }
 
+SBProcess SBPlatform::Attach(SBAttachInfo &attach_info,
+                             const SBDebugger &debugger, SBTarget &target,
+                             SBError &error) {
+  LLDB_INSTRUMENT_VA(this, attach_info);
+
+  if (PlatformSP platform_sp = GetSP()) {
+    if (platform_sp->IsConnected()) {
+      ProcessAttachInfo &info = attach_info.ref();
+      Status status;
+      ProcessSP process_sp = platform_sp->Attach(info, debugger.ref(),
+                                                 target.GetSP().get(), status);
+      error.SetError(status);
+      return SBProcess(process_sp);
+    }
+
+    error.SetErrorString("not connected");
+    return {};
+  }
+
+  error.SetErrorString("invalid platform");
+  return {};
+}
+
 SBError SBPlatform::Kill(const lldb::pid_t pid) {
   LLDB_INSTRUMENT_VA(this, pid);
   return ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
diff --git a/lldb/test/API/functionalities/gdb_remote_client/TestPlatformAttach.py b/lldb/test/API/functionalities/gdb_remote_client/TestPlatformAttach.py
new file mode 100644
index 000000000000000..d62e86b2a3c1d20
--- /dev/null
+++ b/lldb/test/API/functionalities/gdb_remote_client/TestPlatformAttach.py
@@ -0,0 +1,58 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+from lldbsuite.test.gdbclientutils import *
+from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
+
+
+class TestPlatformAttach(GDBRemoteTestBase):
+    @skipIfRemote
+    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr52451")
+    def test_attach(self):
+        """Test attaching by name"""
+
+        class MyPlatformResponder(MockGDBServerResponder):
+            def __init__(self, port):
+                MockGDBServerResponder.__init__(self)
+                self.port = port
+
+            def qLaunchGDBServer(self, _):
+                return "pid:1337;port:{};".format(self.port)
+
+            def qfProcessInfo(self, packet):
+                return "pid:95117;name:666f6f;"
+
+        class MyGDBResponder(MockGDBServerResponder):
+            def __init__(self):
+                MockGDBServerResponder.__init__(self)
+
+            def vAttach(self, _):
+                return "OK"
+
+        self.server.responder = MyGDBResponder()
+        port = self.server._socket._server_socket.getsockname()[1]
+
+        platform_socket = TCPServerSocket()
+        platform_server = MockGDBServer(platform_socket)
+        platform_server.responder = MyPlatformResponder(port)
+        platform_server.start()
+
+        error = lldb.SBError()
+        platform = lldb.SBPlatform("remote-linux")
+        self.dbg.SetSelectedPlatform(platform)
+
+        error = platform.ConnectRemote(
+            lldb.SBPlatformConnectOptions(platform_server.get_connect_url())
+        )
+        self.assertSuccess(error)
+        self.assertTrue(platform.IsConnected())
+
+        attach_info = lldb.SBAttachInfo()
+        attach_info.SetExecutable("foo")
+
+        target = lldb.SBTarget()
+        process = platform.Attach(attach_info, self.dbg, target, error)
+        self.assertSuccess(error)
+        self.assertEqual(process.GetProcessID(), 95117)
+
+        platform.DisconnectRemote()



More information about the lldb-commits mailing list