LLDB mainline
lldb_private::process_gdb_remote::GDBRemoteCommunication Class Reference

#include <GDBRemoteCommunication.h>

Inheritance diagram for lldb_private::process_gdb_remote::GDBRemoteCommunication:
[legend]

Classes

class  ScopedTimeout

Public Types

enum class  PacketType { Invalid = 0 , Standard , Notify }
enum class  PacketResult {
  Success = 0 , ErrorSendFailed , ErrorSendAck , ErrorReplyFailed ,
  ErrorReplyTimeout , ErrorReplyInvalid , ErrorReplyAck , ErrorDisconnected ,
  ErrorNoSequenceLock
}

Public Member Functions

 GDBRemoteCommunication ()
 ~GDBRemoteCommunication () override
PacketResult GetAck ()
size_t SendAck ()
size_t SendNack ()
char CalculcateChecksum (llvm::StringRef payload)
PacketType CheckForPacket (const uint8_t *src, size_t src_len, StringExtractorGDBRemote &packet)
bool GetSendAcks ()
std::chrono::seconds SetPacketTimeout (std::chrono::seconds packet_timeout)
std::chrono::seconds GetPacketTimeout () const
void DumpHistory (Stream &strm)
Public Member Functions inherited from lldb_private::Communication
 Communication ()
 Construct the Communication object.
virtual ~Communication ()
 Destructor.
virtual void Clear ()
lldb::ConnectionStatus Connect (const char *url, Status *error_ptr)
 Connect using the current connection by passing url to its connect function.
virtual lldb::ConnectionStatus Disconnect (Status *error_ptr=nullptr)
 Disconnect the communications connection if one is currently connected.
bool IsConnected () const
 Check if the connection is valid.
bool HasConnection () const
lldb_private::ConnectionGetConnection ()
virtual size_t Read (void *dst, size_t dst_len, const Timeout< std::micro > &timeout, lldb::ConnectionStatus &status, Status *error_ptr)
 Read bytes from the current connection.
size_t Write (const void *src, size_t src_len, lldb::ConnectionStatus &status, Status *error_ptr)
 The actual write function that attempts to write to the communications protocol.
size_t WriteAll (const void *src, size_t src_len, lldb::ConnectionStatus &status, Status *error_ptr)
 Repeatedly attempt writing until either src_len bytes are written or a permanent failure occurs.
virtual void SetConnection (std::unique_ptr< Connection > connection)
 Sets the connection that it to be used by this class.
bool GetCloseOnEOF () const
void SetCloseOnEOF (bool b)

Static Public Member Functions

static Status StartDebugserverProcess (std::variant< llvm::StringRef, shared_fd_t > comm, ProcessLaunchInfo &launch_info, const Args *inferior_args)
static std::optional< std::string > ExpandRLE (std::string)
 Expand GDB run-length encoding.
Static Public Member Functions inherited from lldb_private::Communication
static std::string ConnectionStatusAsString (lldb::ConnectionStatus status)

Protected Member Functions

PacketResult SendPacketNoLock (llvm::StringRef payload)
PacketResult SendNotificationPacketNoLock (llvm::StringRef notify_type, std::deque< std::string > &queue, llvm::StringRef payload)
PacketResult SendRawPacketNoLock (llvm::StringRef payload, bool skip_ack=false)
PacketResult ReadPacket (StringExtractorGDBRemote &response, Timeout< std::micro > timeout, bool sync_on_timeout)
PacketResult WaitForPacketNoLock (StringExtractorGDBRemote &response, Timeout< std::micro > timeout, bool sync_on_timeout)
bool CompressionIsEnabled ()
bool DecompressPacket ()
Protected Member Functions inherited from lldb_private::Communication
size_t ReadFromConnection (void *dst, size_t dst_len, const Timeout< std::micro > &timeout, lldb::ConnectionStatus &status, Status *error_ptr)

Protected Attributes

std::chrono::seconds m_packet_timeout
uint32_t m_echo_number
LazyBool m_supports_qEcho
GDBRemoteCommunicationHistory m_history
bool m_send_acks
bool m_is_platform
std::string m_bytes
std::recursive_mutex m_bytes_mutex
CompressionType m_compression_type
Protected Attributes inherited from lldb_private::Communication
lldb::ConnectionSP m_connection_sp
 The connection that is current in use by this communications class.
std::mutex m_write_mutex
 Don't let multiple threads write at the same time...
bool m_close_on_eof

Private Member Functions

 GDBRemoteCommunication (const GDBRemoteCommunication &)=delete
const GDBRemoteCommunicationoperator= (const GDBRemoteCommunication &)=delete

