annotate lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- PlatformRemoteGDBServer.cpp ---------------------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "PlatformRemoteGDBServer.h"
anatofuz
parents:
diff changeset
10 #include "lldb/Host/Config.h"
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 #include "lldb/Breakpoint/BreakpointLocation.h"
anatofuz
parents:
diff changeset
13 #include "lldb/Core/Debugger.h"
anatofuz
parents:
diff changeset
14 #include "lldb/Core/Module.h"
anatofuz
parents:
diff changeset
15 #include "lldb/Core/ModuleList.h"
anatofuz
parents:
diff changeset
16 #include "lldb/Core/ModuleSpec.h"
anatofuz
parents:
diff changeset
17 #include "lldb/Core/PluginManager.h"
anatofuz
parents:
diff changeset
18 #include "lldb/Host/ConnectionFileDescriptor.h"
anatofuz
parents:
diff changeset
19 #include "lldb/Host/Host.h"
anatofuz
parents:
diff changeset
20 #include "lldb/Host/HostInfo.h"
anatofuz
parents:
diff changeset
21 #include "lldb/Host/PosixApi.h"
anatofuz
parents:
diff changeset
22 #include "lldb/Target/Process.h"
anatofuz
parents:
diff changeset
23 #include "lldb/Target/Target.h"
anatofuz
parents:
diff changeset
24 #include "lldb/Utility/FileSpec.h"
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
25 #include "lldb/Utility/LLDBLog.h"
150
anatofuz
parents:
diff changeset
26 #include "lldb/Utility/Log.h"
anatofuz
parents:
diff changeset
27 #include "lldb/Utility/ProcessInfo.h"
anatofuz
parents:
diff changeset
28 #include "lldb/Utility/Status.h"
anatofuz
parents:
diff changeset
29 #include "lldb/Utility/StreamString.h"
anatofuz
parents:
diff changeset
30 #include "lldb/Utility/UriParser.h"
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
31 #include "llvm/Support/FormatAdapters.h"
150
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 #include "Plugins/Process/Utility/GDBRemoteSignals.h"
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
34 #include "Plugins/Process/gdb-remote/ProcessGDBRemote.h"
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
35 #include <optional>
150
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 using namespace lldb;
anatofuz
parents:
diff changeset
38 using namespace lldb_private;
anatofuz
parents:
diff changeset
39 using namespace lldb_private::platform_gdb_server;
anatofuz
parents:
diff changeset
40
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
41 LLDB_PLUGIN_DEFINE_ADV(PlatformRemoteGDBServer, PlatformGDB)
150
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 static bool g_initialized = false;
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 void PlatformRemoteGDBServer::Initialize() {
anatofuz
parents:
diff changeset
46 Platform::Initialize();
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 if (!g_initialized) {
anatofuz
parents:
diff changeset
49 g_initialized = true;
anatofuz
parents:
diff changeset
50 PluginManager::RegisterPlugin(
anatofuz
parents:
diff changeset
51 PlatformRemoteGDBServer::GetPluginNameStatic(),
anatofuz
parents:
diff changeset
52 PlatformRemoteGDBServer::GetDescriptionStatic(),
anatofuz
parents:
diff changeset
53 PlatformRemoteGDBServer::CreateInstance);
anatofuz
parents:
diff changeset
54 }
anatofuz
parents:
diff changeset
55 }
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 void PlatformRemoteGDBServer::Terminate() {
anatofuz
parents:
diff changeset
58 if (g_initialized) {
anatofuz
parents:
diff changeset
59 g_initialized = false;
anatofuz
parents:
diff changeset
60 PluginManager::UnregisterPlugin(PlatformRemoteGDBServer::CreateInstance);
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 Platform::Terminate();
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 PlatformSP PlatformRemoteGDBServer::CreateInstance(bool force,
anatofuz
parents:
diff changeset
67 const ArchSpec *arch) {
anatofuz
parents:
diff changeset
68 bool create = force;
anatofuz
parents:
diff changeset
69 if (!create) {
anatofuz
parents:
diff changeset
70 create = !arch->TripleVendorWasSpecified() && !arch->TripleOSWasSpecified();
anatofuz
parents:
diff changeset
71 }
anatofuz
parents:
diff changeset
72 if (create)
anatofuz
parents:
diff changeset
73 return PlatformSP(new PlatformRemoteGDBServer());
anatofuz
parents:
diff changeset
74 return PlatformSP();
anatofuz
parents:
diff changeset
75 }
anatofuz
parents:
diff changeset
76
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
77 llvm::StringRef PlatformRemoteGDBServer::GetDescriptionStatic() {
150
anatofuz
parents:
diff changeset
78 return "A platform that uses the GDB remote protocol as the communication "
anatofuz
parents:
diff changeset
79 "transport.";
anatofuz
parents:
diff changeset
80 }
anatofuz
parents:
diff changeset
81
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
82 llvm::StringRef PlatformRemoteGDBServer::GetDescription() {
150
anatofuz
parents:
diff changeset
83 if (m_platform_description.empty()) {
anatofuz
parents:
diff changeset
84 if (IsConnected()) {
anatofuz
parents:
diff changeset
85 // Send the get description packet
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 if (!m_platform_description.empty())
anatofuz
parents:
diff changeset
90 return m_platform_description.c_str();
anatofuz
parents:
diff changeset
91 return GetDescriptionStatic();
anatofuz
parents:
diff changeset
92 }
anatofuz
parents:
diff changeset
93
anatofuz
parents:
diff changeset
94 bool PlatformRemoteGDBServer::GetModuleSpec(const FileSpec &module_file_spec,
anatofuz
parents:
diff changeset
95 const ArchSpec &arch,
anatofuz
parents:
diff changeset
96 ModuleSpec &module_spec) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
97 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
98
anatofuz
parents:
diff changeset
99 const auto module_path = module_file_spec.GetPath(false);
anatofuz
parents:
diff changeset
100
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
101 if (!m_gdb_client_up ||
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
102 !m_gdb_client_up->GetModuleInfo(module_file_spec, arch, module_spec)) {
150
anatofuz
parents:
diff changeset
103 LLDB_LOGF(
anatofuz
parents:
diff changeset
104 log,
anatofuz
parents:
diff changeset
105 "PlatformRemoteGDBServer::%s - failed to get module info for %s:%s",
anatofuz
parents:
diff changeset
106 __FUNCTION__, module_path.c_str(),
anatofuz
parents:
diff changeset
107 arch.GetTriple().getTriple().c_str());
anatofuz
parents:
diff changeset
108 return false;
anatofuz
parents:
diff changeset
109 }
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 if (log) {
anatofuz
parents:
diff changeset
112 StreamString stream;
anatofuz
parents:
diff changeset
113 module_spec.Dump(stream);
anatofuz
parents:
diff changeset
114 LLDB_LOGF(log,
anatofuz
parents:
diff changeset
115 "PlatformRemoteGDBServer::%s - got module info for (%s:%s) : %s",
anatofuz
parents:
diff changeset
116 __FUNCTION__, module_path.c_str(),
anatofuz
parents:
diff changeset
117 arch.GetTriple().getTriple().c_str(), stream.GetData());
anatofuz
parents:
diff changeset
118 }
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 return true;
anatofuz
parents:
diff changeset
121 }
anatofuz
parents:
diff changeset
122
anatofuz
parents:
diff changeset
123 Status PlatformRemoteGDBServer::GetFileWithUUID(const FileSpec &platform_file,
anatofuz
parents:
diff changeset
124 const UUID *uuid_ptr,
anatofuz
parents:
diff changeset
125 FileSpec &local_file) {
anatofuz
parents:
diff changeset
126 // Default to the local case
anatofuz
parents:
diff changeset
127 local_file = platform_file;
anatofuz
parents:
diff changeset
128 return Status();
anatofuz
parents:
diff changeset
129 }
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 /// Default Constructor
anatofuz
parents:
diff changeset
132 PlatformRemoteGDBServer::PlatformRemoteGDBServer()
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
133 : Platform(/*is_host=*/false) {}
150
anatofuz
parents:
diff changeset
134
anatofuz
parents:
diff changeset
135 /// Destructor.
anatofuz
parents:
diff changeset
136 ///
anatofuz
parents:
diff changeset
137 /// The destructor is virtual since this class is designed to be
anatofuz
parents:
diff changeset
138 /// inherited from by the plug-in instance.
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
139 PlatformRemoteGDBServer::~PlatformRemoteGDBServer() = default;
150
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 size_t PlatformRemoteGDBServer::GetSoftwareBreakpointTrapOpcode(
anatofuz
parents:
diff changeset
142 Target &target, BreakpointSite *bp_site) {
anatofuz
parents:
diff changeset
143 // This isn't needed if the z/Z packets are supported in the GDB remote
anatofuz
parents:
diff changeset
144 // server. But we might need a packet to detect this.
anatofuz
parents:
diff changeset
145 return 0;
anatofuz
parents:
diff changeset
146 }
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 bool PlatformRemoteGDBServer::GetRemoteOSVersion() {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
149 if (m_gdb_client_up)
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
150 m_os_version = m_gdb_client_up->GetOSVersion();
150
anatofuz
parents:
diff changeset
151 return !m_os_version.empty();
anatofuz
parents:
diff changeset
152 }
anatofuz
parents:
diff changeset
153
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
154 std::optional<std::string> PlatformRemoteGDBServer::GetRemoteOSBuildString() {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
155 if (!m_gdb_client_up)
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
156 return std::nullopt;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
157 return m_gdb_client_up->GetOSBuildString();
150
anatofuz
parents:
diff changeset
158 }
anatofuz
parents:
diff changeset
159
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
160 std::optional<std::string>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
161 PlatformRemoteGDBServer::GetRemoteOSKernelDescription() {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
162 if (!m_gdb_client_up)
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
163 return std::nullopt;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
164 return m_gdb_client_up->GetOSKernelDescription();
150
anatofuz
parents:
diff changeset
165 }
anatofuz
parents:
diff changeset
166
anatofuz
parents:
diff changeset
167 // Remote Platform subclasses need to override this function
anatofuz
parents:
diff changeset
168 ArchSpec PlatformRemoteGDBServer::GetRemoteSystemArchitecture() {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
169 if (!m_gdb_client_up)
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
170 return ArchSpec();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
171 return m_gdb_client_up->GetSystemArchitecture();
150
anatofuz
parents:
diff changeset
172 }
anatofuz
parents:
diff changeset
173
anatofuz
parents:
diff changeset
174 FileSpec PlatformRemoteGDBServer::GetRemoteWorkingDirectory() {
anatofuz
parents:
diff changeset
175 if (IsConnected()) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
176 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
177 FileSpec working_dir;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
178 if (m_gdb_client_up->GetWorkingDir(working_dir) && log)
150
anatofuz
parents:
diff changeset
179 LLDB_LOGF(log,
anatofuz
parents:
diff changeset
180 "PlatformRemoteGDBServer::GetRemoteWorkingDirectory() -> '%s'",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
181 working_dir.GetPath().c_str());
150
anatofuz
parents:
diff changeset
182 return working_dir;
anatofuz
parents:
diff changeset
183 } else {
anatofuz
parents:
diff changeset
184 return Platform::GetRemoteWorkingDirectory();
anatofuz
parents:
diff changeset
185 }
anatofuz
parents:
diff changeset
186 }
anatofuz
parents:
diff changeset
187
anatofuz
parents:
diff changeset
188 bool PlatformRemoteGDBServer::SetRemoteWorkingDirectory(
anatofuz
parents:
diff changeset
189 const FileSpec &working_dir) {
anatofuz
parents:
diff changeset
190 if (IsConnected()) {
anatofuz
parents:
diff changeset
191 // Clear the working directory it case it doesn't get set correctly. This
anatofuz
parents:
diff changeset
192 // will for use to re-read it
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
193 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
194 LLDB_LOGF(log, "PlatformRemoteGDBServer::SetRemoteWorkingDirectory('%s')",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
195 working_dir.GetPath().c_str());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
196 return m_gdb_client_up->SetWorkingDir(working_dir) == 0;
150
anatofuz
parents:
diff changeset
197 } else
anatofuz
parents:
diff changeset
198 return Platform::SetRemoteWorkingDirectory(working_dir);
anatofuz
parents:
diff changeset
199 }
anatofuz
parents:
diff changeset
200
anatofuz
parents:
diff changeset
201 bool PlatformRemoteGDBServer::IsConnected() const {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
202 if (m_gdb_client_up) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
203 assert(m_gdb_client_up->IsConnected());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
204 return true;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
205 }
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
206 return false;
150
anatofuz
parents:
diff changeset
207 }
anatofuz
parents:
diff changeset
208
anatofuz
parents:
diff changeset
209 Status PlatformRemoteGDBServer::ConnectRemote(Args &args) {
anatofuz
parents:
diff changeset
210 Status error;
anatofuz
parents:
diff changeset
211 if (IsConnected()) {
anatofuz
parents:
diff changeset
212 error.SetErrorStringWithFormat("the platform is already connected to '%s', "
anatofuz
parents:
diff changeset
213 "execute 'platform disconnect' to close the "
anatofuz
parents:
diff changeset
214 "current connection",
anatofuz
parents:
diff changeset
215 GetHostname());
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
216 return error;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
217 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
218
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
219 if (args.GetArgumentCount() != 1) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
220 error.SetErrorString(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
221 "\"platform connect\" takes a single argument: <connect-url>");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
222 return error;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
223 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
224
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
225 const char *url = args.GetArgumentAtIndex(0);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
226 if (!url)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
227 return Status("URL is null.");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
228
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
229 std::optional<URI> parsed_url = URI::Parse(url);
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
230 if (!parsed_url)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
231 return Status("Invalid URL: %s", url);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
232
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
233 // We're going to reuse the hostname when we connect to the debugserver.
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
234 m_platform_scheme = parsed_url->scheme.str();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
235 m_platform_hostname = parsed_url->hostname.str();
150
anatofuz
parents:
diff changeset
236
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
237 auto client_up =
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
238 std::make_unique<process_gdb_remote::GDBRemoteCommunicationClient>();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
239 client_up->SetPacketTimeout(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
240 process_gdb_remote::ProcessGDBRemote::GetPacketTimeout());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
241 client_up->SetConnection(std::make_unique<ConnectionFileDescriptor>());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
242 client_up->Connect(url, &error);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
243
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
244 if (error.Fail())
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
245 return error;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
246
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
247 if (client_up->HandshakeWithServer(&error)) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
248 m_gdb_client_up = std::move(client_up);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
249 m_gdb_client_up->GetHostInfo();
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
250 // If a working directory was set prior to connecting, send it down
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
251 // now.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
252 if (m_working_dir)
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
253 m_gdb_client_up->SetWorkingDir(m_working_dir);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
254
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
255 m_supported_architectures.clear();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
256 ArchSpec remote_arch = m_gdb_client_up->GetSystemArchitecture();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
257 if (remote_arch) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
258 m_supported_architectures.push_back(remote_arch);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
259 if (remote_arch.GetTriple().isArch64Bit())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
260 m_supported_architectures.push_back(
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
261 ArchSpec(remote_arch.GetTriple().get32BitArchVariant()));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
262 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
263 } else {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
264 client_up->Disconnect();
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
265 if (error.Success())
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
266 error.SetErrorString("handshake failed");
150
anatofuz
parents:
diff changeset
267 }
anatofuz
parents:
diff changeset
268 return error;
anatofuz
parents:
diff changeset
269 }
anatofuz
parents:
diff changeset
270
anatofuz
parents:
diff changeset
271 Status PlatformRemoteGDBServer::DisconnectRemote() {
anatofuz
parents:
diff changeset
272 Status error;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
273 m_gdb_client_up.reset();
150
anatofuz
parents:
diff changeset
274 m_remote_signals_sp.reset();
anatofuz
parents:
diff changeset
275 return error;
anatofuz
parents:
diff changeset
276 }
anatofuz
parents:
diff changeset
277
anatofuz
parents:
diff changeset
278 const char *PlatformRemoteGDBServer::GetHostname() {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
279 if (m_gdb_client_up)
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
280 m_gdb_client_up->GetHostname(m_hostname);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
281 if (m_hostname.empty())
150
anatofuz
parents:
diff changeset
282 return nullptr;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
283 return m_hostname.c_str();
150
anatofuz
parents:
diff changeset
284 }
anatofuz
parents:
diff changeset
285
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
286 std::optional<std::string>
150
anatofuz
parents:
diff changeset
287 PlatformRemoteGDBServer::DoGetUserName(UserIDResolver::id_t uid) {
anatofuz
parents:
diff changeset
288 std::string name;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
289 if (m_gdb_client_up && m_gdb_client_up->GetUserName(uid, name))
150
anatofuz
parents:
diff changeset
290 return std::move(name);
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
291 return std::nullopt;
150
anatofuz
parents:
diff changeset
292 }
anatofuz
parents:
diff changeset
293
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
294 std::optional<std::string>
150
anatofuz
parents:
diff changeset
295 PlatformRemoteGDBServer::DoGetGroupName(UserIDResolver::id_t gid) {
anatofuz
parents:
diff changeset
296 std::string name;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
297 if (m_gdb_client_up && m_gdb_client_up->GetGroupName(gid, name))
150
anatofuz
parents:
diff changeset
298 return std::move(name);
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
299 return std::nullopt;
150
anatofuz
parents:
diff changeset
300 }
anatofuz
parents:
diff changeset
301
anatofuz
parents:
diff changeset
302 uint32_t PlatformRemoteGDBServer::FindProcesses(
anatofuz
parents:
diff changeset
303 const ProcessInstanceInfoMatch &match_info,
anatofuz
parents:
diff changeset
304 ProcessInstanceInfoList &process_infos) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
305 if (m_gdb_client_up)
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
306 return m_gdb_client_up->FindProcesses(match_info, process_infos);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
307 return 0;
150
anatofuz
parents:
diff changeset
308 }
anatofuz
parents:
diff changeset
309
anatofuz
parents:
diff changeset
310 bool PlatformRemoteGDBServer::GetProcessInfo(
anatofuz
parents:
diff changeset
311 lldb::pid_t pid, ProcessInstanceInfo &process_info) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
312 if (m_gdb_client_up)
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
313 return m_gdb_client_up->GetProcessInfo(pid, process_info);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
314 return false;
150
anatofuz
parents:
diff changeset
315 }
anatofuz
parents:
diff changeset
316
anatofuz
parents:
diff changeset
317 Status PlatformRemoteGDBServer::LaunchProcess(ProcessLaunchInfo &launch_info) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
318 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
319 Status error;
anatofuz
parents:
diff changeset
320
anatofuz
parents:
diff changeset
321 LLDB_LOGF(log, "PlatformRemoteGDBServer::%s() called", __FUNCTION__);
anatofuz
parents:
diff changeset
322
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
323 if (!IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
324 return Status("Not connected.");
150
anatofuz
parents:
diff changeset
325 auto num_file_actions = launch_info.GetNumFileActions();
anatofuz
parents:
diff changeset
326 for (decltype(num_file_actions) i = 0; i < num_file_actions; ++i) {
anatofuz
parents:
diff changeset
327 const auto file_action = launch_info.GetFileActionAtIndex(i);
anatofuz
parents:
diff changeset
328 if (file_action->GetAction() != FileAction::eFileActionOpen)
anatofuz
parents:
diff changeset
329 continue;
anatofuz
parents:
diff changeset
330 switch (file_action->GetFD()) {
anatofuz
parents:
diff changeset
331 case STDIN_FILENO:
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
332 m_gdb_client_up->SetSTDIN(file_action->GetFileSpec());
150
anatofuz
parents:
diff changeset
333 break;
anatofuz
parents:
diff changeset
334 case STDOUT_FILENO:
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
335 m_gdb_client_up->SetSTDOUT(file_action->GetFileSpec());
150
anatofuz
parents:
diff changeset
336 break;
anatofuz
parents:
diff changeset
337 case STDERR_FILENO:
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
338 m_gdb_client_up->SetSTDERR(file_action->GetFileSpec());
150
anatofuz
parents:
diff changeset
339 break;
anatofuz
parents:
diff changeset
340 }
anatofuz
parents:
diff changeset
341 }
anatofuz
parents:
diff changeset
342
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
343 m_gdb_client_up->SetDisableASLR(
150
anatofuz
parents:
diff changeset
344 launch_info.GetFlags().Test(eLaunchFlagDisableASLR));
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
345 m_gdb_client_up->SetDetachOnError(
150
anatofuz
parents:
diff changeset
346 launch_info.GetFlags().Test(eLaunchFlagDetachOnError));
anatofuz
parents:
diff changeset
347
anatofuz
parents:
diff changeset
348 FileSpec working_dir = launch_info.GetWorkingDirectory();
anatofuz
parents:
diff changeset
349 if (working_dir) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
350 m_gdb_client_up->SetWorkingDir(working_dir);
150
anatofuz
parents:
diff changeset
351 }
anatofuz
parents:
diff changeset
352
anatofuz
parents:
diff changeset
353 // Send the environment and the program + arguments after we connect
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
354 m_gdb_client_up->SendEnvironment(launch_info.GetEnvironment());
150
anatofuz
parents:
diff changeset
355
anatofuz
parents:
diff changeset
356 ArchSpec arch_spec = launch_info.GetArchitecture();
anatofuz
parents:
diff changeset
357 const char *arch_triple = arch_spec.GetTriple().str().c_str();
anatofuz
parents:
diff changeset
358
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
359 m_gdb_client_up->SendLaunchArchPacket(arch_triple);
150
anatofuz
parents:
diff changeset
360 LLDB_LOGF(
anatofuz
parents:
diff changeset
361 log,
anatofuz
parents:
diff changeset
362 "PlatformRemoteGDBServer::%s() set launch architecture triple to '%s'",
anatofuz
parents:
diff changeset
363 __FUNCTION__, arch_triple ? arch_triple : "<NULL>");
anatofuz
parents:
diff changeset
364
anatofuz
parents:
diff changeset
365 {
anatofuz
parents:
diff changeset
366 // Scope for the scoped timeout object
anatofuz
parents:
diff changeset
367 process_gdb_remote::GDBRemoteCommunication::ScopedTimeout timeout(
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
368 *m_gdb_client_up, std::chrono::seconds(5));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
369 // Since we can't send argv0 separate from the executable path, we need to
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
370 // make sure to use the actual executable path found in the launch_info...
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
371 Args args = launch_info.GetArguments();
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
372 if (FileSpec exe_file = launch_info.GetExecutableFile())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
373 args.ReplaceArgumentAtIndex(0, exe_file.GetPath(false));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
374 if (llvm::Error err = m_gdb_client_up->LaunchProcess(args)) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
375 error.SetErrorStringWithFormatv("Cannot launch '{0}': {1}",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
376 args.GetArgumentAtIndex(0),
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
377 llvm::fmt_consume(std::move(err)));
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
378 return error;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
379 }
150
anatofuz
parents:
diff changeset
380 }
anatofuz
parents:
diff changeset
381
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
382 const auto pid = m_gdb_client_up->GetCurrentProcessID(false);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
383 if (pid != LLDB_INVALID_PROCESS_ID) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
384 launch_info.SetProcessID(pid);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
385 LLDB_LOGF(log,
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
386 "PlatformRemoteGDBServer::%s() pid %" PRIu64
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
387 " launched successfully",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
388 __FUNCTION__, pid);
150
anatofuz
parents:
diff changeset
389 } else {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
390 LLDB_LOGF(log,
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
391 "PlatformRemoteGDBServer::%s() launch succeeded but we "
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
392 "didn't get a valid process id back!",
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
393 __FUNCTION__);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
394 error.SetErrorString("failed to get PID");
150
anatofuz
parents:
diff changeset
395 }
anatofuz
parents:
diff changeset
396 return error;
anatofuz
parents:
diff changeset
397 }
anatofuz
parents:
diff changeset
398
anatofuz
parents:
diff changeset
399 Status PlatformRemoteGDBServer::KillProcess(const lldb::pid_t pid) {
anatofuz
parents:
diff changeset
400 if (!KillSpawnedProcess(pid))
anatofuz
parents:
diff changeset
401 return Status("failed to kill remote spawned process");
anatofuz
parents:
diff changeset
402 return Status();
anatofuz
parents:
diff changeset
403 }
anatofuz
parents:
diff changeset
404
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
405 lldb::ProcessSP
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
406 PlatformRemoteGDBServer::DebugProcess(ProcessLaunchInfo &launch_info,
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
407 Debugger &debugger, Target &target,
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
408 Status &error) {
150
anatofuz
parents:
diff changeset
409 lldb::ProcessSP process_sp;
anatofuz
parents:
diff changeset
410 if (IsRemote()) {
anatofuz
parents:
diff changeset
411 if (IsConnected()) {
anatofuz
parents:
diff changeset
412 lldb::pid_t debugserver_pid = LLDB_INVALID_PROCESS_ID;
anatofuz
parents:
diff changeset
413 std::string connect_url;
anatofuz
parents:
diff changeset
414 if (!LaunchGDBServer(debugserver_pid, connect_url)) {
anatofuz
parents:
diff changeset
415 error.SetErrorStringWithFormat("unable to launch a GDB server on '%s'",
anatofuz
parents:
diff changeset
416 GetHostname());
anatofuz
parents:
diff changeset
417 } else {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
418 // The darwin always currently uses the GDB remote debugger plug-in
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
419 // so even when debugging locally we are debugging remotely!
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
420 process_sp = target.CreateProcess(launch_info.GetListener(),
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
421 "gdb-remote", nullptr, true);
150
anatofuz
parents:
diff changeset
422
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
423 if (process_sp) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
424 process_sp->HijackProcessEvents(launch_info.GetHijackListener());
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
425 process_sp->SetShadowListener(launch_info.GetShadowListener());
150
anatofuz
parents:
diff changeset
426
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
427 error = process_sp->ConnectRemote(connect_url.c_str());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
428 // Retry the connect remote one time...
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
429 if (error.Fail())
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
430 error = process_sp->ConnectRemote(connect_url.c_str());
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
431 if (error.Success())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
432 error = process_sp->Launch(launch_info);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
433 else if (debugserver_pid != LLDB_INVALID_PROCESS_ID) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
434 printf("error: connect remote failed (%s)\n", error.AsCString());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
435 KillSpawnedProcess(debugserver_pid);
150
anatofuz
parents:
diff changeset
436 }
anatofuz
parents:
diff changeset
437 }
anatofuz
parents:
diff changeset
438 }
anatofuz
parents:
diff changeset
439 } else {
anatofuz
parents:
diff changeset
440 error.SetErrorString("not connected to remote gdb server");
anatofuz
parents:
diff changeset
441 }
anatofuz
parents:
diff changeset
442 }
anatofuz
parents:
diff changeset
443 return process_sp;
anatofuz
parents:
diff changeset
444 }
anatofuz
parents:
diff changeset
445
anatofuz
parents:
diff changeset
446 bool PlatformRemoteGDBServer::LaunchGDBServer(lldb::pid_t &pid,
anatofuz
parents:
diff changeset
447 std::string &connect_url) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
448 assert(IsConnected());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
449
150
anatofuz
parents:
diff changeset
450 ArchSpec remote_arch = GetRemoteSystemArchitecture();
anatofuz
parents:
diff changeset
451 llvm::Triple &remote_triple = remote_arch.GetTriple();
anatofuz
parents:
diff changeset
452
anatofuz
parents:
diff changeset
453 uint16_t port = 0;
anatofuz
parents:
diff changeset
454 std::string socket_name;
anatofuz
parents:
diff changeset
455 bool launch_result = false;
anatofuz
parents:
diff changeset
456 if (remote_triple.getVendor() == llvm::Triple::Apple &&
anatofuz
parents:
diff changeset
457 remote_triple.getOS() == llvm::Triple::IOS) {
anatofuz
parents:
diff changeset
458 // When remote debugging to iOS, we use a USB mux that always talks to
anatofuz
parents:
diff changeset
459 // localhost, so we will need the remote debugserver to accept connections
anatofuz
parents:
diff changeset
460 // only from localhost, no matter what our current hostname is
anatofuz
parents:
diff changeset
461 launch_result =
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
462 m_gdb_client_up->LaunchGDBServer("127.0.0.1", pid, port, socket_name);
150
anatofuz
parents:
diff changeset
463 } else {
anatofuz
parents:
diff changeset
464 // All other hosts should use their actual hostname
anatofuz
parents:
diff changeset
465 launch_result =
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
466 m_gdb_client_up->LaunchGDBServer(nullptr, pid, port, socket_name);
150
anatofuz
parents:
diff changeset
467 }
anatofuz
parents:
diff changeset
468
anatofuz
parents:
diff changeset
469 if (!launch_result)
anatofuz
parents:
diff changeset
470 return false;
anatofuz
parents:
diff changeset
471
anatofuz
parents:
diff changeset
472 connect_url =
anatofuz
parents:
diff changeset
473 MakeGdbServerUrl(m_platform_scheme, m_platform_hostname, port,
anatofuz
parents:
diff changeset
474 (socket_name.empty()) ? nullptr : socket_name.c_str());
anatofuz
parents:
diff changeset
475 return true;
anatofuz
parents:
diff changeset
476 }
anatofuz
parents:
diff changeset
477
anatofuz
parents:
diff changeset
478 bool PlatformRemoteGDBServer::KillSpawnedProcess(lldb::pid_t pid) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
479 assert(IsConnected());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
480 return m_gdb_client_up->KillSpawnedProcess(pid);
150
anatofuz
parents:
diff changeset
481 }
anatofuz
parents:
diff changeset
482
anatofuz
parents:
diff changeset
483 lldb::ProcessSP PlatformRemoteGDBServer::Attach(
anatofuz
parents:
diff changeset
484 ProcessAttachInfo &attach_info, Debugger &debugger,
anatofuz
parents:
diff changeset
485 Target *target, // Can be NULL, if NULL create a new target, else use
anatofuz
parents:
diff changeset
486 // existing one
anatofuz
parents:
diff changeset
487 Status &error) {
anatofuz
parents:
diff changeset
488 lldb::ProcessSP process_sp;
anatofuz
parents:
diff changeset
489 if (IsRemote()) {
anatofuz
parents:
diff changeset
490 if (IsConnected()) {
anatofuz
parents:
diff changeset
491 lldb::pid_t debugserver_pid = LLDB_INVALID_PROCESS_ID;
anatofuz
parents:
diff changeset
492 std::string connect_url;
anatofuz
parents:
diff changeset
493 if (!LaunchGDBServer(debugserver_pid, connect_url)) {
anatofuz
parents:
diff changeset
494 error.SetErrorStringWithFormat("unable to launch a GDB server on '%s'",
anatofuz
parents:
diff changeset
495 GetHostname());
anatofuz
parents:
diff changeset
496 } else {
anatofuz
parents:
diff changeset
497 if (target == nullptr) {
anatofuz
parents:
diff changeset
498 TargetSP new_target_sp;
anatofuz
parents:
diff changeset
499
anatofuz
parents:
diff changeset
500 error = debugger.GetTargetList().CreateTarget(
anatofuz
parents:
diff changeset
501 debugger, "", "", eLoadDependentsNo, nullptr, new_target_sp);
anatofuz
parents:
diff changeset
502 target = new_target_sp.get();
anatofuz
parents:
diff changeset
503 } else
anatofuz
parents:
diff changeset
504 error.Clear();
anatofuz
parents:
diff changeset
505
anatofuz
parents:
diff changeset
506 if (target && error.Success()) {
anatofuz
parents:
diff changeset
507 // The darwin always currently uses the GDB remote debugger plug-in
anatofuz
parents:
diff changeset
508 // so even when debugging locally we are debugging remotely!
anatofuz
parents:
diff changeset
509 process_sp =
anatofuz
parents:
diff changeset
510 target->CreateProcess(attach_info.GetListenerForProcess(debugger),
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
511 "gdb-remote", nullptr, true);
150
anatofuz
parents:
diff changeset
512 if (process_sp) {
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
513 error = process_sp->ConnectRemote(connect_url.c_str());
150
anatofuz
parents:
diff changeset
514 if (error.Success()) {
anatofuz
parents:
diff changeset
515 ListenerSP listener_sp = attach_info.GetHijackListener();
anatofuz
parents:
diff changeset
516 if (listener_sp)
anatofuz
parents:
diff changeset
517 process_sp->HijackProcessEvents(listener_sp);
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
518 process_sp->SetShadowListener(attach_info.GetShadowListener());
150
anatofuz
parents:
diff changeset
519 error = process_sp->Attach(attach_info);
anatofuz
parents:
diff changeset
520 }
anatofuz
parents:
diff changeset
521
anatofuz
parents:
diff changeset
522 if (error.Fail() && debugserver_pid != LLDB_INVALID_PROCESS_ID) {
anatofuz
parents:
diff changeset
523 KillSpawnedProcess(debugserver_pid);
anatofuz
parents:
diff changeset
524 }
anatofuz
parents:
diff changeset
525 }
anatofuz
parents:
diff changeset
526 }
anatofuz
parents:
diff changeset
527 }
anatofuz
parents:
diff changeset
528 } else {
anatofuz
parents:
diff changeset
529 error.SetErrorString("not connected to remote gdb server");
anatofuz
parents:
diff changeset
530 }
anatofuz
parents:
diff changeset
531 }
anatofuz
parents:
diff changeset
532 return process_sp;
anatofuz
parents:
diff changeset
533 }
anatofuz
parents:
diff changeset
534
anatofuz
parents:
diff changeset
535 Status PlatformRemoteGDBServer::MakeDirectory(const FileSpec &file_spec,
anatofuz
parents:
diff changeset
536 uint32_t mode) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
537 if (!IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
538 return Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
539 Status error = m_gdb_client_up->MakeDirectory(file_spec, mode);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
540 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
541 LLDB_LOGF(log,
anatofuz
parents:
diff changeset
542 "PlatformRemoteGDBServer::MakeDirectory(path='%s', mode=%o) "
anatofuz
parents:
diff changeset
543 "error = %u (%s)",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
544 file_spec.GetPath().c_str(), mode, error.GetError(),
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
545 error.AsCString());
150
anatofuz
parents:
diff changeset
546 return error;
anatofuz
parents:
diff changeset
547 }
anatofuz
parents:
diff changeset
548
anatofuz
parents:
diff changeset
549 Status PlatformRemoteGDBServer::GetFilePermissions(const FileSpec &file_spec,
anatofuz
parents:
diff changeset
550 uint32_t &file_permissions) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
551 if (!IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
552 return Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
553 Status error =
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
554 m_gdb_client_up->GetFilePermissions(file_spec, file_permissions);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
555 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
556 LLDB_LOGF(log,
anatofuz
parents:
diff changeset
557 "PlatformRemoteGDBServer::GetFilePermissions(path='%s', "
anatofuz
parents:
diff changeset
558 "file_permissions=%o) error = %u (%s)",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
559 file_spec.GetPath().c_str(), file_permissions, error.GetError(),
150
anatofuz
parents:
diff changeset
560 error.AsCString());
anatofuz
parents:
diff changeset
561 return error;
anatofuz
parents:
diff changeset
562 }
anatofuz
parents:
diff changeset
563
anatofuz
parents:
diff changeset
564 Status PlatformRemoteGDBServer::SetFilePermissions(const FileSpec &file_spec,
anatofuz
parents:
diff changeset
565 uint32_t file_permissions) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
566 if (!IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
567 return Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
568 Status error =
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
569 m_gdb_client_up->SetFilePermissions(file_spec, file_permissions);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
570 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
571 LLDB_LOGF(log,
anatofuz
parents:
diff changeset
572 "PlatformRemoteGDBServer::SetFilePermissions(path='%s', "
anatofuz
parents:
diff changeset
573 "file_permissions=%o) error = %u (%s)",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
574 file_spec.GetPath().c_str(), file_permissions, error.GetError(),
150
anatofuz
parents:
diff changeset
575 error.AsCString());
anatofuz
parents:
diff changeset
576 return error;
anatofuz
parents:
diff changeset
577 }
anatofuz
parents:
diff changeset
578
anatofuz
parents:
diff changeset
579 lldb::user_id_t PlatformRemoteGDBServer::OpenFile(const FileSpec &file_spec,
anatofuz
parents:
diff changeset
580 File::OpenOptions flags,
anatofuz
parents:
diff changeset
581 uint32_t mode,
anatofuz
parents:
diff changeset
582 Status &error) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
583 if (IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
584 return m_gdb_client_up->OpenFile(file_spec, flags, mode, error);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
585 return LLDB_INVALID_UID;
150
anatofuz
parents:
diff changeset
586 }
anatofuz
parents:
diff changeset
587
anatofuz
parents:
diff changeset
588 bool PlatformRemoteGDBServer::CloseFile(lldb::user_id_t fd, Status &error) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
589 if (IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
590 return m_gdb_client_up->CloseFile(fd, error);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
591 error = Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
592 return false;
150
anatofuz
parents:
diff changeset
593 }
anatofuz
parents:
diff changeset
594
anatofuz
parents:
diff changeset
595 lldb::user_id_t
anatofuz
parents:
diff changeset
596 PlatformRemoteGDBServer::GetFileSize(const FileSpec &file_spec) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
597 if (IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
598 return m_gdb_client_up->GetFileSize(file_spec);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
599 return LLDB_INVALID_UID;
150
anatofuz
parents:
diff changeset
600 }
anatofuz
parents:
diff changeset
601
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
602 void PlatformRemoteGDBServer::AutoCompleteDiskFileOrDirectory(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
603 CompletionRequest &request, bool only_dir) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
604 if (IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
605 m_gdb_client_up->AutoCompleteDiskFileOrDirectory(request, only_dir);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
606 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
607
150
anatofuz
parents:
diff changeset
608 uint64_t PlatformRemoteGDBServer::ReadFile(lldb::user_id_t fd, uint64_t offset,
anatofuz
parents:
diff changeset
609 void *dst, uint64_t dst_len,
anatofuz
parents:
diff changeset
610 Status &error) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
611 if (IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
612 return m_gdb_client_up->ReadFile(fd, offset, dst, dst_len, error);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
613 error = Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
614 return 0;
150
anatofuz
parents:
diff changeset
615 }
anatofuz
parents:
diff changeset
616
anatofuz
parents:
diff changeset
617 uint64_t PlatformRemoteGDBServer::WriteFile(lldb::user_id_t fd, uint64_t offset,
anatofuz
parents:
diff changeset
618 const void *src, uint64_t src_len,
anatofuz
parents:
diff changeset
619 Status &error) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
620 if (IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
621 return m_gdb_client_up->WriteFile(fd, offset, src, src_len, error);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
622 error = Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
623 return 0;
150
anatofuz
parents:
diff changeset
624 }
anatofuz
parents:
diff changeset
625
anatofuz
parents:
diff changeset
626 Status PlatformRemoteGDBServer::PutFile(const FileSpec &source,
anatofuz
parents:
diff changeset
627 const FileSpec &destination,
anatofuz
parents:
diff changeset
628 uint32_t uid, uint32_t gid) {
anatofuz
parents:
diff changeset
629 return Platform::PutFile(source, destination, uid, gid);
anatofuz
parents:
diff changeset
630 }
anatofuz
parents:
diff changeset
631
anatofuz
parents:
diff changeset
632 Status PlatformRemoteGDBServer::CreateSymlink(
anatofuz
parents:
diff changeset
633 const FileSpec &src, // The name of the link is in src
anatofuz
parents:
diff changeset
634 const FileSpec &dst) // The symlink points to dst
anatofuz
parents:
diff changeset
635 {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
636 if (!IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
637 return Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
638 Status error = m_gdb_client_up->CreateSymlink(src, dst);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
639 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
640 LLDB_LOGF(log,
anatofuz
parents:
diff changeset
641 "PlatformRemoteGDBServer::CreateSymlink(src='%s', dst='%s') "
anatofuz
parents:
diff changeset
642 "error = %u (%s)",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
643 src.GetPath().c_str(), dst.GetPath().c_str(), error.GetError(),
150
anatofuz
parents:
diff changeset
644 error.AsCString());
anatofuz
parents:
diff changeset
645 return error;
anatofuz
parents:
diff changeset
646 }
anatofuz
parents:
diff changeset
647
anatofuz
parents:
diff changeset
648 Status PlatformRemoteGDBServer::Unlink(const FileSpec &file_spec) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
649 if (!IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
650 return Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
651 Status error = m_gdb_client_up->Unlink(file_spec);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
652 Log *log = GetLog(LLDBLog::Platform);
150
anatofuz
parents:
diff changeset
653 LLDB_LOGF(log, "PlatformRemoteGDBServer::Unlink(path='%s') error = %u (%s)",
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
654 file_spec.GetPath().c_str(), error.GetError(), error.AsCString());
150
anatofuz
parents:
diff changeset
655 return error;
anatofuz
parents:
diff changeset
656 }
anatofuz
parents:
diff changeset
657
anatofuz
parents:
diff changeset
658 bool PlatformRemoteGDBServer::GetFileExists(const FileSpec &file_spec) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
659 if (IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
660 return m_gdb_client_up->GetFileExists(file_spec);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
661 return false;
150
anatofuz
parents:
diff changeset
662 }
anatofuz
parents:
diff changeset
663
anatofuz
parents:
diff changeset
664 Status PlatformRemoteGDBServer::RunShellCommand(
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
665 llvm::StringRef shell, llvm::StringRef command,
150
anatofuz
parents:
diff changeset
666 const FileSpec &
anatofuz
parents:
diff changeset
667 working_dir, // Pass empty FileSpec to use the current working directory
anatofuz
parents:
diff changeset
668 int *status_ptr, // Pass NULL if you don't want the process exit status
anatofuz
parents:
diff changeset
669 int *signo_ptr, // Pass NULL if you don't want the signal that caused the
anatofuz
parents:
diff changeset
670 // process to exit
anatofuz
parents:
diff changeset
671 std::string
anatofuz
parents:
diff changeset
672 *command_output, // Pass NULL if you don't want the command output
anatofuz
parents:
diff changeset
673 const Timeout<std::micro> &timeout) {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
674 if (!IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
675 return Status("Not connected.");
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
676 return m_gdb_client_up->RunShellCommand(command, working_dir, status_ptr,
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
677 signo_ptr, command_output, timeout);
150
anatofuz
parents:
diff changeset
678 }
anatofuz
parents:
diff changeset
679
anatofuz
parents:
diff changeset
680 void PlatformRemoteGDBServer::CalculateTrapHandlerSymbolNames() {
anatofuz
parents:
diff changeset
681 m_trap_handlers.push_back(ConstString("_sigtramp"));
anatofuz
parents:
diff changeset
682 }
anatofuz
parents:
diff changeset
683
anatofuz
parents:
diff changeset
684 const UnixSignalsSP &PlatformRemoteGDBServer::GetRemoteUnixSignals() {
anatofuz
parents:
diff changeset
685 if (!IsConnected())
anatofuz
parents:
diff changeset
686 return Platform::GetRemoteUnixSignals();
anatofuz
parents:
diff changeset
687
anatofuz
parents:
diff changeset
688 if (m_remote_signals_sp)
anatofuz
parents:
diff changeset
689 return m_remote_signals_sp;
anatofuz
parents:
diff changeset
690
anatofuz
parents:
diff changeset
691 // If packet not implemented or JSON failed to parse, we'll guess the signal
anatofuz
parents:
diff changeset
692 // set based on the remote architecture.
anatofuz
parents:
diff changeset
693 m_remote_signals_sp = UnixSignals::Create(GetRemoteSystemArchitecture());
anatofuz
parents:
diff changeset
694
anatofuz
parents:
diff changeset
695 StringExtractorGDBRemote response;
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
696 auto result =
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
697 m_gdb_client_up->SendPacketAndWaitForResponse("jSignalsInfo", response);
150
anatofuz
parents:
diff changeset
698
anatofuz
parents:
diff changeset
699 if (result != decltype(result)::Success ||
anatofuz
parents:
diff changeset
700 response.GetResponseType() != response.eResponse)
anatofuz
parents:
diff changeset
701 return m_remote_signals_sp;
anatofuz
parents:
diff changeset
702
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
703 auto object_sp = StructuredData::ParseJSON(response.GetStringRef());
150
anatofuz
parents:
diff changeset
704 if (!object_sp || !object_sp->IsValid())
anatofuz
parents:
diff changeset
705 return m_remote_signals_sp;
anatofuz
parents:
diff changeset
706
anatofuz
parents:
diff changeset
707 auto array_sp = object_sp->GetAsArray();
anatofuz
parents:
diff changeset
708 if (!array_sp || !array_sp->IsValid())
anatofuz
parents:
diff changeset
709 return m_remote_signals_sp;
anatofuz
parents:
diff changeset
710
anatofuz
parents:
diff changeset
711 auto remote_signals_sp = std::make_shared<lldb_private::GDBRemoteSignals>();
anatofuz
parents:
diff changeset
712
anatofuz
parents:
diff changeset
713 bool done = array_sp->ForEach(
anatofuz
parents:
diff changeset
714 [&remote_signals_sp](StructuredData::Object *object) -> bool {
anatofuz
parents:
diff changeset
715 if (!object || !object->IsValid())
anatofuz
parents:
diff changeset
716 return false;
anatofuz
parents:
diff changeset
717
anatofuz
parents:
diff changeset
718 auto dict = object->GetAsDictionary();
anatofuz
parents:
diff changeset
719 if (!dict || !dict->IsValid())
anatofuz
parents:
diff changeset
720 return false;
anatofuz
parents:
diff changeset
721
anatofuz
parents:
diff changeset
722 // Signal number and signal name are required.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
723 uint64_t signo;
150
anatofuz
parents:
diff changeset
724 if (!dict->GetValueForKeyAsInteger("signo", signo))
anatofuz
parents:
diff changeset
725 return false;
anatofuz
parents:
diff changeset
726
anatofuz
parents:
diff changeset
727 llvm::StringRef name;
anatofuz
parents:
diff changeset
728 if (!dict->GetValueForKeyAsString("name", name))
anatofuz
parents:
diff changeset
729 return false;
anatofuz
parents:
diff changeset
730
anatofuz
parents:
diff changeset
731 // We can live without short_name, description, etc.
anatofuz
parents:
diff changeset
732 bool suppress{false};
anatofuz
parents:
diff changeset
733 auto object_sp = dict->GetValueForKey("suppress");
anatofuz
parents:
diff changeset
734 if (object_sp && object_sp->IsValid())
anatofuz
parents:
diff changeset
735 suppress = object_sp->GetBooleanValue();
anatofuz
parents:
diff changeset
736
anatofuz
parents:
diff changeset
737 bool stop{false};
anatofuz
parents:
diff changeset
738 object_sp = dict->GetValueForKey("stop");
anatofuz
parents:
diff changeset
739 if (object_sp && object_sp->IsValid())
anatofuz
parents:
diff changeset
740 stop = object_sp->GetBooleanValue();
anatofuz
parents:
diff changeset
741
anatofuz
parents:
diff changeset
742 bool notify{false};
anatofuz
parents:
diff changeset
743 object_sp = dict->GetValueForKey("notify");
anatofuz
parents:
diff changeset
744 if (object_sp && object_sp->IsValid())
anatofuz
parents:
diff changeset
745 notify = object_sp->GetBooleanValue();
anatofuz
parents:
diff changeset
746
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
747 std::string description;
150
anatofuz
parents:
diff changeset
748 object_sp = dict->GetValueForKey("description");
anatofuz
parents:
diff changeset
749 if (object_sp && object_sp->IsValid())
anatofuz
parents:
diff changeset
750 description = std::string(object_sp->GetStringValue());
anatofuz
parents:
diff changeset
751
anatofuz
parents:
diff changeset
752 remote_signals_sp->AddSignal(signo, name.str().c_str(), suppress, stop,
anatofuz
parents:
diff changeset
753 notify, description.c_str());
anatofuz
parents:
diff changeset
754 return true;
anatofuz
parents:
diff changeset
755 });
anatofuz
parents:
diff changeset
756
anatofuz
parents:
diff changeset
757 if (done)
anatofuz
parents:
diff changeset
758 m_remote_signals_sp = std::move(remote_signals_sp);
anatofuz
parents:
diff changeset
759
anatofuz
parents:
diff changeset
760 return m_remote_signals_sp;
anatofuz
parents:
diff changeset
761 }
anatofuz
parents:
diff changeset
762
anatofuz
parents:
diff changeset
763 std::string PlatformRemoteGDBServer::MakeGdbServerUrl(
anatofuz
parents:
diff changeset
764 const std::string &platform_scheme, const std::string &platform_hostname,
anatofuz
parents:
diff changeset
765 uint16_t port, const char *socket_name) {
anatofuz
parents:
diff changeset
766 const char *override_scheme =
anatofuz
parents:
diff changeset
767 getenv("LLDB_PLATFORM_REMOTE_GDB_SERVER_SCHEME");
anatofuz
parents:
diff changeset
768 const char *override_hostname =
anatofuz
parents:
diff changeset
769 getenv("LLDB_PLATFORM_REMOTE_GDB_SERVER_HOSTNAME");
anatofuz
parents:
diff changeset
770 const char *port_offset_c_str =
anatofuz
parents:
diff changeset
771 getenv("LLDB_PLATFORM_REMOTE_GDB_SERVER_PORT_OFFSET");
anatofuz
parents:
diff changeset
772 int port_offset = port_offset_c_str ? ::atoi(port_offset_c_str) : 0;
anatofuz
parents:
diff changeset
773
anatofuz
parents:
diff changeset
774 return MakeUrl(override_scheme ? override_scheme : platform_scheme.c_str(),
anatofuz
parents:
diff changeset
775 override_hostname ? override_hostname
anatofuz
parents:
diff changeset
776 : platform_hostname.c_str(),
anatofuz
parents:
diff changeset
777 port + port_offset, socket_name);
anatofuz
parents:
diff changeset
778 }
anatofuz
parents:
diff changeset
779
anatofuz
parents:
diff changeset
780 std::string PlatformRemoteGDBServer::MakeUrl(const char *scheme,
anatofuz
parents:
diff changeset
781 const char *hostname,
anatofuz
parents:
diff changeset
782 uint16_t port, const char *path) {
anatofuz
parents:
diff changeset
783 StreamString result;
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
784 result.Printf("%s://[%s]", scheme, hostname);
150
anatofuz
parents:
diff changeset
785 if (port != 0)
anatofuz
parents:
diff changeset
786 result.Printf(":%u", port);
anatofuz
parents:
diff changeset
787 if (path)
anatofuz
parents:
diff changeset
788 result.Write(path, strlen(path));
anatofuz
parents:
diff changeset
789 return std::string(result.GetString());
anatofuz
parents:
diff changeset
790 }
anatofuz
parents:
diff changeset
791
anatofuz
parents:
diff changeset
792 size_t PlatformRemoteGDBServer::ConnectToWaitingProcesses(Debugger &debugger,
anatofuz
parents:
diff changeset
793 Status &error) {
anatofuz
parents:
diff changeset
794 std::vector<std::string> connection_urls;
anatofuz
parents:
diff changeset
795 GetPendingGdbServerList(connection_urls);
anatofuz
parents:
diff changeset
796
anatofuz
parents:
diff changeset
797 for (size_t i = 0; i < connection_urls.size(); ++i) {
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
798 ConnectProcess(connection_urls[i].c_str(), "gdb-remote", debugger, nullptr, error);
150
anatofuz
parents:
diff changeset
799 if (error.Fail())
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
800 return i; // We already connected to i process successfully
150
anatofuz
parents:
diff changeset
801 }
anatofuz
parents:
diff changeset
802 return connection_urls.size();
anatofuz
parents:
diff changeset
803 }
anatofuz
parents:
diff changeset
804
anatofuz
parents:
diff changeset
805 size_t PlatformRemoteGDBServer::GetPendingGdbServerList(
anatofuz
parents:
diff changeset
806 std::vector<std::string> &connection_urls) {
anatofuz
parents:
diff changeset
807 std::vector<std::pair<uint16_t, std::string>> remote_servers;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
808 if (!IsConnected())
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
809 return 0;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
810 m_gdb_client_up->QueryGDBServer(remote_servers);
150
anatofuz
parents:
diff changeset
811 for (const auto &gdbserver : remote_servers) {
anatofuz
parents:
diff changeset
812 const char *socket_name_cstr =
anatofuz
parents:
diff changeset
813 gdbserver.second.empty() ? nullptr : gdbserver.second.c_str();
anatofuz
parents:
diff changeset
814 connection_urls.emplace_back(
anatofuz
parents:
diff changeset
815 MakeGdbServerUrl(m_platform_scheme, m_platform_hostname,
anatofuz
parents:
diff changeset
816 gdbserver.first, socket_name_cstr));
anatofuz
parents:
diff changeset
817 }
anatofuz
parents:
diff changeset
818 return connection_urls.size();
anatofuz
parents:
diff changeset
819 }