StringExtractorGDBRemote.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. #ifndef LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
  9. #define LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
  10. #include "lldb/Utility/Status.h"
  11. #include "lldb/Utility/StringExtractor.h"
  12. #include "llvm/ADT/StringRef.h"
  13. #include <string>
  14. #include <cstddef>
  15. #include <cstdint>
  16. class StringExtractorGDBRemote : public StringExtractor {
  17. public:
  18. typedef bool (*ResponseValidatorCallback)(
  19. void *baton, const StringExtractorGDBRemote &response);
  20. StringExtractorGDBRemote() : StringExtractor(), m_validator(nullptr) {}
  21. StringExtractorGDBRemote(llvm::StringRef str)
  22. : StringExtractor(str), m_validator(nullptr) {}
  23. StringExtractorGDBRemote(const char *cstr)
  24. : StringExtractor(cstr), m_validator(nullptr) {}
  25. bool ValidateResponse() const;
  26. void CopyResponseValidator(const StringExtractorGDBRemote &rhs);
  27. void SetResponseValidator(ResponseValidatorCallback callback, void *baton);
  28. void SetResponseValidatorToOKErrorNotSupported();
  29. void SetResponseValidatorToASCIIHexBytes();
  30. void SetResponseValidatorToJSON();
  31. enum ServerPacketType {
  32. eServerPacketType_nack = 0,
  33. eServerPacketType_ack,
  34. eServerPacketType_invalid,
  35. eServerPacketType_unimplemented,
  36. eServerPacketType_interrupt, // CTRL+c packet or "\x03"
  37. eServerPacketType_A, // Program arguments packet
  38. eServerPacketType_qfProcessInfo,
  39. eServerPacketType_qsProcessInfo,
  40. eServerPacketType_qC,
  41. eServerPacketType_qEcho,
  42. eServerPacketType_qGroupName,
  43. eServerPacketType_qHostInfo,
  44. eServerPacketType_qLaunchGDBServer,
  45. eServerPacketType_qQueryGDBServer,
  46. eServerPacketType_qKillSpawnedProcess,
  47. eServerPacketType_qLaunchSuccess,
  48. eServerPacketType_qModuleInfo,
  49. eServerPacketType_qProcessInfoPID,
  50. eServerPacketType_qSpeedTest,
  51. eServerPacketType_qUserName,
  52. eServerPacketType_qGetWorkingDir,
  53. eServerPacketType_qFileLoadAddress,
  54. eServerPacketType_QEnvironment,
  55. eServerPacketType_QEnableErrorStrings,
  56. eServerPacketType_QLaunchArch,
  57. eServerPacketType_QSetDisableASLR,
  58. eServerPacketType_QSetDetachOnError,
  59. eServerPacketType_QSetSTDIN,
  60. eServerPacketType_QSetSTDOUT,
  61. eServerPacketType_QSetSTDERR,
  62. eServerPacketType_QSetWorkingDir,
  63. eServerPacketType_QStartNoAckMode,
  64. eServerPacketType_qPathComplete,
  65. eServerPacketType_qPlatform_shell,
  66. eServerPacketType_qPlatform_mkdir,
  67. eServerPacketType_qPlatform_chmod,
  68. eServerPacketType_vFile_open,
  69. eServerPacketType_vFile_close,
  70. eServerPacketType_vFile_pread,
  71. eServerPacketType_vFile_pwrite,
  72. eServerPacketType_vFile_size,
  73. eServerPacketType_vFile_mode,
  74. eServerPacketType_vFile_exists,
  75. eServerPacketType_vFile_md5,
  76. eServerPacketType_vFile_stat,
  77. eServerPacketType_vFile_symlink,
  78. eServerPacketType_vFile_unlink,
  79. // debug server packages
  80. eServerPacketType_QEnvironmentHexEncoded,
  81. eServerPacketType_QListThreadsInStopReply,
  82. eServerPacketType_QPassSignals,
  83. eServerPacketType_QRestoreRegisterState,
  84. eServerPacketType_QSaveRegisterState,
  85. eServerPacketType_QSetLogging,
  86. eServerPacketType_QSetMaxPacketSize,
  87. eServerPacketType_QSetMaxPayloadSize,
  88. eServerPacketType_QSetEnableAsyncProfiling,
  89. eServerPacketType_QSyncThreadState,
  90. eServerPacketType_QThreadSuffixSupported,
  91. eServerPacketType_jThreadsInfo,
  92. eServerPacketType_qsThreadInfo,
  93. eServerPacketType_qfThreadInfo,
  94. eServerPacketType_qGetPid,
  95. eServerPacketType_qGetProfileData,
  96. eServerPacketType_qGDBServerVersion,
  97. eServerPacketType_qMemoryRegionInfo,
  98. eServerPacketType_qMemoryRegionInfoSupported,
  99. eServerPacketType_qProcessInfo,
  100. eServerPacketType_qRcmd,
  101. eServerPacketType_qRegisterInfo,
  102. eServerPacketType_qShlibInfoAddr,
  103. eServerPacketType_qStepPacketSupported,
  104. eServerPacketType_qSupported,
  105. eServerPacketType_qSyncThreadStateSupported,
  106. eServerPacketType_qThreadExtraInfo,
  107. eServerPacketType_qThreadStopInfo,
  108. eServerPacketType_qVAttachOrWaitSupported,
  109. eServerPacketType_qWatchpointSupportInfo,
  110. eServerPacketType_qWatchpointSupportInfoSupported,
  111. eServerPacketType_qXfer,
  112. eServerPacketType_jSignalsInfo,
  113. eServerPacketType_jModulesInfo,
  114. eServerPacketType_vAttach,
  115. eServerPacketType_vAttachWait,
  116. eServerPacketType_vAttachOrWait,
  117. eServerPacketType_vAttachName,
  118. eServerPacketType_vCont,
  119. eServerPacketType_vCont_actions, // vCont?
  120. eServerPacketType_stop_reason, // '?'
  121. eServerPacketType_c,
  122. eServerPacketType_C,
  123. eServerPacketType_D,
  124. eServerPacketType_g,
  125. eServerPacketType_G,
  126. eServerPacketType_H,
  127. eServerPacketType_I, // stdin notification
  128. eServerPacketType_k,
  129. eServerPacketType_m,
  130. eServerPacketType_M,
  131. eServerPacketType_p,
  132. eServerPacketType_P,
  133. eServerPacketType_s,
  134. eServerPacketType_S,
  135. eServerPacketType_T,
  136. eServerPacketType_x,
  137. eServerPacketType_X,
  138. eServerPacketType_Z,
  139. eServerPacketType_z,
  140. eServerPacketType__M,
  141. eServerPacketType__m,
  142. eServerPacketType_notify, // '%' notification
  143. eServerPacketType_jLLDBTraceSupported,
  144. eServerPacketType_jLLDBTraceStart,
  145. eServerPacketType_jLLDBTraceStop,
  146. eServerPacketType_jLLDBTraceGetState,
  147. eServerPacketType_jLLDBTraceGetBinaryData,
  148. };
  149. ServerPacketType GetServerPacketType() const;
  150. enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse };
  151. ResponseType GetResponseType() const;
  152. bool IsOKResponse() const;
  153. bool IsUnsupportedResponse() const;
  154. bool IsNormalResponse() const;
  155. bool IsErrorResponse() const;
  156. // Returns zero if the packet isn't a EXX packet where XX are two hex digits.
  157. // Otherwise the error encoded in XX is returned.
  158. uint8_t GetError();
  159. lldb_private::Status GetStatus();
  160. size_t GetEscapedBinaryData(std::string &str);
  161. static constexpr lldb::pid_t AllProcesses = UINT64_MAX;
  162. static constexpr lldb::tid_t AllThreads = UINT64_MAX;
  163. // Read thread-id from the packet. If the packet is valid, returns
  164. // the pair (PID, TID), otherwise returns llvm::None. If the packet
  165. // does not list a PID, default_pid is used.
  166. llvm::Optional<std::pair<lldb::pid_t, lldb::tid_t>>
  167. GetPidTid(lldb::pid_t default_pid);
  168. protected:
  169. ResponseValidatorCallback m_validator;
  170. void *m_validator_baton;
  171. };
  172. #endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H