1 //===-- PlatformRemoteGDBServer.h ----------------------------------------*- C++ 2 //-*-===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H 11 #define LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H 12 13 #include <string> 14 15 #include "Plugins/Process/Utility/GDBRemoteSignals.h" 16 #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h" 17 #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.h" 18 #include "lldb/Target/Platform.h" 19 20 namespace lldb_private { 21 namespace platform_gdb_server { 22 23 class PlatformRemoteGDBServer : public Platform, private UserIDResolver { 24 public: 25 static void Initialize(); 26 27 static void Terminate(); 28 29 static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); 30 31 static ConstString GetPluginNameStatic(); 32 33 static const char *GetDescriptionStatic(); 34 35 PlatformRemoteGDBServer(); 36 37 ~PlatformRemoteGDBServer() override; 38 39 // lldb_private::PluginInterface functions 40 ConstString GetPluginName() override { return GetPluginNameStatic(); } 41 42 uint32_t GetPluginVersion() override { return 1; } 43 44 // lldb_private::Platform functions 45 Status 46 ResolveExecutable(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, 47 const FileSpecList *module_search_paths_ptr) override; 48 49 bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch, 50 ModuleSpec &module_spec) override; 51 52 const char *GetDescription() override; 53 54 Status GetFileWithUUID(const FileSpec &platform_file, const UUID *uuid_ptr, 55 FileSpec &local_file) override; 56 57 bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info) override; 58 59 uint32_t FindProcesses(const ProcessInstanceInfoMatch &match_info, 60 ProcessInstanceInfoList &process_infos) override; 61 62 Status LaunchProcess(ProcessLaunchInfo &launch_info) override; 63 64 Status KillProcess(const lldb::pid_t pid) override; 65 66 lldb::ProcessSP DebugProcess(ProcessLaunchInfo &launch_info, 67 Debugger &debugger, 68 Target *target, // Can be NULL, if NULL create a 69 // new target, else use existing 70 // one 71 Status &error) override; 72 73 lldb::ProcessSP Attach(ProcessAttachInfo &attach_info, Debugger &debugger, 74 Target *target, // Can be NULL, if NULL create a new 75 // target, else use existing one 76 Status &error) override; 77 78 bool GetSupportedArchitectureAtIndex(uint32_t idx, ArchSpec &arch) override; 79 80 size_t GetSoftwareBreakpointTrapOpcode(Target &target, 81 BreakpointSite *bp_site) override; 82 83 bool GetRemoteOSVersion() override; 84 85 bool GetRemoteOSBuildString(std::string &s) override; 86 87 bool GetRemoteOSKernelDescription(std::string &s) override; 88 89 // Remote Platform subclasses need to override this function 90 ArchSpec GetRemoteSystemArchitecture() override; 91 92 FileSpec GetRemoteWorkingDirectory() override; 93 94 bool SetRemoteWorkingDirectory(const FileSpec &working_dir) override; 95 96 // Remote subclasses should override this and return a valid instance 97 // name if connected. 98 const char *GetHostname() override; 99 100 UserIDResolver &GetUserIDResolver() override { return *this; } 101 102 bool IsConnected() const override; 103 104 Status ConnectRemote(Args &args) override; 105 106 Status DisconnectRemote() override; 107 108 Status MakeDirectory(const FileSpec &file_spec, 109 uint32_t file_permissions) override; 110 111 Status GetFilePermissions(const FileSpec &file_spec, 112 uint32_t &file_permissions) override; 113 114 Status SetFilePermissions(const FileSpec &file_spec, 115 uint32_t file_permissions) override; 116 117 lldb::user_id_t OpenFile(const FileSpec &file_spec, File::OpenOptions flags, 118 uint32_t mode, Status &error) override; 119 120 bool CloseFile(lldb::user_id_t fd, Status &error) override; 121 122 uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *data_ptr, 123 uint64_t len, Status &error) override; 124 125 uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *data, 126 uint64_t len, Status &error) override; 127 128 lldb::user_id_t GetFileSize(const FileSpec &file_spec) override; 129 130 Status PutFile(const FileSpec &source, const FileSpec &destination, 131 uint32_t uid = UINT32_MAX, uint32_t gid = UINT32_MAX) override; 132 133 Status CreateSymlink(const FileSpec &src, const FileSpec &dst) override; 134 135 bool GetFileExists(const FileSpec &file_spec) override; 136 137 Status Unlink(const FileSpec &path) override; 138 139 Status RunShellCommand( 140 const char *command, // Shouldn't be NULL 141 const FileSpec &working_dir, // Pass empty FileSpec to use the current 142 // working directory 143 int *status_ptr, // Pass NULL if you don't want the process exit status 144 int *signo_ptr, // Pass NULL if you don't want the signal that caused the 145 // process to exit 146 std::string 147 *command_output, // Pass NULL if you don't want the command output 148 const lldb_private::Timeout<std::micro> &timeout) override; 149 150 void CalculateTrapHandlerSymbolNames() override; 151 152 const lldb::UnixSignalsSP &GetRemoteUnixSignals() override; 153 154 lldb::ProcessSP ConnectProcess(llvm::StringRef connect_url, 155 llvm::StringRef plugin_name, 156 lldb_private::Debugger &debugger, 157 lldb_private::Target *target, 158 lldb_private::Status &error) override; 159 160 size_t ConnectToWaitingProcesses(lldb_private::Debugger &debugger, 161 lldb_private::Status &error) override; 162 163 virtual size_t 164 GetPendingGdbServerList(std::vector<std::string> &connection_urls); 165 166 protected: 167 process_gdb_remote::GDBRemoteCommunicationClient m_gdb_client; 168 process_gdb_remote::GDBRemoteCommunicationReplayServer m_gdb_replay_server; 169 std::string m_platform_description; // After we connect we can get a more 170 // complete description of what we are 171 // connected to 172 std::string m_platform_scheme; 173 std::string m_platform_hostname; 174 175 lldb::UnixSignalsSP m_remote_signals_sp; 176 177 // Launch the debug server on the remote host - caller connects to launched 178 // debug server using connect_url. 179 // Subclasses should override this method if they want to do extra actions 180 // before or 181 // after launching the debug server. 182 virtual bool LaunchGDBServer(lldb::pid_t &pid, std::string &connect_url); 183 184 virtual bool KillSpawnedProcess(lldb::pid_t pid); 185 186 virtual std::string MakeUrl(const char *scheme, const char *hostname, 187 uint16_t port, const char *path); 188 189 private: 190 std::string MakeGdbServerUrl(const std::string &platform_scheme, 191 const std::string &platform_hostname, 192 uint16_t port, const char *socket_name); 193 194 llvm::Optional<std::string> DoGetUserName(UserIDResolver::id_t uid) override; 195 llvm::Optional<std::string> DoGetGroupName(UserIDResolver::id_t uid) override; 196 197 PlatformRemoteGDBServer(const PlatformRemoteGDBServer &) = delete; 198 const PlatformRemoteGDBServer & 199 operator=(const PlatformRemoteGDBServer &) = delete; 200 }; 201 202 } // namespace platform_gdb_server 203 } // namespace lldb_private 204 205 #endif // LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H 206