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

source code of lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.h