1 //===-- GDBRemoteCommunicationServerPlatform.h ------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H 10 #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H 11 12 #include <map> 13 #include <mutex> 14 #include <optional> 15 #include <set> 16 17 #include "GDBRemoteCommunicationServerCommon.h" 18 #include "lldb/Host/Socket.h" 19 20 #include "llvm/Support/Error.h" 21 22 namespace lldb_private { 23 namespace process_gdb_remote { 24 25 class GDBRemoteCommunicationServerPlatform 26 : public GDBRemoteCommunicationServerCommon { 27 public: 28 GDBRemoteCommunicationServerPlatform( 29 FileSpec debugserver_path, const Socket::SocketProtocol socket_protocol, 30 uint16_t gdbserver_port); 31 32 ~GDBRemoteCommunicationServerPlatform() override; 33 34 Status LaunchProcess() override; 35 36 void SetInferiorArguments(const lldb_private::Args &args); 37 38 Status LaunchGDBServer(const lldb_private::Args &args, lldb::pid_t &pid, 39 std::string &socket_name, shared_fd_t fd); 40 41 void SetPendingGdbServer(const std::string &socket_name); 42 43 protected: 44 const FileSpec m_debugserver_path; 45 const Socket::SocketProtocol m_socket_protocol; 46 std::recursive_mutex m_spawned_pids_mutex; 47 std::set<lldb::pid_t> m_spawned_pids; 48 49 uint16_t m_gdbserver_port; 50 std::optional<std::string> m_pending_gdb_server_socket_name; 51 52 PacketResult Handle_qLaunchGDBServer(StringExtractorGDBRemote &packet); 53 54 PacketResult Handle_qQueryGDBServer(StringExtractorGDBRemote &packet); 55 56 PacketResult Handle_qKillSpawnedProcess(StringExtractorGDBRemote &packet); 57 58 PacketResult Handle_qPathComplete(StringExtractorGDBRemote &packet); 59 60 PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet); 61 62 PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet); 63 64 PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet); 65 66 PacketResult Handle_qC(StringExtractorGDBRemote &packet); 67 68 PacketResult Handle_jSignalsInfo(StringExtractorGDBRemote &packet); 69 70 private: 71 bool KillSpawnedProcess(lldb::pid_t pid); 72 bool SpawnedProcessIsRunning(lldb::pid_t pid); 73 void AddSpawnedProcess(lldb::pid_t pid); 74 75 void DebugserverProcessReaped(lldb::pid_t pid); 76 77 static const FileSpec &GetDomainSocketDir(); 78 79 static FileSpec GetDomainSocketPath(const char *prefix); 80 81 GDBRemoteCommunicationServerPlatform( 82 const GDBRemoteCommunicationServerPlatform &) = delete; 83 const GDBRemoteCommunicationServerPlatform & 84 operator=(const GDBRemoteCommunicationServerPlatform &) = delete; 85 }; 86 87 } // namespace process_gdb_remote 88 } // namespace lldb_private 89 90 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H 91