brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.7 KiB · b400cc2 Raw
348 lines · c
1//===-- GDBRemoteCommunicationServerLLGS.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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H10#define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H11 12#include <mutex>13#include <unordered_map>14#include <unordered_set>15 16#include "lldb/Core/Communication.h"17#include "lldb/Host/MainLoop.h"18#include "lldb/Host/common/NativeProcessProtocol.h"19#include "lldb/Utility/RegisterValue.h"20#include "lldb/lldb-private-forward.h"21 22#include "GDBRemoteCommunicationServerCommon.h"23 24class StringExtractorGDBRemote;25 26namespace lldb_private {27 28namespace process_gdb_remote {29 30class ProcessGDBRemote;31 32class GDBRemoteCommunicationServerLLGS33    : public GDBRemoteCommunicationServerCommon,34      public NativeProcessProtocol::NativeDelegate {35public:36  // Constructors and Destructors37  GDBRemoteCommunicationServerLLGS(38      MainLoop &mainloop,39      NativeProcessProtocol::Manager &process_manager);40 41  void SetLaunchInfo(const ProcessLaunchInfo &info);42 43  /// Launch a process with the current launch settings.44  ///45  /// This method supports running an lldb-gdbserver or similar46  /// server in a situation where the startup code has been provided47  /// with all the information for a child process to be launched.48  ///49  /// \return50  ///     An Status object indicating the success or failure of the51  ///     launch.52  Status LaunchProcess() override;53 54  /// Attach to a process.55  ///56  /// This method supports attaching llgs to a process accessible via the57  /// configured Platform.58  ///59  /// \return60  ///     An Status object indicating the success or failure of the61  ///     attach operation.62  Status AttachToProcess(lldb::pid_t pid);63 64  /// Wait to attach to a process with a given name.65  ///66  /// This method supports waiting for the next instance of a process67  /// with a given name and attaching llgs to that via the configured68  /// Platform.69  ///70  /// \return71  ///     An Status object indicating the success or failure of the72  ///     attach operation.73  Status AttachWaitProcess(llvm::StringRef process_name, bool include_existing);74 75  // NativeProcessProtocol::NativeDelegate overrides76  void InitializeDelegate(NativeProcessProtocol *process) override;77 78  void ProcessStateChanged(NativeProcessProtocol *process,79                           lldb::StateType state) override;80 81  void DidExec(NativeProcessProtocol *process) override;82 83  void84  NewSubprocess(NativeProcessProtocol *parent_process,85                std::unique_ptr<NativeProcessProtocol> child_process) override;86 87  Status InitializeConnection(std::unique_ptr<Connection> connection);88 89  GDBRemoteCommunication::PacketResult90  SendStructuredDataPacket(const llvm::json::Value &value);91 92  struct DebuggedProcess {93    enum class Flag {94      vkilled = (1u << 0),95 96      LLVM_MARK_AS_BITMASK_ENUM(vkilled)97    };98 99    std::unique_ptr<NativeProcessProtocol> process_up;100    Flag flags;101  };102 103protected:104  MainLoop &m_mainloop;105  MainLoop::ReadHandleUP m_network_handle_up;106  NativeProcessProtocol::Manager &m_process_manager;107  lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;108  lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;109  NativeProcessProtocol *m_current_process;110  NativeProcessProtocol *m_continue_process;111  std::recursive_mutex m_debugged_process_mutex;112  std::unordered_map<lldb::pid_t, DebuggedProcess> m_debugged_processes;113 114  Communication m_stdio_communication;115  MainLoop::ReadHandleUP m_stdio_handle_up;116 117  llvm::StringMap<std::unique_ptr<llvm::MemoryBuffer>> m_xfer_buffer_map;118  std::mutex m_saved_registers_mutex;119  std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;120  uint32_t m_next_saved_registers_id = 1;121  bool m_thread_suffix_supported = false;122  bool m_list_threads_in_stop_reply = false;123  bool m_non_stop = false;124  bool m_disabling_non_stop = false;125  std::deque<std::string> m_stdio_notification_queue;126  std::deque<std::string> m_stop_notification_queue;127 128  NativeProcessProtocol::Extension m_extensions_supported = {};129 130  // Typically we would use a SmallVector for this data but in this context we131  // don't know how much data we're recieving so we would have to heap allocate132  // a lot, or have a very large stack frame. So it's a member instead.133  uint8_t m_reg_bytes[RegisterValue::kMaxRegisterByteSize];134 135  PacketResult SendONotification(const char *buffer, uint32_t len);136 137  PacketResult SendWResponse(NativeProcessProtocol *process);138 139  StreamString PrepareStopReplyPacketForThread(NativeThreadProtocol &thread);140 141  PacketResult SendStopReplyPacketForThread(NativeProcessProtocol &process,142                                            lldb::tid_t tid,143                                            bool force_synchronous);144 145  PacketResult SendStopReasonForState(NativeProcessProtocol &process,146                                      lldb::StateType process_state,147                                      bool force_synchronous);148 149  void EnqueueStopReplyPackets(lldb::tid_t thread_to_skip);150 151  PacketResult Handle_k(StringExtractorGDBRemote &packet);152 153  PacketResult Handle_vKill(StringExtractorGDBRemote &packet);154 155  PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);156 157  PacketResult Handle_qC(StringExtractorGDBRemote &packet);158 159  PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);160 161  PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);162 163  PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);164 165  PacketResult Handle_QThreadSuffixSupported(StringExtractorGDBRemote &packet);166 167  PacketResult Handle_QListThreadsInStopReply(StringExtractorGDBRemote &packet);168 169  PacketResult ResumeProcess(NativeProcessProtocol &process,170                             const ResumeActionList &actions);171 172  PacketResult Handle_C(StringExtractorGDBRemote &packet);173 174  PacketResult Handle_c(StringExtractorGDBRemote &packet);175 176  PacketResult Handle_vCont(StringExtractorGDBRemote &packet);177 178  PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);179 180  PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);181 182  PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);183 184  void AddProcessThreads(StreamGDBRemote &response,185                         NativeProcessProtocol &process, bool &had_any);186 187  PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);188 189  PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);190 191  PacketResult Handle_qStructuredDataPlugins(StringExtractorGDBRemote &packet);192 193  PacketResult Handle_p(StringExtractorGDBRemote &packet);194 195  PacketResult Handle_P(StringExtractorGDBRemote &packet);196 197  PacketResult Handle_H(StringExtractorGDBRemote &packet);198 199  PacketResult Handle_I(StringExtractorGDBRemote &packet);200 201  PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);202 203  // Handles $m and $x packets.204  PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);205 206  PacketResult Handle_M(StringExtractorGDBRemote &packet);207  PacketResult Handle__M(StringExtractorGDBRemote &packet);208  PacketResult Handle__m(StringExtractorGDBRemote &packet);209 210  PacketResult211  Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);212 213  PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);214 215  PacketResult Handle_Z(StringExtractorGDBRemote &packet);216 217  PacketResult Handle_z(StringExtractorGDBRemote &packet);218 219  PacketResult Handle_s(StringExtractorGDBRemote &packet);220 221  PacketResult Handle_qXfer(StringExtractorGDBRemote &packet);222 223  PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);224 225  PacketResult Handle_jLLDBTraceSupported(StringExtractorGDBRemote &packet);226 227  PacketResult Handle_jLLDBTraceStart(StringExtractorGDBRemote &packet);228 229  PacketResult Handle_jLLDBTraceStop(StringExtractorGDBRemote &packet);230 231  PacketResult Handle_jLLDBTraceGetState(StringExtractorGDBRemote &packet);232 233  PacketResult Handle_jLLDBTraceGetBinaryData(StringExtractorGDBRemote &packet);234 235  PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);236 237  PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);238 239  PacketResult Handle_vAttachWait(StringExtractorGDBRemote &packet);240 241  PacketResult Handle_qVAttachOrWaitSupported(StringExtractorGDBRemote &packet);242 243  PacketResult Handle_vAttachOrWait(StringExtractorGDBRemote &packet);244 245  PacketResult Handle_vRun(StringExtractorGDBRemote &packet);246 247  PacketResult Handle_D(StringExtractorGDBRemote &packet);248 249  PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);250 251  PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);252 253  PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);254 255  PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);256 257  PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);258 259  PacketResult Handle_qSaveCore(StringExtractorGDBRemote &packet);260 261  PacketResult Handle_QNonStop(StringExtractorGDBRemote &packet);262 263  PacketResult HandleNotificationAck(std::deque<std::string> &queue);264 265  PacketResult Handle_vStdio(StringExtractorGDBRemote &packet);266 267  PacketResult Handle_vStopped(StringExtractorGDBRemote &packet);268 269  PacketResult Handle_vCtrlC(StringExtractorGDBRemote &packet);270 271  PacketResult Handle_g(StringExtractorGDBRemote &packet);272 273  PacketResult Handle_qMemTags(StringExtractorGDBRemote &packet);274 275  PacketResult Handle_QMemTags(StringExtractorGDBRemote &packet);276 277  PacketResult Handle_T(StringExtractorGDBRemote &packet);278 279  void SetCurrentThreadID(lldb::tid_t tid);280 281  lldb::tid_t GetCurrentThreadID() const;282 283  void SetContinueThreadID(lldb::tid_t tid);284 285  lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }286 287  Status SetSTDIOFileDescriptor(int fd);288 289  FileSpec FindModuleFile(const std::string &module_path,290                          const ArchSpec &arch) override;291 292  llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>293  ReadXferObject(llvm::StringRef object, llvm::StringRef annex);294 295  static std::string XMLEncodeAttributeValue(llvm::StringRef value);296 297  std::vector<std::string> HandleFeatures(298      const llvm::ArrayRef<llvm::StringRef> client_features) override;299 300  // Provide a response for successful continue action, i.e. send "OK"301  // in non-stop mode, no response otherwise.302  PacketResult SendContinueSuccessResponse();303 304  void AppendThreadIDToResponse(Stream &response, lldb::pid_t pid,305                                lldb::tid_t tid);306 307private:308  llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>> BuildTargetXml();309 310  void HandleInferiorState_Exited(NativeProcessProtocol *process);311 312  void HandleInferiorState_Stopped(NativeProcessProtocol *process);313 314  NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);315 316  uint32_t GetNextSavedRegistersID();317 318  void MaybeCloseInferiorTerminalConnection();319 320  void ClearProcessSpecificData();321 322  void RegisterPacketHandlers();323 324  void DataAvailableCallback();325 326  void SendProcessOutput();327 328  void StartSTDIOForwarding();329 330  void StopSTDIOForwarding();331 332  // Call SetEnabledExtensions() with appropriate flags on the process.333  void SetEnabledExtensions(NativeProcessProtocol &process);334 335  // For GDBRemoteCommunicationServerLLGS only336  GDBRemoteCommunicationServerLLGS(const GDBRemoteCommunicationServerLLGS &) =337      delete;338  const GDBRemoteCommunicationServerLLGS &339  operator=(const GDBRemoteCommunicationServerLLGS &) = delete;340};341 342std::string LLGSArgToURL(llvm::StringRef url_arg, bool reverse_connect);343 344} // namespace process_gdb_remote345} // namespace lldb_private346 347#endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H348