1 //===-- GDBRemoteCommunicationServerLLGS.h ----------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
13 #include <unordered_map>
14 #include <unordered_set>
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"
22 #include "GDBRemoteCommunicationServerCommon.h"
24 class StringExtractorGDBRemote
;
26 namespace lldb_private
{
28 namespace process_gdb_remote
{
30 class ProcessGDBRemote
;
32 class GDBRemoteCommunicationServerLLGS
33 : public GDBRemoteCommunicationServerCommon
,
34 public NativeProcessProtocol::NativeDelegate
{
36 // Constructors and Destructors
37 GDBRemoteCommunicationServerLLGS(
39 NativeProcessProtocol::Manager
&process_manager
);
41 void SetLaunchInfo(const ProcessLaunchInfo
&info
);
43 /// Launch a process with the current launch settings.
45 /// This method supports running an lldb-gdbserver or similar
46 /// server in a situation where the startup code has been provided
47 /// with all the information for a child process to be launched.
50 /// An Status object indicating the success or failure of the
52 Status
LaunchProcess() override
;
54 /// Attach to a process.
56 /// This method supports attaching llgs to a process accessible via the
57 /// configured Platform.
60 /// An Status object indicating the success or failure of the
62 Status
AttachToProcess(lldb::pid_t pid
);
64 /// Wait to attach to a process with a given name.
66 /// This method supports waiting for the next instance of a process
67 /// with a given name and attaching llgs to that via the configured
71 /// An Status object indicating the success or failure of the
73 Status
AttachWaitProcess(llvm::StringRef process_name
, bool include_existing
);
75 // NativeProcessProtocol::NativeDelegate overrides
76 void InitializeDelegate(NativeProcessProtocol
*process
) override
;
78 void ProcessStateChanged(NativeProcessProtocol
*process
,
79 lldb::StateType state
) override
;
81 void DidExec(NativeProcessProtocol
*process
) override
;
84 NewSubprocess(NativeProcessProtocol
*parent_process
,
85 std::unique_ptr
<NativeProcessProtocol
> child_process
) override
;
87 Status
InitializeConnection(std::unique_ptr
<Connection
> connection
);
89 struct DebuggedProcess
{
93 LLVM_MARK_AS_BITMASK_ENUM(vkilled
)
96 std::unique_ptr
<NativeProcessProtocol
> process_up
;
101 MainLoop
&m_mainloop
;
102 MainLoop::ReadHandleUP m_network_handle_up
;
103 NativeProcessProtocol::Manager
&m_process_manager
;
104 lldb::tid_t m_current_tid
= LLDB_INVALID_THREAD_ID
;
105 lldb::tid_t m_continue_tid
= LLDB_INVALID_THREAD_ID
;
106 NativeProcessProtocol
*m_current_process
;
107 NativeProcessProtocol
*m_continue_process
;
108 std::recursive_mutex m_debugged_process_mutex
;
109 std::unordered_map
<lldb::pid_t
, DebuggedProcess
> m_debugged_processes
;
111 Communication m_stdio_communication
;
112 MainLoop::ReadHandleUP m_stdio_handle_up
;
114 llvm::StringMap
<std::unique_ptr
<llvm::MemoryBuffer
>> m_xfer_buffer_map
;
115 std::mutex m_saved_registers_mutex
;
116 std::unordered_map
<uint32_t, lldb::DataBufferSP
> m_saved_registers_map
;
117 uint32_t m_next_saved_registers_id
= 1;
118 bool m_thread_suffix_supported
= false;
119 bool m_list_threads_in_stop_reply
= false;
120 bool m_non_stop
= false;
121 bool m_disabling_non_stop
= false;
122 std::deque
<std::string
> m_stdio_notification_queue
;
123 std::deque
<std::string
> m_stop_notification_queue
;
125 NativeProcessProtocol::Extension m_extensions_supported
= {};
127 // Typically we would use a SmallVector for this data but in this context we
128 // don't know how much data we're recieving so we would have to heap allocate
129 // a lot, or have a very large stack frame. So it's a member instead.
130 uint8_t m_reg_bytes
[RegisterValue::kMaxRegisterByteSize
];
132 PacketResult
SendONotification(const char *buffer
, uint32_t len
);
134 PacketResult
SendWResponse(NativeProcessProtocol
*process
);
136 StreamString
PrepareStopReplyPacketForThread(NativeThreadProtocol
&thread
);
138 PacketResult
SendStopReplyPacketForThread(NativeProcessProtocol
&process
,
140 bool force_synchronous
);
142 PacketResult
SendStopReasonForState(NativeProcessProtocol
&process
,
143 lldb::StateType process_state
,
144 bool force_synchronous
);
146 void EnqueueStopReplyPackets(lldb::tid_t thread_to_skip
);
148 PacketResult
Handle_k(StringExtractorGDBRemote
&packet
);
150 PacketResult
Handle_vKill(StringExtractorGDBRemote
&packet
);
152 PacketResult
Handle_qProcessInfo(StringExtractorGDBRemote
&packet
);
154 PacketResult
Handle_qC(StringExtractorGDBRemote
&packet
);
156 PacketResult
Handle_QSetDisableASLR(StringExtractorGDBRemote
&packet
);
158 PacketResult
Handle_QSetWorkingDir(StringExtractorGDBRemote
&packet
);
160 PacketResult
Handle_qGetWorkingDir(StringExtractorGDBRemote
&packet
);
162 PacketResult
Handle_QThreadSuffixSupported(StringExtractorGDBRemote
&packet
);
164 PacketResult
Handle_QListThreadsInStopReply(StringExtractorGDBRemote
&packet
);
166 PacketResult
ResumeProcess(NativeProcessProtocol
&process
,
167 const ResumeActionList
&actions
);
169 PacketResult
Handle_C(StringExtractorGDBRemote
&packet
);
171 PacketResult
Handle_c(StringExtractorGDBRemote
&packet
);
173 PacketResult
Handle_vCont(StringExtractorGDBRemote
&packet
);
175 PacketResult
Handle_vCont_actions(StringExtractorGDBRemote
&packet
);
177 PacketResult
Handle_stop_reason(StringExtractorGDBRemote
&packet
);
179 PacketResult
Handle_qRegisterInfo(StringExtractorGDBRemote
&packet
);
181 void AddProcessThreads(StreamGDBRemote
&response
,
182 NativeProcessProtocol
&process
, bool &had_any
);
184 PacketResult
Handle_qfThreadInfo(StringExtractorGDBRemote
&packet
);
186 PacketResult
Handle_qsThreadInfo(StringExtractorGDBRemote
&packet
);
188 PacketResult
Handle_p(StringExtractorGDBRemote
&packet
);
190 PacketResult
Handle_P(StringExtractorGDBRemote
&packet
);
192 PacketResult
Handle_H(StringExtractorGDBRemote
&packet
);
194 PacketResult
Handle_I(StringExtractorGDBRemote
&packet
);
196 PacketResult
Handle_interrupt(StringExtractorGDBRemote
&packet
);
198 // Handles $m and $x packets.
199 PacketResult
Handle_memory_read(StringExtractorGDBRemote
&packet
);
201 PacketResult
Handle_M(StringExtractorGDBRemote
&packet
);
202 PacketResult
Handle__M(StringExtractorGDBRemote
&packet
);
203 PacketResult
Handle__m(StringExtractorGDBRemote
&packet
);
206 Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote
&packet
);
208 PacketResult
Handle_qMemoryRegionInfo(StringExtractorGDBRemote
&packet
);
210 PacketResult
Handle_Z(StringExtractorGDBRemote
&packet
);
212 PacketResult
Handle_z(StringExtractorGDBRemote
&packet
);
214 PacketResult
Handle_s(StringExtractorGDBRemote
&packet
);
216 PacketResult
Handle_qXfer(StringExtractorGDBRemote
&packet
);
218 PacketResult
Handle_QSaveRegisterState(StringExtractorGDBRemote
&packet
);
220 PacketResult
Handle_jLLDBTraceSupported(StringExtractorGDBRemote
&packet
);
222 PacketResult
Handle_jLLDBTraceStart(StringExtractorGDBRemote
&packet
);
224 PacketResult
Handle_jLLDBTraceStop(StringExtractorGDBRemote
&packet
);
226 PacketResult
Handle_jLLDBTraceGetState(StringExtractorGDBRemote
&packet
);
228 PacketResult
Handle_jLLDBTraceGetBinaryData(StringExtractorGDBRemote
&packet
);
230 PacketResult
Handle_QRestoreRegisterState(StringExtractorGDBRemote
&packet
);
232 PacketResult
Handle_vAttach(StringExtractorGDBRemote
&packet
);
234 PacketResult
Handle_vAttachWait(StringExtractorGDBRemote
&packet
);
236 PacketResult
Handle_qVAttachOrWaitSupported(StringExtractorGDBRemote
&packet
);
238 PacketResult
Handle_vAttachOrWait(StringExtractorGDBRemote
&packet
);
240 PacketResult
Handle_vRun(StringExtractorGDBRemote
&packet
);
242 PacketResult
Handle_D(StringExtractorGDBRemote
&packet
);
244 PacketResult
Handle_qThreadStopInfo(StringExtractorGDBRemote
&packet
);
246 PacketResult
Handle_jThreadsInfo(StringExtractorGDBRemote
&packet
);
248 PacketResult
Handle_qWatchpointSupportInfo(StringExtractorGDBRemote
&packet
);
250 PacketResult
Handle_qFileLoadAddress(StringExtractorGDBRemote
&packet
);
252 PacketResult
Handle_QPassSignals(StringExtractorGDBRemote
&packet
);
254 PacketResult
Handle_qSaveCore(StringExtractorGDBRemote
&packet
);
256 PacketResult
Handle_QNonStop(StringExtractorGDBRemote
&packet
);
258 PacketResult
HandleNotificationAck(std::deque
<std::string
> &queue
);
260 PacketResult
Handle_vStdio(StringExtractorGDBRemote
&packet
);
262 PacketResult
Handle_vStopped(StringExtractorGDBRemote
&packet
);
264 PacketResult
Handle_vCtrlC(StringExtractorGDBRemote
&packet
);
266 PacketResult
Handle_g(StringExtractorGDBRemote
&packet
);
268 PacketResult
Handle_qMemTags(StringExtractorGDBRemote
&packet
);
270 PacketResult
Handle_QMemTags(StringExtractorGDBRemote
&packet
);
272 PacketResult
Handle_T(StringExtractorGDBRemote
&packet
);
274 void SetCurrentThreadID(lldb::tid_t tid
);
276 lldb::tid_t
GetCurrentThreadID() const;
278 void SetContinueThreadID(lldb::tid_t tid
);
280 lldb::tid_t
GetContinueThreadID() const { return m_continue_tid
; }
282 Status
SetSTDIOFileDescriptor(int fd
);
284 FileSpec
FindModuleFile(const std::string
&module_path
,
285 const ArchSpec
&arch
) override
;
287 llvm::Expected
<std::unique_ptr
<llvm::MemoryBuffer
>>
288 ReadXferObject(llvm::StringRef object
, llvm::StringRef annex
);
290 static std::string
XMLEncodeAttributeValue(llvm::StringRef value
);
292 std::vector
<std::string
> HandleFeatures(
293 const llvm::ArrayRef
<llvm::StringRef
> client_features
) override
;
295 // Provide a response for successful continue action, i.e. send "OK"
296 // in non-stop mode, no response otherwise.
297 PacketResult
SendContinueSuccessResponse();
299 void AppendThreadIDToResponse(Stream
&response
, lldb::pid_t pid
,
303 llvm::Expected
<std::unique_ptr
<llvm::MemoryBuffer
>> BuildTargetXml();
305 void HandleInferiorState_Exited(NativeProcessProtocol
*process
);
307 void HandleInferiorState_Stopped(NativeProcessProtocol
*process
);
309 NativeThreadProtocol
*GetThreadFromSuffix(StringExtractorGDBRemote
&packet
);
311 uint32_t GetNextSavedRegistersID();
313 void MaybeCloseInferiorTerminalConnection();
315 void ClearProcessSpecificData();
317 void RegisterPacketHandlers();
319 void DataAvailableCallback();
321 void SendProcessOutput();
323 void StartSTDIOForwarding();
325 void StopSTDIOForwarding();
327 // Call SetEnabledExtensions() with appropriate flags on the process.
328 void SetEnabledExtensions(NativeProcessProtocol
&process
);
330 // For GDBRemoteCommunicationServerLLGS only
331 GDBRemoteCommunicationServerLLGS(const GDBRemoteCommunicationServerLLGS
&) =
333 const GDBRemoteCommunicationServerLLGS
&
334 operator=(const GDBRemoteCommunicationServerLLGS
&) = delete;
337 std::string
LLGSArgToURL(llvm::StringRef url_arg
, bool reverse_connect
);
339 } // namespace process_gdb_remote
340 } // namespace lldb_private
342 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H