Detailed Description

Definition at line 71 of file GDBRemoteCommunication.h.

Member Enumeration Documentation

◆ PacketResult

Enumerator
Success 
ErrorSendFailed 
ErrorSendAck 
ErrorReplyFailed 
ErrorReplyTimeout 
ErrorReplyInvalid 
ErrorReplyAck 
ErrorDisconnected 
ErrorNoSequenceLock 

Definition at line 75 of file GDBRemoteCommunication.h.

◆ PacketType

Enumerator
Invalid 
Standard 
Notify 

Definition at line 73 of file GDBRemoteCommunication.h.

Constructor & Destructor Documentation

◆ GDBRemoteCommunication() [1/2]

◆ ~GDBRemoteCommunication()

GDBRemoteCommunication::~GDBRemoteCommunication ( )
override

◆ GDBRemoteCommunication() [2/2]

lldb_private::process_gdb_remote::GDBRemoteCommunication::GDBRemoteCommunication ( const GDBRemoteCommunication & )
privatedelete

Member Function Documentation

◆ CalculcateChecksum()

char GDBRemoteCommunication::CalculcateChecksum ( llvm::StringRef payload)

◆ CheckForPacket()

◆ CompressionIsEnabled()

bool lldb_private::process_gdb_remote::GDBRemoteCommunication::CompressionIsEnabled ( )
inlineprotected

◆ DecompressPacket()

◆ DumpHistory()

void GDBRemoteCommunication::DumpHistory ( Stream & strm)

◆ ExpandRLE()

std::optional< std::string > GDBRemoteCommunication::ExpandRLE ( std::string packet)
static

Expand GDB run-length encoding.

Definition at line 1065 of file GDBRemoteCommunication.cpp.

Referenced by CheckForPacket().

◆ GetAck()

◆ GetPacketTimeout()

◆ GetSendAcks()

bool lldb_private::process_gdb_remote::GDBRemoteCommunication::GetSendAcks ( )
inline

Definition at line 122 of file GDBRemoteCommunication.h.

References m_send_acks.

Referenced by CheckForPacket(), DecompressPacket(), and SendRawPacketNoLock().

◆ operator=()

const GDBRemoteCommunication & lldb_private::process_gdb_remote::GDBRemoteCommunication::operator= ( const GDBRemoteCommunication & )
privatedelete

◆ ReadPacket()

◆ SendAck()

◆ SendNack()

◆ SendNotificationPacketNoLock()

◆ SendPacketNoLock()

GDBRemoteCommunication::PacketResult GDBRemoteCommunication::SendPacketNoLock ( llvm::StringRef payload)
protected

Definition at line 102 of file GDBRemoteCommunication.cpp.

References CalculcateChecksum(), lldb::eByteOrderBig, lldb_private::StreamString::GetString(), lldb_private::Stream::PutChar(), lldb_private::Stream::PutHex8(), SendRawPacketNoLock(), and lldb_private::Stream::Write().

