aboutsummaryrefslogtreecommitdiff
path: root/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2015-07-03 16:57:06 +0000
committerEd Maste <emaste@FreeBSD.org>2015-07-03 16:57:06 +0000
commit5e95aa85bb660d45e9905ef1d7180b2678280660 (patch)
tree3c2e41c3be19b7fc7666ed45a5f91ec3b6e35f2a /source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
parent12bd4897ff0678fa663e09d78ebc22dd255ceb86 (diff)
downloadsrc-vendor/lldb/lldb-r241361.tar.gz
src-vendor/lldb/lldb-r241361.zip
Import LLDB as of upstream SVN 241361 (git 612c075f)vendor/lldb/lldb-r241361
Diffstat (limited to 'source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h')
-rw-r--r--source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h523
1 files changed, 24 insertions, 499 deletions
diff --git a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
index dcf07844527e..992c6dffaf54 100644
--- a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
+++ b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
@@ -12,236 +12,53 @@
// C Includes
// C++ Includes
-#include <vector>
-#include <set>
-#include <unordered_map>
+#include <functional>
+#include <map>
+
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private-forward.h"
-#include "lldb/Core/Communication.h"
-#include "lldb/Host/Mutex.h"
-#include "lldb/Target/Process.h"
#include "GDBRemoteCommunication.h"
-#include "lldb/Host/common/NativeProcessProtocol.h"
+class StringExtractorGDBRemote;
+
+namespace lldb_private {
+namespace process_gdb_remote {
class ProcessGDBRemote;
-class StringExtractorGDBRemote;
-class GDBRemoteCommunicationServer :
- public GDBRemoteCommunication,
- public lldb_private::NativeProcessProtocol::NativeDelegate
+class GDBRemoteCommunicationServer : public GDBRemoteCommunication
{
public:
- typedef std::map<uint16_t, lldb::pid_t> PortMap;
-
- enum
- {
- eBroadcastBitRunPacketSent = kLoUserBroadcastBit
- };
- //------------------------------------------------------------------
- // Constructors and Destructors
- //------------------------------------------------------------------
- GDBRemoteCommunicationServer(bool is_platform);
+ using PortMap = std::map<uint16_t, lldb::pid_t>;
+ using PacketHandler = std::function<PacketResult(StringExtractorGDBRemote &packet,
+ Error &error,
+ bool &interrupt,
+ bool &quit)>;
- GDBRemoteCommunicationServer(bool is_platform,
- const lldb::PlatformSP& platform_sp,
- lldb::DebuggerSP& debugger_sp);
+ GDBRemoteCommunicationServer(const char *comm_name,
+ const char *listener_name);
virtual
~GDBRemoteCommunicationServer();
+ void RegisterPacketHandler(StringExtractorGDBRemote::ServerPacketType packet_type,
+ PacketHandler handler);
+
PacketResult
GetPacketAndSendResponse (uint32_t timeout_usec,
- lldb_private::Error &error,
+ Error &error,
bool &interrupt,
bool &quit);
- virtual bool
- GetThreadSuffixSupported () override
- {
- return true;
- }
-
// After connecting, do a little handshake with the client to make sure
// we are at least communicating
bool
- HandshakeWithClient (lldb_private::Error *error_ptr);
-
- // Set both ports to zero to let the platform automatically bind to
- // a port chosen by the OS.
- void
- SetPortMap (PortMap &&port_map)
- {
- m_port_map = port_map;
- }
-
- //----------------------------------------------------------------------
- // If we are using a port map where we can only use certain ports,
- // get the next available port.
- //
- // If we are using a port map and we are out of ports, return UINT16_MAX
- //
- // If we aren't using a port map, return 0 to indicate we should bind to
- // port 0 and then figure out which port we used.
- //----------------------------------------------------------------------
- uint16_t
- GetNextAvailablePort ()
- {
- if (m_port_map.empty())
- return 0; // Bind to port zero and get a port, we didn't have any limitations
-
- for (auto &pair : m_port_map)
- {
- if (pair.second == LLDB_INVALID_PROCESS_ID)
- {
- pair.second = ~(lldb::pid_t)LLDB_INVALID_PROCESS_ID;
- return pair.first;
- }
- }
- return UINT16_MAX;
- }
-
- bool
- AssociatePortWithProcess (uint16_t port, lldb::pid_t pid)
- {
- PortMap::iterator pos = m_port_map.find(port);
- if (pos != m_port_map.end())
- {
- pos->second = pid;
- return true;
- }
- return false;
- }
-
- bool
- FreePort (uint16_t port)
- {
- PortMap::iterator pos = m_port_map.find(port);
- if (pos != m_port_map.end())
- {
- pos->second = LLDB_INVALID_PROCESS_ID;
- return true;
- }
- return false;
- }
-
- bool
- FreePortForProcess (lldb::pid_t pid)
- {
- if (!m_port_map.empty())
- {
- for (auto &pair : m_port_map)
- {
- if (pair.second == pid)
- {
- pair.second = LLDB_INVALID_PROCESS_ID;
- return true;
- }
- }
- }
- return false;
- }
-
- void
- SetPortOffset (uint16_t port_offset)
- {
- m_port_offset = port_offset;
- }
-
- //------------------------------------------------------------------
- /// Specify the program to launch and its arguments.
- ///
- /// @param[in] args
- /// The command line to launch.
- ///
- /// @param[in] argc
- /// The number of elements in the args array of cstring pointers.
- ///
- /// @return
- /// An Error object indicating the success or failure of making
- /// the setting.
- //------------------------------------------------------------------
- lldb_private::Error
- SetLaunchArguments (const char *const args[], int argc);
-
- //------------------------------------------------------------------
- /// Specify the launch flags for the process.
- ///
- /// @param[in] launch_flags
- /// The launch flags to use when launching this process.
- ///
- /// @return
- /// An Error object indicating the success or failure of making
- /// the setting.
- //------------------------------------------------------------------
- lldb_private::Error
- SetLaunchFlags (unsigned int launch_flags);
-
- //------------------------------------------------------------------
- /// Launch a process with the current launch settings.
- ///
- /// This method supports running an lldb-gdbserver or similar
- /// server in a situation where the startup code has been provided
- /// with all the information for a child process to be launched.
- ///
- /// @return
- /// An Error object indicating the success or failure of the
- /// launch.
- //------------------------------------------------------------------
- lldb_private::Error
- LaunchProcess ();
-
- //------------------------------------------------------------------
- /// Attach to a process.
- ///
- /// This method supports attaching llgs to a process accessible via the
- /// configured Platform.
- ///
- /// @return
- /// An Error object indicating the success or failure of the
- /// attach operation.
- //------------------------------------------------------------------
- lldb_private::Error
- AttachToProcess (lldb::pid_t pid);
-
- //------------------------------------------------------------------
- // NativeProcessProtocol::NativeDelegate overrides
- //------------------------------------------------------------------
- void
- InitializeDelegate (lldb_private::NativeProcessProtocol *process) override;
-
- void
- ProcessStateChanged (lldb_private::NativeProcessProtocol *process, lldb::StateType state) override;
-
- void
- DidExec (lldb_private::NativeProcessProtocol *process) override;
+ HandshakeWithClient (Error *error_ptr);
protected:
- lldb::PlatformSP m_platform_sp;
- lldb::thread_t m_async_thread;
- lldb_private::ProcessLaunchInfo m_process_launch_info;
- lldb_private::Error m_process_launch_error;
- std::set<lldb::pid_t> m_spawned_pids;
- lldb_private::Mutex m_spawned_pids_mutex;
- lldb_private::ProcessInstanceInfoList m_proc_infos;
- uint32_t m_proc_infos_index;
- PortMap m_port_map;
- uint16_t m_port_offset;
- lldb::tid_t m_current_tid;
- lldb::tid_t m_continue_tid;
- lldb_private::Mutex m_debugged_process_mutex;
- lldb_private::NativeProcessProtocolSP m_debugged_process_sp;
- lldb::DebuggerSP m_debugger_sp;
- Communication m_stdio_communication;
+ std::map<StringExtractorGDBRemote::ServerPacketType, PacketHandler> m_packet_handlers;
bool m_exit_now; // use in asynchronous handling to indicate process should exit.
- lldb::StateType m_inferior_prev_state;
- bool m_thread_suffix_supported;
- bool m_list_threads_in_stop_reply;
- lldb::DataBufferSP m_active_auxv_buffer_sp;
- lldb_private::Mutex m_saved_registers_mutex;
- std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
- uint32_t m_next_saved_registers_id;
PacketResult
SendUnimplementedResponse (const char *packet);
@@ -255,306 +72,14 @@ protected:
PacketResult
SendOKResponse ();
- PacketResult
- SendONotification (const char *buffer, uint32_t len);
-
- PacketResult
- SendWResponse (lldb_private::NativeProcessProtocol *process);
-
- PacketResult
- SendStopReplyPacketForThread (lldb::tid_t tid);
-
- PacketResult
- SendStopReasonForState (lldb::StateType process_state, bool flush_on_exit);
-
- PacketResult
- Handle_A (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qLaunchSuccess (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qHostInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qLaunchGDBServer (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qKillSpawnedProcess (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_k (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qPlatform_mkdir (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qPlatform_chmod (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qProcessInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qProcessInfoPID (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qfProcessInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qsProcessInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qC (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qUserName (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qGroupName (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qSpeedTest (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QEnvironment (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QLaunchArch (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QSetDisableASLR (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QSetDetachOnError (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QSetWorkingDir (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qGetWorkingDir (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QStartNoAckMode (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QSetSTDIN (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QSetSTDOUT (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QSetSTDERR (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_C (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_c (StringExtractorGDBRemote &packet, bool skip_file_pos_adjustment = false);
-
- PacketResult
- Handle_vCont (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vCont_actions (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_stop_reason (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_Open (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_Close (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_pRead (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_pWrite (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_Size (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_Mode (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_Exists (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_symlink (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_unlink (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_Stat (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vFile_MD5 (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qPlatform_shell (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qRegisterInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qfThreadInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qsThreadInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_p (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_P (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_H (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_I (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_interrupt (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_m (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_M (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qMemoryRegionInfoSupported (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qMemoryRegionInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_Z (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_z (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_s (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qSupported (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QThreadSuffixSupported (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QListThreadsInStopReply (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qXfer_auxv_read (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QSaveRegisterState (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_QRestoreRegisterState (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_vAttach (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_D (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qThreadStopInfo (StringExtractorGDBRemote &packet);
-
- PacketResult
- Handle_qWatchpointSupportInfo (StringExtractorGDBRemote &packet);
-
- void
- SetCurrentThreadID (lldb::tid_t tid);
-
- lldb::tid_t
- GetCurrentThreadID () const;
-
- void
- SetContinueThreadID (lldb::tid_t tid);
-
- lldb::tid_t
- GetContinueThreadID () const { return m_continue_tid; }
-
- lldb_private::Error
- SetSTDIOFileDescriptor (int fd);
-
- static void
- STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len);
-
private:
- bool
- DebugserverProcessReaped (lldb::pid_t pid);
-
- static bool
- ReapDebugserverProcess (void *callback_baton,
- lldb::pid_t pid,
- bool exited,
- int signal,
- int status);
-
- bool
- DebuggedProcessReaped (lldb::pid_t pid);
-
- static bool
- ReapDebuggedProcess (void *callback_baton,
- lldb::pid_t pid,
- bool exited,
- int signal,
- int status);
-
- bool
- KillSpawnedProcess (lldb::pid_t pid);
-
- bool
- IsGdbServer ()
- {
- return !m_is_platform;
- }
-
- /// Launch an inferior process from lldb-gdbserver
- lldb_private::Error
- LaunchProcessForDebugging ();
-
- /// Launch a process from lldb-platform
- lldb_private::Error
- LaunchPlatformProcess ();
-
- void
- HandleInferiorState_Exited (lldb_private::NativeProcessProtocol *process);
-
- void
- HandleInferiorState_Stopped (lldb_private::NativeProcessProtocol *process);
-
- void
- FlushInferiorOutput ();
-
- lldb_private::NativeThreadProtocolSP
- GetThreadFromSuffix (StringExtractorGDBRemote &packet);
-
- uint32_t
- GetNextSavedRegistersID ();
-
- void
- MaybeCloseInferiorTerminalConnection ();
-
- void
- ClearProcessSpecificData ();
-
- bool
- ShouldRedirectInferiorOutputOverGdbRemote (const lldb_private::ProcessLaunchInfo &launch_info) const;
-
//------------------------------------------------------------------
// For GDBRemoteCommunicationServer only
//------------------------------------------------------------------
DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunicationServer);
};
+} // namespace process_gdb_remote
+} // namespace lldb_private
+
#endif // liblldb_GDBRemoteCommunicationServer_h_