1 | //===-- GDBRemoteCommunicationServerPlatform.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_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H |
10 | #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H |
11 | |
12 | #include <map> |
13 | #include <mutex> |
14 | #include <optional> |
15 | #include <set> |
16 | |
17 | #include "GDBRemoteCommunicationServerCommon.h" |
18 | #include "lldb/Host/Socket.h" |
19 | |
20 | #include "llvm/Support/Error.h" |
21 | |
22 | namespace lldb_private { |
23 | namespace process_gdb_remote { |
24 | |
25 | class GDBRemoteCommunicationServerPlatform |
26 | : public GDBRemoteCommunicationServerCommon { |
27 | public: |
28 | GDBRemoteCommunicationServerPlatform( |
29 | const Socket::SocketProtocol socket_protocol, uint16_t gdbserver_port); |
30 | |
31 | ~GDBRemoteCommunicationServerPlatform() override; |
32 | |
33 | Status LaunchProcess() override; |
34 | |
35 | void SetInferiorArguments(const lldb_private::Args &args); |
36 | |
37 | Status LaunchGDBServer(const lldb_private::Args &args, lldb::pid_t &pid, |
38 | std::string &socket_name, shared_fd_t fd); |
39 | |
40 | void SetPendingGdbServer(const std::string &socket_name); |
41 | |
42 | protected: |
43 | const Socket::SocketProtocol m_socket_protocol; |
44 | std::recursive_mutex m_spawned_pids_mutex; |
45 | std::set<lldb::pid_t> m_spawned_pids; |
46 | |
47 | uint16_t m_gdbserver_port; |
48 | std::optional<std::string> m_pending_gdb_server_socket_name; |
49 | |
50 | PacketResult Handle_qLaunchGDBServer(StringExtractorGDBRemote &packet); |
51 | |
52 | PacketResult Handle_qQueryGDBServer(StringExtractorGDBRemote &packet); |
53 | |
54 | PacketResult Handle_qKillSpawnedProcess(StringExtractorGDBRemote &packet); |
55 | |
56 | PacketResult Handle_qPathComplete(StringExtractorGDBRemote &packet); |
57 | |
58 | PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet); |
59 | |
60 | PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet); |
61 | |
62 | PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet); |
63 | |
64 | PacketResult Handle_qC(StringExtractorGDBRemote &packet); |
65 | |
66 | PacketResult Handle_jSignalsInfo(StringExtractorGDBRemote &packet); |
67 | |
68 | private: |
69 | bool KillSpawnedProcess(lldb::pid_t pid); |
70 | bool SpawnedProcessIsRunning(lldb::pid_t pid); |
71 | void AddSpawnedProcess(lldb::pid_t pid); |
72 | |
73 | void DebugserverProcessReaped(lldb::pid_t pid); |
74 | |
75 | static const FileSpec &GetDomainSocketDir(); |
76 | |
77 | static FileSpec GetDomainSocketPath(const char *prefix); |
78 | |
79 | GDBRemoteCommunicationServerPlatform( |
80 | const GDBRemoteCommunicationServerPlatform &) = delete; |
81 | const GDBRemoteCommunicationServerPlatform & |
82 | operator=(const GDBRemoteCommunicationServerPlatform &) = delete; |
83 | }; |
84 | |
85 | } // namespace process_gdb_remote |
86 | } // namespace lldb_private |
87 | |
88 | #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERPLATFORM_H |
89 | |