Referenced by lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle__M(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_g(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_jLLDBTraceGetBinaryData(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_jModulesInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerPlatform::Handle_jSignalsInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_jThreadsInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_memory_read(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_p(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qC(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerPlatform::Handle_qC(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qEcho(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qFileLoadAddress(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qfThreadInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qGetWorkingDir(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerPlatform::Handle_qGetWorkingDir(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qGroupName(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qHostInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerPlatform::Handle_qLaunchGDBServer(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qLaunchSuccess(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qMemoryRegionInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qMemTags(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qModuleInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerPlatform::Handle_qPathComplete(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qPlatform_chmod(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qPlatform_mkdir(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qPlatform_shell(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qProcessInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerPlatform::Handle_qProcessInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qProcessInfoPID(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerPlatform::Handle_qQueryGDBServer(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qRegisterInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qSaveCore(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_QSaveRegisterState(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qSpeedTest(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qsProcessInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qsThreadInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qSupported(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_qUserName(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qWatchpointSupportInfo(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_qXfer(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_stop_reason(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::Handle_vCont_actions(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_Close(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_Exists(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_FStat(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_MD5(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_Mode(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_Open(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_pRead(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_pWrite(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_Size(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_symlink(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerCommon::Handle_vFile_unlink(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::HandleNotificationAck(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServer::SendErrorResponse(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServer::SendErrorResponse(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServer::SendOKResponse(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::SendONotification(), lldb_private::process_gdb_remote::GDBRemoteClientBase::SendPacketAndReceiveResponseWithOutputSupport(), lldb_private::process_gdb_remote::GDBRemoteClientBase::SendPacketAndWaitForResponseNoLock(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::SendStopReplyPacketForThread(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::SendStructuredDataPacket(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServer::SendUnimplementedResponse(), lldb_private::process_gdb_remote::GDBRemoteCommunicationServerLLGS::SendWResponse(), and WaitForPacketNoLock().

◆ SendRawPacketNoLock()

◆ SetPacketTimeout()

std::chrono::seconds lldb_private::process_gdb_remote::GDBRemoteCommunication::SetPacketTimeout ( std::chrono::seconds packet_timeout)
inline

◆ StartDebugserverProcess()

Status GDBRemoteCommunication::StartDebugserverProcess ( std::variant< llvm::StringRef, shared_fd_t > comm,
ProcessLaunchInfo & launch_info,
const Args * inferior_args )
static

◆ WaitForPacketNoLock()

GDBRemoteCommunication::PacketResult GDBRemoteCommunication::WaitForPacketNoLock ( StringExtractorGDBRemote & response,
Timeout< std::micro > timeout,
bool sync_on_timeout )
protected

Sync the remote GDB server and make sure we get a response that corresponds to what we send.

Sends a "qEcho" packet and makes sure it gets the exact packet echoed back. If the qEcho packet isn't supported, we send a qC packet and make sure we get a valid thread ID back. We use the "qC" packet since its response if very unique: is responds with "QC%x" where x is the thread ID of the current thread. This makes the response unique enough from other packet responses to ensure we are back on track.

This packet is needed after we time out sending a packet so we can ensure that we are getting the response for the packet we are sending. There are no sequence IDs in the GDB remote protocol (there used to be, but they are not supported anymore) so if you timeout sending packet "abc", you might then send packet "cde" and get the response for the previous "abc" packet. Many responses are "OK" or "" (unsupported) or "EXX" (error) so many responses for packets can look like responses for other packets. So if we timeout, we need to ensure that we can get back on track. If we can't get back on track, we must disconnect.

Definition at line 230 of file GDBRemoteCommunication.cpp.

References CheckForPacket(), StringExtractor::Clear(), lldb_private::Communication::ConnectionStatusAsString(), lldb_private::Communication::Disconnect(), lldb::eConnectionStatusEndOfFile, lldb::eConnectionStatusError, lldb::eConnectionStatusInterrupted, lldb::eConnectionStatusLostConnection, lldb::eConnectionStatusNoConnection, lldb::eConnectionStatusSuccess, lldb::eConnectionStatusTimedOut, lldb_private::eLazyBoolYes, error(), ErrorDisconnected, ErrorReplyFailed, ErrorReplyTimeout, lldb_private::RegularExpression::Execute(), lldb_private::GetLog(), StringExtractor::GetStringRef(), Invalid, lldb_private::Communication::IsConnected(), LLDB_LOGV, m_echo_number, m_supports_qEcho, lldb_private::process_gdb_remote::Packets, lldb_private::Communication::Read(), lldb_private::RegularExpression, SendPacketNoLock(), Success, and WaitForPacketNoLock().

Referenced by GetAck(), ReadPacket(), and WaitForPacketNoLock().

Member Data Documentation

◆ m_bytes

std::string lldb_private::process_gdb_remote::GDBRemoteCommunication::m_bytes
protected

Definition at line 159 of file GDBRemoteCommunication.h.

Referenced by CheckForPacket(), and DecompressPacket().

◆ m_bytes_mutex

std::recursive_mutex lldb_private::process_gdb_remote::GDBRemoteCommunication::m_bytes_mutex
protected

Definition at line 160 of file GDBRemoteCommunication.h.

Referenced by CheckForPacket().

◆ m_compression_type

CompressionType lldb_private::process_gdb_remote::GDBRemoteCommunication::m_compression_type
protected

◆ m_echo_number

uint32_t lldb_private::process_gdb_remote::GDBRemoteCommunication::m_echo_number
protected

Definition at line 151 of file GDBRemoteCommunication.h.

Referenced by GDBRemoteCommunication(), and WaitForPacketNoLock().

◆ m_history

GDBRemoteCommunicationHistory lldb_private::process_gdb_remote::GDBRemoteCommunication::m_history
protected

◆ m_is_platform

bool lldb_private::process_gdb_remote::GDBRemoteCommunication::m_is_platform
protected

Definition at line 155 of file GDBRemoteCommunication.h.

Referenced by GDBRemoteCommunication().

◆ m_packet_timeout

std::chrono::seconds lldb_private::process_gdb_remote::GDBRemoteCommunication::m_packet_timeout
protected

◆ m_send_acks

◆ m_supports_qEcho


The documentation for this class was generated from the following files: