//===-- GDBRemoteCommunicationServerLLGS.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_GDBRemoteCommunicationServerLLGS_h_ #define liblldb_GDBRemoteCommunicationServerLLGS_h_ // C Includes // C++ Includes #include // Other libraries and framework includes #include "lldb/lldb-private-forward.h" #include "lldb/Core/Communication.h" #include "lldb/Host/Mutex.h" #include "lldb/Host/common/NativeProcessProtocol.h" // Project includes #include "GDBRemoteCommunicationServerCommon.h" class ProcessGDBRemote; class StringExtractorGDBRemote; class GDBRemoteCommunicationServerLLGS : public GDBRemoteCommunicationServerCommon, public lldb_private::NativeProcessProtocol::NativeDelegate { public: //------------------------------------------------------------------ // Constructors and Destructors //------------------------------------------------------------------ GDBRemoteCommunicationServerLLGS(const lldb::PlatformSP& platform_sp, lldb::DebuggerSP& debugger_sp); virtual ~GDBRemoteCommunicationServerLLGS(); //------------------------------------------------------------------ /// 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 () override; //------------------------------------------------------------------ /// 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; protected: lldb::PlatformSP m_platform_sp; lldb::thread_t m_async_thread; 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; lldb::StateType m_inferior_prev_state; lldb::DataBufferSP m_active_auxv_buffer_sp; lldb_private::Mutex m_saved_registers_mutex; std::unordered_map m_saved_registers_map; uint32_t m_next_saved_registers_id; 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_k (StringExtractorGDBRemote &packet); PacketResult Handle_qProcessInfo (StringExtractorGDBRemote &packet); PacketResult Handle_qC (StringExtractorGDBRemote &packet); PacketResult Handle_QSetDisableASLR (StringExtractorGDBRemote &packet); PacketResult Handle_QSetWorkingDir (StringExtractorGDBRemote &packet); PacketResult Handle_qGetWorkingDir (StringExtractorGDBRemote &packet); PacketResult Handle_C (StringExtractorGDBRemote &packet); PacketResult Handle_c (StringExtractorGDBRemote &packet); PacketResult Handle_vCont (StringExtractorGDBRemote &packet); PacketResult Handle_vCont_actions (StringExtractorGDBRemote &packet); PacketResult Handle_stop_reason (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_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 DebuggedProcessReaped (lldb::pid_t pid); static bool ReapDebuggedProcess (void *callback_baton, lldb::pid_t pid, bool exited, int signal, int status); 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 (); void RegisterPacketHandlers (); //------------------------------------------------------------------ // For GDBRemoteCommunicationServerLLGS only //------------------------------------------------------------------ DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunicationServerLLGS); }; #endif // liblldb_GDBRemoteCommunicationServerLLGS_h_