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