aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2023-10-03 10:34:00 -0700
committerGitHub <noreply@github.com>2023-10-03 10:34:00 -0700
commit2da99a11196246ab5f9787117f01b2251480607a (patch)
treef9d3c2249efb847101d8c6f3e42dfa00cb614f12
parentdd76375c80098be4d08b7e02290e39a8c1d00ab1 (diff)
downloadllvm-2da99a11196246ab5f9787117f01b2251480607a.zip
llvm-2da99a11196246ab5f9787117f01b2251480607a.tar.gz
llvm-2da99a11196246ab5f9787117f01b2251480607a.tar.bz2
[lldb] Expose Platform::Attach through the SB API (#68050)
Expose Platform::Attach through the SB API. rdar://116188959
-rw-r--r--lldb/include/lldb/API/SBAttachInfo.h1
-rw-r--r--lldb/include/lldb/API/SBDebugger.h1
-rw-r--r--lldb/include/lldb/API/SBPlatform.h5
-rw-r--r--lldb/include/lldb/API/SBProcess.h1
-rw-r--r--lldb/packages/Python/lldbsuite/test/gdbclientutils.py6
-rw-r--r--lldb/source/API/SBPlatform.cpp25
-rw-r--r--lldb/test/API/functionalities/gdb_remote_client/TestPlatformAttach.py58
7 files changed, 97 insertions, 0 deletions
diff --git a/lldb/include/lldb/API/SBAttachInfo.h b/lldb/include/lldb/API/SBAttachInfo.h
index ea1145e..c18655f 100644
--- a/lldb/include/lldb/API/SBAttachInfo.h
+++ b/lldb/include/lldb/API/SBAttachInfo.h
@@ -197,6 +197,7 @@ public:
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 29cf2c1..218113a 100644
--- a/lldb/include/lldb/API/SBDebugger.h
+++ b/lldb/include/lldb/API/SBDebugger.h
@@ -487,6 +487,7 @@ private:
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 6567277..e0acc70 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 @@ public:
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 16527bb..8c1c814 100644
--- a/lldb/include/lldb/API/SBProcess.h
+++ b/lldb/include/lldb/API/SBProcess.h
@@ -449,6 +449,7 @@ protected:
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 a0104d3..1784487 100644
--- a/lldb/packages/Python/lldbsuite/test/gdbclientutils.py
+++ b/lldb/packages/Python/lldbsuite/test/gdbclientutils.py
@@ -196,6 +196,9 @@ class MockGDBServerResponder:
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 @@ class MockGDBServerResponder:
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 f8300a5..c31848f 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 0000000..d62e86b
--- /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()