1 //===-- PlatformRemoteGDBServer.h ----------------------------------------*- C++
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
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_PlatformRemoteGDBServer_h_
11 #define liblldb_PlatformRemoteGDBServer_h_
15 #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h"
16 #include "Plugins/Process/Utility/GDBRemoteSignals.h"
17 #include "lldb/Target/Platform.h"
19 namespace lldb_private {
20 namespace platform_gdb_server {
22 class PlatformRemoteGDBServer : public Platform, private UserIDResolver {
24 static void Initialize();
26 static void Terminate();
28 static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch);
30 static ConstString GetPluginNameStatic();
32 static const char *GetDescriptionStatic();
34 PlatformRemoteGDBServer();
36 ~PlatformRemoteGDBServer() override;
38 // lldb_private::PluginInterface functions
39 ConstString GetPluginName() override { return GetPluginNameStatic(); }
41 uint32_t GetPluginVersion() override { return 1; }
43 // lldb_private::Platform functions
45 ResolveExecutable(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp,
46 const FileSpecList *module_search_paths_ptr) override;
48 bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch,
49 ModuleSpec &module_spec) override;
51 const char *GetDescription() override;
53 Status GetFileWithUUID(const FileSpec &platform_file, const UUID *uuid_ptr,
54 FileSpec &local_file) override;
56 bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info) override;
58 uint32_t FindProcesses(const ProcessInstanceInfoMatch &match_info,
59 ProcessInstanceInfoList &process_infos) override;
61 Status LaunchProcess(ProcessLaunchInfo &launch_info) override;
63 Status KillProcess(const lldb::pid_t pid) override;
65 lldb::ProcessSP DebugProcess(ProcessLaunchInfo &launch_info,
67 Target *target, // Can be NULL, if NULL create a
68 // new target, else use existing
70 Status &error) override;
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;
77 bool GetSupportedArchitectureAtIndex(uint32_t idx, ArchSpec &arch) override;
79 size_t GetSoftwareBreakpointTrapOpcode(Target &target,
80 BreakpointSite *bp_site) override;
82 bool GetRemoteOSVersion() override;
84 bool GetRemoteOSBuildString(std::string &s) override;
86 bool GetRemoteOSKernelDescription(std::string &s) override;
88 // Remote Platform subclasses need to override this function
89 ArchSpec GetRemoteSystemArchitecture() override;
91 FileSpec GetRemoteWorkingDirectory() override;
93 bool SetRemoteWorkingDirectory(const FileSpec &working_dir) override;
95 // Remote subclasses should override this and return a valid instance
97 const char *GetHostname() override;
99 UserIDResolver &GetUserIDResolver() override { return *this; }
101 bool IsConnected() const override;
103 Status ConnectRemote(Args &args) override;
105 Status DisconnectRemote() override;
107 Status MakeDirectory(const FileSpec &file_spec,
108 uint32_t file_permissions) override;
110 Status GetFilePermissions(const FileSpec &file_spec,
111 uint32_t &file_permissions) override;
113 Status SetFilePermissions(const FileSpec &file_spec,
114 uint32_t file_permissions) override;
116 lldb::user_id_t OpenFile(const FileSpec &file_spec, uint32_t flags,
117 uint32_t mode, Status &error) override;
119 bool CloseFile(lldb::user_id_t fd, Status &error) override;
121 uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *data_ptr,
122 uint64_t len, Status &error) override;
124 uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *data,
125 uint64_t len, Status &error) override;
127 lldb::user_id_t GetFileSize(const FileSpec &file_spec) override;
129 Status PutFile(const FileSpec &source, const FileSpec &destination,
130 uint32_t uid = UINT32_MAX, uint32_t gid = UINT32_MAX) override;
132 Status CreateSymlink(const FileSpec &src, const FileSpec &dst) override;
134 bool GetFileExists(const FileSpec &file_spec) override;
136 Status Unlink(const FileSpec &path) override;
138 Status RunShellCommand(
139 const char *command, // Shouldn't be NULL
140 const FileSpec &working_dir, // Pass empty FileSpec to use the current
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
146 *command_output, // Pass NULL if you don't want the command output
147 const lldb_private::Timeout<std::micro> &timeout) override;
149 void CalculateTrapHandlerSymbolNames() override;
151 const lldb::UnixSignalsSP &GetRemoteUnixSignals() override;
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;
159 size_t ConnectToWaitingProcesses(lldb_private::Debugger &debugger,
160 lldb_private::Status &error) override;
163 GetPendingGdbServerList(std::vector<std::string> &connection_urls);
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
170 std::string m_platform_scheme;
171 std::string m_platform_hostname;
173 lldb::UnixSignalsSP m_remote_signals_sp;
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
179 // after launching the debug server.
180 virtual bool LaunchGDBServer(lldb::pid_t &pid, std::string &connect_url);
182 virtual bool KillSpawnedProcess(lldb::pid_t pid);
184 virtual std::string MakeUrl(const char *scheme, const char *hostname,
185 uint16_t port, const char *path);
188 std::string MakeGdbServerUrl(const std::string &platform_scheme,
189 const std::string &platform_hostname,
190 uint16_t port, const char *socket_name);
192 llvm::Optional<std::string> DoGetUserName(UserIDResolver::id_t uid) override;
193 llvm::Optional<std::string> DoGetGroupName(UserIDResolver::id_t uid) override;
195 DISALLOW_COPY_AND_ASSIGN(PlatformRemoteGDBServer);
198 } // namespace platform_gdb_server
199 } // namespace lldb_private
201 #endif // liblldb_PlatformRemoteGDBServer_h_