diff options
Diffstat (limited to 'source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h')
| -rw-r--r-- | source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h | 523 | 
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_  | 
