//===-- PlatformRemoteGDBServer.h ----------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_PlatformRemoteGDBServer_h_ #define liblldb_PlatformRemoteGDBServer_h_ // C Includes // C++ Includes #include // Other libraries and framework includes // Project includes #include "lldb/Target/Platform.h" #include "../../Process/gdb-remote/GDBRemoteCommunicationClient.h" #include "Plugins/Process/Utility/GDBRemoteSignals.h" namespace lldb_private { namespace platform_gdb_server { class PlatformRemoteGDBServer : public Platform { public: static void Initialize (); static void Terminate (); static lldb::PlatformSP CreateInstance (bool force, const ArchSpec *arch); static ConstString GetPluginNameStatic(); static const char * GetDescriptionStatic(); PlatformRemoteGDBServer (); virtual ~PlatformRemoteGDBServer(); //------------------------------------------------------------ // lldb_private::PluginInterface functions //------------------------------------------------------------ ConstString GetPluginName() override { return GetPluginNameStatic(); } uint32_t GetPluginVersion() override { return 1; } //------------------------------------------------------------ // lldb_private::Platform functions //------------------------------------------------------------ Error ResolveExecutable (const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr) override; bool GetModuleSpec (const FileSpec& module_file_spec, const ArchSpec& arch, ModuleSpec &module_spec) override; const char * GetDescription () override; Error GetFileWithUUID (const FileSpec &platform_file, const UUID *uuid_ptr, FileSpec &local_file) override; bool GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &proc_info) override; uint32_t FindProcesses (const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &process_infos) override; Error LaunchProcess (ProcessLaunchInfo &launch_info) override; Error KillProcess (const lldb::pid_t pid) override; lldb::ProcessSP DebugProcess (ProcessLaunchInfo &launch_info, Debugger &debugger, Target *target, // Can be NULL, if NULL create a new target, else use existing one Error &error) override; lldb::ProcessSP Attach (ProcessAttachInfo &attach_info, Debugger &debugger, Target *target, // Can be NULL, if NULL create a new target, else use existing one Error &error) override; bool GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) override; size_t GetSoftwareBreakpointTrapOpcode (Target &target, BreakpointSite *bp_site) override; bool GetRemoteOSVersion () override; bool GetRemoteOSBuildString (std::string &s) override; bool GetRemoteOSKernelDescription (std::string &s) override; // Remote Platform subclasses need to override this function ArchSpec GetRemoteSystemArchitecture () override; FileSpec GetRemoteWorkingDirectory() override; bool SetRemoteWorkingDirectory(const FileSpec &working_dir) override; // Remote subclasses should override this and return a valid instance // name if connected. const char * GetHostname () override; const char * GetUserName (uint32_t uid) override; const char * GetGroupName (uint32_t gid) override; bool IsConnected () const override; Error ConnectRemote (Args& args) override; Error DisconnectRemote () override; Error MakeDirectory(const FileSpec &file_spec, uint32_t file_permissions) override; Error GetFilePermissions(const FileSpec &file_spec, uint32_t &file_permissions) override; Error SetFilePermissions(const FileSpec &file_spec, uint32_t file_permissions) override; lldb::user_id_t OpenFile (const FileSpec& file_spec, uint32_t flags, uint32_t mode, Error &error) override; bool CloseFile (lldb::user_id_t fd, Error &error) override; uint64_t ReadFile (lldb::user_id_t fd, uint64_t offset, void *data_ptr, uint64_t len, Error &error) override; uint64_t WriteFile (lldb::user_id_t fd, uint64_t offset, const void* data, uint64_t len, Error &error) override; lldb::user_id_t GetFileSize (const FileSpec& file_spec) override; Error PutFile (const FileSpec& source, const FileSpec& destination, uint32_t uid = UINT32_MAX, uint32_t gid = UINT32_MAX) override; Error CreateSymlink(const FileSpec &src, const FileSpec &dst) override; bool GetFileExists (const FileSpec& file_spec) override; Error Unlink(const FileSpec &path) override; Error RunShellCommand(const char *command, // Shouldn't be NULL const FileSpec &working_dir, // Pass empty FileSpec to use the current working directory int *status_ptr, // Pass NULL if you don't want the process exit status int *signo_ptr, // Pass NULL if you don't want the signal that caused the process to exit std::string *command_output, // Pass NULL if you don't want the command output uint32_t timeout_sec) override; // Timeout in seconds to wait for shell program to finish void CalculateTrapHandlerSymbolNames () override; const lldb::UnixSignalsSP & GetRemoteUnixSignals() override; lldb::ProcessSP ConnectProcess (const char* connect_url, const char* plugin_name, lldb_private::Debugger &debugger, lldb_private::Target *target, lldb_private::Error &error) override; size_t ConnectToWaitingProcesses(lldb_private::Debugger& debugger, lldb_private::Error& error) override; virtual size_t GetPendingGdbServerList(std::vector& connection_urls); protected: process_gdb_remote::GDBRemoteCommunicationClient m_gdb_client; std::string m_platform_description; // After we connect we can get a more complete description of what we are connected to std::string m_platform_scheme; std::string m_platform_hostname; lldb::UnixSignalsSP m_remote_signals_sp; // Launch the debug server on the remote host - caller connects to launched // debug server using connect_url. // Subclasses should override this method if they want to do extra actions before or // after launching the debug server. virtual bool LaunchGDBServer (lldb::pid_t &pid, std::string &connect_url); virtual bool KillSpawnedProcess (lldb::pid_t pid); virtual std::string MakeUrl(const char* scheme, const char* hostname, uint16_t port, const char* path); private: std::string MakeGdbServerUrl(const std::string &platform_scheme, const std::string &platform_hostname, uint16_t port, const char* socket_name); DISALLOW_COPY_AND_ASSIGN (PlatformRemoteGDBServer); }; } // namespace platform_gdb_server } // namespace lldb_private #endif // liblldb_PlatformRemoteGDBServer_h_