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 <jo...@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() _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits