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