[Lldb-commits] [lldb] [lldb] Expose Platform::Attach through the SB API (PR #68050)
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Tue Oct 3 08:41:52 PDT 2023
https://github.com/JDevlieghere updated https://github.com/llvm/llvm-project/pull/68050
>From c83435474699ba6ca5ff57bcb1dacaef0987f4b4 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Tue, 3 Oct 2023 08:41:01 -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..e0acc7003a54bc3 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>
@@ -18,6 +19,7 @@ struct PlatformShellCommand;
namespace lldb {
+class SBAttachInfo;
class SBLaunchInfo;
class LLDB_API SBPlatformConnectOptions {
@@ -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..c31848fe04ea72c 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, debugger, target, error);
+
+ 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