GDBRemoteCommunicationClient.h [plain text]
#ifndef liblldb_GDBRemoteCommunicationClient_h_
#define liblldb_GDBRemoteCommunicationClient_h_
#include <vector>
#include "lldb/Core/ArchSpec.h"
#include "GDBRemoteCommunication.h"
typedef enum
{
eBreakpointSoftware = 0,
eBreakpointHardware,
eWatchpointWrite,
eWatchpointRead,
eWatchpointReadWrite
} GDBStoppointType;
class GDBRemoteCommunicationClient : public GDBRemoteCommunication
{
public:
GDBRemoteCommunicationClient(bool is_platform);
virtual
~GDBRemoteCommunicationClient();
bool
HandshakeWithServer (lldb_private::Error *error_ptr);
size_t
SendPacketAndWaitForResponse (const char *send_payload,
StringExtractorGDBRemote &response,
bool send_async);
size_t
SendPacketAndWaitForResponse (const char *send_payload,
size_t send_length,
StringExtractorGDBRemote &response,
bool send_async);
lldb::StateType
SendContinuePacketAndWaitForResponse (ProcessGDBRemote *process,
const char *packet_payload,
size_t packet_length,
StringExtractorGDBRemote &response);
virtual bool
GetThreadSuffixSupported ();
void
QueryNoAckModeSupported ();
bool
SendAsyncSignal (int signo);
bool
SendInterrupt (lldb_private::Mutex::Locker &locker,
uint32_t seconds_to_wait_for_stop,
bool &sent_interrupt,
bool &timed_out);
lldb::pid_t
GetCurrentProcessID ();
bool
GetLaunchSuccess (std::string &error_str);
uint16_t
LaunchGDBserverAndGetPort ();
int
SendArgumentsPacket (char const *argv[]);
int
SendEnvironmentPacket (char const *name_equal_value);
int
SendLaunchArchPacket (const char *arch);
int
SendAttach (lldb::pid_t pid,
StringExtractorGDBRemote& response);
int
SetSTDIN (char const *path);
int
SetSTDOUT (char const *path);
int
SetSTDERR (char const *path);
int
SetDisableASLR (bool enable);
int
SetWorkingDir (char const *path);
lldb::addr_t
AllocateMemory (size_t size, uint32_t permissions);
bool
DeallocateMemory (lldb::addr_t addr);
const lldb_private::ArchSpec &
GetHostArchitecture ();
bool
GetVContSupported (char flavor);
void
ResetDiscoverableSettings();
bool
GetHostInfo (bool force = false);
bool
GetOSVersion (uint32_t &major,
uint32_t &minor,
uint32_t &update);
bool
GetOSBuildString (std::string &s);
bool
GetOSKernelDescription (std::string &s);
lldb_private::ArchSpec
GetSystemArchitecture ();
bool
GetHostname (std::string &s);
bool
GetSupportsThreadSuffix ();
bool
GetProcessInfo (lldb::pid_t pid,
lldb_private::ProcessInstanceInfo &process_info);
uint32_t
FindProcesses (const lldb_private::ProcessInstanceInfoMatch &process_match_info,
lldb_private::ProcessInstanceInfoList &process_infos);
bool
GetUserName (uint32_t uid, std::string &name);
bool
GetGroupName (uint32_t gid, std::string &name);
bool
HasFullVContSupport ()
{
return GetVContSupported ('A');
}
bool
HasAnyVContSupport ()
{
return GetVContSupported ('a');
}
uint32_t
SetPacketTimeout (uint32_t packet_timeout)
{
const uint32_t old_packet_timeout = m_packet_timeout;
m_packet_timeout = packet_timeout;
return old_packet_timeout;
}
bool
GetStopReply (StringExtractorGDBRemote &response);
bool
GetThreadStopInfo (uint32_t tid,
StringExtractorGDBRemote &response);
bool
SupportsGDBStoppointPacket (GDBStoppointType type)
{
switch (type)
{
case eBreakpointSoftware: return m_supports_z0;
case eBreakpointHardware: return m_supports_z1;
case eWatchpointWrite: return m_supports_z2;
case eWatchpointRead: return m_supports_z3;
case eWatchpointReadWrite: return m_supports_z4;
default: break;
}
return false;
}
uint8_t
SendGDBStoppointTypePacket (GDBStoppointType type, bool insert, lldb::addr_t addr, uint32_t length);
void
TestPacketSpeed (const uint32_t num_packets);
bool
SendSpeedTestPacket (uint32_t send_size,
uint32_t recv_size);
bool
SetCurrentThread (int tid);
bool
SetCurrentThreadForRun (int tid);
lldb_private::LazyBool
SupportsAllocDeallocMemory () const
{
return m_supports_alloc_dealloc_memory;
}
size_t
GetCurrentThreadIDs (std::vector<lldb::tid_t> &thread_ids,
bool &sequence_mutex_unavailable);
protected:
lldb_private::LazyBool m_supports_not_sending_acks;
lldb_private::LazyBool m_supports_thread_suffix;
lldb_private::LazyBool m_supports_vCont_all;
lldb_private::LazyBool m_supports_vCont_any;
lldb_private::LazyBool m_supports_vCont_c;
lldb_private::LazyBool m_supports_vCont_C;
lldb_private::LazyBool m_supports_vCont_s;
lldb_private::LazyBool m_supports_vCont_S;
lldb_private::LazyBool m_qHostInfo_is_valid;
lldb_private::LazyBool m_supports_alloc_dealloc_memory;
bool
m_supports_qProcessInfoPID:1,
m_supports_qfProcessInfo:1,
m_supports_qUserName:1,
m_supports_qGroupName:1,
m_supports_qThreadStopInfo:1,
m_supports_z0:1,
m_supports_z1:1,
m_supports_z2:1,
m_supports_z3:1,
m_supports_z4:1;
lldb::tid_t m_curr_tid; lldb::tid_t m_curr_tid_run;
lldb_private::Mutex m_async_mutex;
lldb_private::Predicate<bool> m_async_packet_predicate;
std::string m_async_packet;
StringExtractorGDBRemote m_async_response;
int m_async_signal;
lldb_private::ArchSpec m_host_arch;
uint32_t m_os_version_major;
uint32_t m_os_version_minor;
uint32_t m_os_version_update;
std::string m_os_build;
std::string m_os_kernel;
std::string m_hostname;
bool
DecodeProcessInfoResponse (StringExtractorGDBRemote &response,
lldb_private::ProcessInstanceInfo &process_info);
private:
DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunicationClient);
};
#endif // liblldb_GDBRemoteCommunicationClient_h_