1 //===-- StringExtractorGDBRemote.h ------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H 10 #define LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H 11 12 #include "lldb/Utility/Status.h" 13 #include "lldb/Utility/StringExtractor.h" 14 #include "llvm/ADT/StringRef.h" 15 16 #include <optional> 17 #include <string> 18 19 #include <cstddef> 20 #include <cstdint> 21 22 class StringExtractorGDBRemote : public StringExtractor { 23 public: 24 typedef bool (*ResponseValidatorCallback)( 25 void *baton, const StringExtractorGDBRemote &response); 26 27 StringExtractorGDBRemote() = default; 28 StringExtractorGDBRemote(llvm::StringRef str)29 StringExtractorGDBRemote(llvm::StringRef str) 30 : StringExtractor(str), m_validator(nullptr) {} 31 StringExtractorGDBRemote(const char * cstr)32 StringExtractorGDBRemote(const char *cstr) 33 : StringExtractor(cstr), m_validator(nullptr) {} 34 35 bool ValidateResponse() const; 36 37 void CopyResponseValidator(const StringExtractorGDBRemote &rhs); 38 39 void SetResponseValidator(ResponseValidatorCallback callback, void *baton); 40 41 void SetResponseValidatorToOKErrorNotSupported(); 42 43 void SetResponseValidatorToASCIIHexBytes(); 44 45 void SetResponseValidatorToJSON(); 46 47 enum ServerPacketType { 48 eServerPacketType_nack = 0, 49 eServerPacketType_ack, 50 eServerPacketType_invalid, 51 eServerPacketType_unimplemented, 52 eServerPacketType_interrupt, // CTRL+c packet or "\x03" 53 eServerPacketType_A, // Program arguments packet 54 eServerPacketType_qfProcessInfo, 55 eServerPacketType_qsProcessInfo, 56 eServerPacketType_qC, 57 eServerPacketType_qEcho, 58 eServerPacketType_qGroupName, 59 eServerPacketType_qHostInfo, 60 eServerPacketType_qLaunchGDBServer, 61 eServerPacketType_qQueryGDBServer, 62 eServerPacketType_qKillSpawnedProcess, 63 eServerPacketType_qLaunchSuccess, 64 eServerPacketType_qModuleInfo, 65 eServerPacketType_qProcessInfoPID, 66 eServerPacketType_qSpeedTest, 67 eServerPacketType_qUserName, 68 eServerPacketType_qGetWorkingDir, 69 eServerPacketType_qFileLoadAddress, 70 eServerPacketType_QEnvironment, 71 eServerPacketType_QEnableErrorStrings, 72 eServerPacketType_QLaunchArch, 73 eServerPacketType_QSetDisableASLR, 74 eServerPacketType_QSetDetachOnError, 75 eServerPacketType_QSetSTDIN, 76 eServerPacketType_QSetSTDOUT, 77 eServerPacketType_QSetSTDERR, 78 eServerPacketType_QSetWorkingDir, 79 eServerPacketType_QStartNoAckMode, 80 eServerPacketType_qPathComplete, 81 eServerPacketType_qPlatform_shell, 82 eServerPacketType_qPlatform_mkdir, 83 eServerPacketType_qPlatform_chmod, 84 eServerPacketType_vFile_open, 85 eServerPacketType_vFile_close, 86 eServerPacketType_vFile_pread, 87 eServerPacketType_vFile_pwrite, 88 eServerPacketType_vFile_size, 89 eServerPacketType_vFile_mode, 90 eServerPacketType_vFile_exists, 91 eServerPacketType_vFile_md5, 92 eServerPacketType_vFile_fstat, 93 eServerPacketType_vFile_stat, 94 eServerPacketType_vFile_symlink, 95 eServerPacketType_vFile_unlink, 96 // debug server packages 97 eServerPacketType_QEnvironmentHexEncoded, 98 eServerPacketType_QListThreadsInStopReply, 99 eServerPacketType_QPassSignals, 100 eServerPacketType_QRestoreRegisterState, 101 eServerPacketType_QSaveRegisterState, 102 eServerPacketType_QSetLogging, 103 eServerPacketType_QSetMaxPacketSize, 104 eServerPacketType_QSetMaxPayloadSize, 105 eServerPacketType_QSetEnableAsyncProfiling, 106 eServerPacketType_QSyncThreadState, 107 eServerPacketType_QThreadSuffixSupported, 108 109 eServerPacketType_jThreadsInfo, 110 eServerPacketType_qsThreadInfo, 111 eServerPacketType_qfThreadInfo, 112 eServerPacketType_qGetPid, 113 eServerPacketType_qGetProfileData, 114 eServerPacketType_qGDBServerVersion, 115 eServerPacketType_qMemoryRegionInfo, 116 eServerPacketType_qMemoryRegionInfoSupported, 117 eServerPacketType_qProcessInfo, 118 eServerPacketType_qRcmd, 119 eServerPacketType_qRegisterInfo, 120 eServerPacketType_qShlibInfoAddr, 121 eServerPacketType_qStepPacketSupported, 122 eServerPacketType_qSupported, 123 eServerPacketType_qSyncThreadStateSupported, 124 eServerPacketType_qThreadExtraInfo, 125 eServerPacketType_qThreadStopInfo, 126 eServerPacketType_qVAttachOrWaitSupported, 127 eServerPacketType_qWatchpointSupportInfo, 128 eServerPacketType_qWatchpointSupportInfoSupported, 129 eServerPacketType_qXfer, 130 131 eServerPacketType_jSignalsInfo, 132 eServerPacketType_jModulesInfo, 133 134 eServerPacketType_vAttach, 135 eServerPacketType_vAttachWait, 136 eServerPacketType_vAttachOrWait, 137 eServerPacketType_vAttachName, 138 eServerPacketType_vCont, 139 eServerPacketType_vCont_actions, // vCont? 140 eServerPacketType_vKill, 141 eServerPacketType_vRun, 142 143 eServerPacketType_stop_reason, // '?' 144 145 eServerPacketType_c, 146 eServerPacketType_C, 147 eServerPacketType_D, 148 eServerPacketType_g, 149 eServerPacketType_G, 150 eServerPacketType_H, 151 eServerPacketType_I, // stdin notification 152 eServerPacketType_k, 153 eServerPacketType_m, 154 eServerPacketType_M, 155 eServerPacketType_p, 156 eServerPacketType_P, 157 eServerPacketType_s, 158 eServerPacketType_S, 159 eServerPacketType_T, 160 eServerPacketType_x, 161 eServerPacketType_X, 162 eServerPacketType_Z, 163 eServerPacketType_z, 164 165 eServerPacketType__M, 166 eServerPacketType__m, 167 eServerPacketType_notify, // '%' notification 168 169 eServerPacketType_jLLDBTraceSupported, 170 eServerPacketType_jLLDBTraceStart, 171 eServerPacketType_jLLDBTraceStop, 172 eServerPacketType_jLLDBTraceGetState, 173 eServerPacketType_jLLDBTraceGetBinaryData, 174 175 eServerPacketType_qMemTags, // read memory tags 176 eServerPacketType_QMemTags, // write memory tags 177 178 eServerPacketType_qLLDBSaveCore, 179 eServerPacketType_QSetIgnoredExceptions, 180 eServerPacketType_QNonStop, 181 eServerPacketType_vStopped, 182 eServerPacketType_vCtrlC, 183 eServerPacketType_vStdio, 184 }; 185 186 ServerPacketType GetServerPacketType() const; 187 188 enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse }; 189 190 ResponseType GetResponseType() const; 191 192 bool IsOKResponse() const; 193 194 bool IsUnsupportedResponse() const; 195 196 bool IsNormalResponse() const; 197 198 bool IsErrorResponse() const; 199 200 // Returns zero if the packet isn't a EXX packet where XX are two hex digits. 201 // Otherwise the error encoded in XX is returned. 202 uint8_t GetError(); 203 204 lldb_private::Status GetStatus(); 205 206 size_t GetEscapedBinaryData(std::string &str); 207 208 static constexpr lldb::pid_t AllProcesses = UINT64_MAX; 209 static constexpr lldb::tid_t AllThreads = UINT64_MAX; 210 211 // Read thread-id from the packet. If the packet is valid, returns 212 // the pair (PID, TID), otherwise returns std::nullopt. If the packet 213 // does not list a PID, default_pid is used. 214 std::optional<std::pair<lldb::pid_t, lldb::tid_t>> 215 GetPidTid(lldb::pid_t default_pid); 216 217 protected: 218 ResponseValidatorCallback m_validator = nullptr; 219 void *m_validator_baton = nullptr; 220 }; 221 222 #endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H 223