LLDB mainline
GDBRemoteCommunicationServerLLGS.h
Go to the documentation of this file.
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
17#include "lldb/Host/MainLoop.h"
19#include "lldb/Utility/Locked.h"
22
25
27
28namespace lldb_private {
29
30namespace process_gdb_remote {
31
33
37public:
38 // Constructors and Destructors
40 MainLoop &mainloop, NativeProcessProtocol::Manager &process_manager,
41 llvm::StringRef name);
42
43 void SetLaunchInfo(const ProcessLaunchInfo &info);
44
45 /// Launch a process with the current launch settings.
46 ///
47 /// This method supports running an lldb-gdbserver or similar
48 /// server in a situation where the startup code has been provided
49 /// with all the information for a child process to be launched.
50 ///
51 /// \return
52 /// An Status object indicating the success or failure of the
53 /// launch.
54 Status LaunchProcess() override;
55
56 /// Attach to a process.
57 ///
58 /// This method supports attaching llgs to a process accessible via the
59 /// configured Platform.
60 ///
61 /// \return
62 /// An Status object indicating the success or failure of the
63 /// attach operation.
65
66 /// Wait to attach to a process with a given name.
67 ///
68 /// This method supports waiting for the next instance of a process
69 /// with a given name and attaching llgs to that via the configured
70 /// Platform.
71 ///
72 /// \return
73 /// An Status object indicating the success or failure of the
74 /// attach operation.
75 Status AttachWaitProcess(llvm::StringRef process_name, bool include_existing);
76
77 void InstallPlugin(
78 std::unique_ptr<lldb_server::LLDBServerAcceleratorPlugin> plugin_up);
79
80 /// Associate this server with the accelerator plugin for this connection.
81 /// The plugin must outlive this server.
86
88
89 // NativeProcessProtocol::NativeDelegate overrides
90 void InitializeDelegate(NativeProcessProtocol *process) override;
91
93 lldb::StateType state) override;
94
95 void DidExec(NativeProcessProtocol *process) override;
96
97 void
99 std::unique_ptr<NativeProcessProtocol> child_process) override;
100
101 /// Forward a chunk of inferior stdout/stderr produced by the platform's
102 /// own reader. This is used on Windows.
104 llvm::StringRef data) override;
105
106 /// Drain m_pending_output_buffer and emit a `$O` packet if the debuggee
107 /// is currently in a running state. No-op otherwise.
109
110 Status InitializeConnection(std::unique_ptr<Connection> connection);
111
113 SendStructuredDataPacket(const llvm::json::Value &value);
114
116 enum class Flag {
117 vkilled = (1u << 0),
118
120 };
121
122 std::unique_ptr<NativeProcessProtocol> process_up;
124 };
125
126protected:
130 std::vector<std::unique_ptr<lldb_server::LLDBServerAcceleratorPlugin>>
132 /// The plugin that owns this accelerator connection. This is null for the
133 /// native connection and does not own the plugin.
135 nullptr;
140 std::recursive_mutex m_debugged_process_mutex;
141 std::unordered_map<lldb::pid_t, DebuggedProcess> m_debugged_processes;
142
145
148
149 llvm::StringMap<std::unique_ptr<llvm::MemoryBuffer>> m_xfer_buffer_map;
150
152 std::unordered_map<uint32_t, lldb::DataBufferSP> map;
153 uint32_t next_id = 1;
154 };
156
160 bool m_non_stop = false;
162 std::deque<std::string> m_stdio_notification_queue;
163 std::deque<std::string> m_stop_notification_queue;
164
166
167 // Typically we would use a SmallVector for this data but in this context we
168 // don't know how much data we're recieving so we would have to heap allocate
169 // a lot, or have a very large stack frame. So it's a member instead.
171
172 PacketResult SendONotification(const char *buffer, uint32_t len);
173
175
177
179 lldb::tid_t tid,
180 bool force_synchronous);
181
183 lldb::StateType process_state,
184 bool force_synchronous);
185
186 void EnqueueStopReplyPackets(lldb::tid_t thread_to_skip);
187
189
191
193
195
197
199
201
203
205
207 const ResumeActionList &actions);
208
210
212
214
216
218
220
221 void AddProcessThreads(StreamGDBRemote &response,
222 NativeProcessProtocol &process, bool &had_any);
223
225
227
229
231
233
235
237
239
240 // Handles $m and $x packets.
242
246
249
251
253
255
257
259
261
263
265
267
269
271
273
275
277
279
281
283
285
287
289
291
293
295
297
299
301
302 PacketResult HandleNotificationAck(std::deque<std::string> &queue);
303
305
307
309
311
313
315
317
319
321
324
327
330
332
334
336
338
340
342
343 FileSpec FindModuleFile(const std::string &module_path,
344 const ArchSpec &arch) override;
345
346 llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
347 ReadXferObject(llvm::StringRef object, llvm::StringRef annex);
348
349 static std::string XMLEncodeAttributeValue(llvm::StringRef value);
350
351 std::vector<std::string> HandleFeatures(
352 const llvm::ArrayRef<llvm::StringRef> client_features) override;
353
354 // Provide a response for successful continue action, i.e. send "OK"
355 // in non-stop mode, no response otherwise.
357
358 void AppendThreadIDToResponse(Stream &response, lldb::pid_t pid,
359 lldb::tid_t tid);
360
361private:
362 llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>> BuildTargetXml();
363
364 struct BreakpointOK {};
366 std::string message;
367 };
369 uint8_t error_code;
370 };
371
373 std::variant<BreakpointOK, BreakpointIllFormed, BreakpointError>;
374
375 /// Core logic for a Z (set breakpoint/watchpoint) request.
376 BreakpointResult ExecuteSetBreakpoint(llvm::StringRef packet_str);
377
378 /// Core logic for a z (remove breakpoint/watchpoint) request.
379 BreakpointResult ExecuteRemoveBreakpoint(llvm::StringRef packet_str);
380
381 /// Convert a BreakpointResult into a PacketResult, sending the appropriate
382 /// response.
384 const BreakpointResult &result);
385
387
389
391
392 uint32_t GetNextSavedRegistersID();
393
395
397
399
401
402 void SendProcessOutput();
403
405
406 void StopSTDIOForwarding();
407
408 // Call SetEnabledExtensions() with appropriate flags on the process.
410
411 // For GDBRemoteCommunicationServerLLGS only
413 delete;
416};
417
418std::string LLGSArgToURL(llvm::StringRef url_arg, bool reverse_connect);
419
420} // namespace process_gdb_remote
421} // namespace lldb_private
422
423#endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
An architecture specification class.
Definition ArchSpec.h:32
An abstract communications class.
A file utility class.
Definition FileSpec.h:56
Bundles a value of type T with the Mutex that guards it.
Definition Locked.h:178
std::unique_ptr< ReadHandle > ReadHandleUP
Extension
Extension flag constants, returned by Manager::GetSupportedExtensions() and passed to SetEnabledExten...
An error handling class.
Definition Status.h:118
A stream class that can stream formatted output to a file.
Definition Stream.h:28
GDBRemoteCommunicationServerLLGS(const GDBRemoteCommunicationServerLLGS &)=delete
GDBRemoteCommunicationServerLLGS(MainLoop &mainloop, NativeProcessProtocol::Manager &process_manager, llvm::StringRef name)
void AddProcessThreads(StreamGDBRemote &response, NativeProcessProtocol &process, bool &had_any)
llvm::StringMap< std::unique_ptr< llvm::MemoryBuffer > > m_xfer_buffer_map
PacketResult SendStopReasonForState(NativeProcessProtocol &process, lldb::StateType process_state, bool force_synchronous)
std::vector< std::unique_ptr< lldb_server::LLDBServerAcceleratorPlugin > > m_accelerator_plugins
GDBRemoteCommunication::PacketResult SendStructuredDataPacket(const llvm::json::Value &value)
std::variant< BreakpointOK, BreakpointIllFormed, BreakpointError > BreakpointResult
void SetConnectionAcceleratorPlugin(lldb_server::LLDBServerAcceleratorPlugin &plugin)
Associate this server with the accelerator plugin for this connection.
BreakpointResult ExecuteRemoveBreakpoint(llvm::StringRef packet_str)
Core logic for a z (remove breakpoint/watchpoint) request.
FileSpec FindModuleFile(const std::string &module_path, const ArchSpec &arch) override
void NewProcessOutput(NativeProcessProtocol *process, llvm::StringRef data) override
Forward a chunk of inferior stdout/stderr produced by the platform's own reader.
void NewSubprocess(NativeProcessProtocol *parent_process, std::unique_ptr< NativeProcessProtocol > child_process) override
NativeThreadProtocol * GetThreadFromSuffix(StringExtractorGDBRemote &packet)
PacketResult SendBreakpointResponse(StringExtractorGDBRemote &packet, const BreakpointResult &result)
Convert a BreakpointResult into a PacketResult, sending the appropriate response.
BreakpointResult ExecuteSetBreakpoint(llvm::StringRef packet_str)
Core logic for a Z (set breakpoint/watchpoint) request.
Status LaunchProcess() override
Launch a process with the current launch settings.
void FlushPendingProcessOutput()
Drain m_pending_output_buffer and emit a $O packet if the debuggee is currently in a running state.
Status AttachWaitProcess(llvm::StringRef process_name, bool include_existing)
Wait to attach to a process with a given name.
const GDBRemoteCommunicationServerLLGS & operator=(const GDBRemoteCommunicationServerLLGS &)=delete
PacketResult ResumeProcess(NativeProcessProtocol &process, const ResumeActionList &actions)
void InstallPlugin(std::unique_ptr< lldb_server::LLDBServerAcceleratorPlugin > plugin_up)
lldb_server::LLDBServerAcceleratorPlugin * m_connection_accelerator_plugin
The plugin that owns this accelerator connection.
PacketResult SendStopReplyPacketForThread(NativeProcessProtocol &process, lldb::tid_t tid, bool force_synchronous)
PacketResult Handle_jAcceleratorPluginGetDynamicLoaderLibraryInfo(StringExtractorGDBRemote &packet)
void AppendThreadIDToResponse(Stream &response, lldb::pid_t pid, lldb::tid_t tid)
std::vector< std::string > HandleFeatures(const llvm::ArrayRef< llvm::StringRef > client_features) override
void ProcessStateChanged(NativeProcessProtocol *process, lldb::StateType state) override
llvm::Expected< std::unique_ptr< llvm::MemoryBuffer > > ReadXferObject(llvm::StringRef object, llvm::StringRef annex)
llvm::Expected< std::unique_ptr< llvm::MemoryBuffer > > BuildTargetXml()
#define LLDB_INVALID_THREAD_ID
std::string LLGSArgToURL(llvm::StringRef url_arg, bool reverse_connect)
A class that represents a running process on the host machine.
MainLoopPosix MainLoop
Definition MainLoop.h:20
StateType
Process and Thread States.
uint64_t pid_t
Definition lldb-types.h:84
uint64_t tid_t
Definition lldb-types.h:85