LLDB mainline
ProcessGDBRemote.cpp
Go to the documentation of this file.
1//===-- ProcessGDBRemote.cpp ----------------------------------------------===//
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#include "lldb/Host/Config.h"
10
11#include <cerrno>
12#include <cstdlib>
13#if LLDB_ENABLE_POSIX
14#include <netinet/in.h>
15#include <sys/mman.h>
16#include <sys/socket.h>
17#include <unistd.h>
18#endif
19#include <sys/stat.h>
20#if defined(__APPLE__)
21#include <sys/sysctl.h>
22#endif
23#include <ctime>
24#include <sys/types.h>
25
29#include "lldb/Core/Debugger.h"
30#include "lldb/Core/Module.h"
33#include "lldb/Core/Value.h"
38#include "lldb/Host/PosixApi.h"
42#include "lldb/Host/XML.h"
54#include "lldb/Target/ABI.h"
59#include "lldb/Target/Target.h"
62#include "lldb/Utility/Args.h"
65#include "lldb/Utility/State.h"
67#include "lldb/Utility/Timer.h"
68#include <algorithm>
69#include <csignal>
70#include <map>
71#include <memory>
72#include <mutex>
73#include <optional>
74#include <sstream>
75#include <thread>
76
82#include "ProcessGDBRemote.h"
83#include "ProcessGDBRemoteLog.h"
84#include "ThreadGDBRemote.h"
85#include "lldb/Host/Host.h"
87
88#include "llvm/ADT/ScopeExit.h"
89#include "llvm/ADT/StringMap.h"
90#include "llvm/ADT/StringSwitch.h"
91#include "llvm/Support/FormatAdapters.h"
92#include "llvm/Support/Threading.h"
93#include "llvm/Support/raw_ostream.h"
94
95#define DEBUGSERVER_BASENAME "debugserver"
96using namespace lldb;
97using namespace lldb_private;
99
101
102namespace lldb {
103// Provide a function that can easily dump the packet history if we know a
104// ProcessGDBRemote * value (which we can get from logs or from debugging). We
105// need the function in the lldb namespace so it makes it into the final
106// executable since the LLDB shared library only exports stuff in the lldb
107// namespace. This allows you to attach with a debugger and call this function
108// and get the packet history dumped to a file.
109void DumpProcessGDBRemotePacketHistory(void *p, const char *path) {
110 auto file = FileSystem::Instance().Open(
112 if (!file) {
113 llvm::consumeError(file.takeError());
114 return;
115 }
116 StreamFile stream(std::move(file.get()));
117 ((Process *)p)->DumpPluginHistory(stream);
118}
119} // namespace lldb
120
121namespace {
122
123#define LLDB_PROPERTIES_processgdbremote
124#include "ProcessGDBRemoteProperties.inc"
125
126enum {
127#define LLDB_PROPERTIES_processgdbremote
128#include "ProcessGDBRemotePropertiesEnum.inc"
129};
130
131class PluginProperties : public Properties {
132public:
133 static llvm::StringRef GetSettingName() {
135 }
136
137 PluginProperties() : Properties() {
138 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
139 m_collection_sp->Initialize(g_processgdbremote_properties);
140 }
141
142 ~PluginProperties() override = default;
143
144 uint64_t GetPacketTimeout() {
145 const uint32_t idx = ePropertyPacketTimeout;
146 return GetPropertyAtIndexAs<uint64_t>(
147 idx, g_processgdbremote_properties[idx].default_uint_value);
148 }
149
150 bool SetPacketTimeout(uint64_t timeout) {
151 const uint32_t idx = ePropertyPacketTimeout;
152 return SetPropertyAtIndex(idx, timeout);
153 }
154
155 FileSpec GetTargetDefinitionFile() const {
156 const uint32_t idx = ePropertyTargetDefinitionFile;
157 return GetPropertyAtIndexAs<FileSpec>(idx, {});
158 }
159
160 bool GetUseSVR4() const {
161 const uint32_t idx = ePropertyUseSVR4;
162 return GetPropertyAtIndexAs<bool>(
163 idx, g_processgdbremote_properties[idx].default_uint_value != 0);
164 }
165
166 bool GetUseGPacketForReading() const {
167 const uint32_t idx = ePropertyUseGPacketForReading;
168 return GetPropertyAtIndexAs<bool>(idx, true);
169 }
170};
171
172} // namespace
173
174static PluginProperties &GetGlobalPluginProperties() {
175 static PluginProperties g_settings;
176 return g_settings;
177}
178
179// TODO Randomly assigning a port is unsafe. We should get an unused
180// ephemeral port from the kernel and make sure we reserve it before passing it
181// to debugserver.
182
183#if defined(__APPLE__)
184#define LOW_PORT (IPPORT_RESERVED)
185#define HIGH_PORT (IPPORT_HIFIRSTAUTO)
186#else
187#define LOW_PORT (1024u)
188#define HIGH_PORT (49151u)
189#endif
190
192 return "GDB Remote protocol based debugging plug-in.";
193}
194
197}
198
200 lldb::TargetSP target_sp, ListenerSP listener_sp,
201 const FileSpec *crash_file_path, bool can_connect) {
202 lldb::ProcessSP process_sp;
203 if (crash_file_path == nullptr)
204 process_sp = std::shared_ptr<ProcessGDBRemote>(
205 new ProcessGDBRemote(target_sp, listener_sp));
206 return process_sp;
207}
208
211 gdb_comm.DumpHistory(s);
212}
213
215 return std::chrono::seconds(GetGlobalPluginProperties().GetPacketTimeout());
216}
217
220}
221
223 bool plugin_specified_by_name) {
224 if (plugin_specified_by_name)
225 return true;
226
227 // For now we are just making sure the file exists for a given module
228 Module *exe_module = target_sp->GetExecutableModulePointer();
229 if (exe_module) {
230 ObjectFile *exe_objfile = exe_module->GetObjectFile();
231 // We can't debug core files...
232 switch (exe_objfile->GetType()) {
240 return false;
244 break;
245 }
246 return FileSystem::Instance().Exists(exe_module->GetFileSpec());
247 }
248 // However, if there is no executable module, we return true since we might
249 // be preparing to attach.
250 return true;
251}
252
253// ProcessGDBRemote constructor
255 ListenerSP listener_sp)
256 : Process(target_sp, listener_sp),
257 m_debugserver_pid(LLDB_INVALID_PROCESS_ID), m_register_info_sp(nullptr),
258 m_async_broadcaster(nullptr, "lldb.process.gdb-remote.async-broadcaster"),
259 m_async_listener_sp(
260 Listener::MakeListener("lldb.process.gdb-remote.async-listener")),
261 m_async_thread_state_mutex(), m_thread_ids(), m_thread_pcs(),
262 m_jstopinfo_sp(), m_jthreadsinfo_sp(), m_continue_c_tids(),
263 m_continue_C_tids(), m_continue_s_tids(), m_continue_S_tids(),
264 m_max_memory_size(0), m_remote_stub_max_memory_size(0),
265 m_addr_to_mmap_size(), m_thread_create_bp_sp(),
266 m_waiting_for_attach(false), m_command_sp(), m_breakpoint_pc_offset(0),
267 m_initial_tid(LLDB_INVALID_THREAD_ID), m_allow_flash_writes(false),
268 m_erased_flash_ranges(), m_vfork_in_progress_count(0) {
270 "async thread should exit");
272 "async thread continue");
274 "async thread did exit");
275
276 Log *log = GetLog(GDBRLog::Async);
277
278 const uint32_t async_event_mask =
280
281 if (m_async_listener_sp->StartListeningForEvents(
282 &m_async_broadcaster, async_event_mask) != async_event_mask) {
283 LLDB_LOGF(log,
284 "ProcessGDBRemote::%s failed to listen for "
285 "m_async_broadcaster events",
286 __FUNCTION__);
287 }
288
289 const uint64_t timeout_seconds =
290 GetGlobalPluginProperties().GetPacketTimeout();
291 if (timeout_seconds > 0)
292 m_gdb_comm.SetPacketTimeout(std::chrono::seconds(timeout_seconds));
293
295 GetGlobalPluginProperties().GetUseGPacketForReading();
296}
297
298// Destructor
300 // m_mach_process.UnregisterNotificationCallbacks (this);
301 Clear();
302 // We need to call finalize on the process before destroying ourselves to
303 // make sure all of the broadcaster cleanup goes as planned. If we destruct
304 // this class, then Process::~Process() might have problems trying to fully
305 // destroy the broadcaster.
306 Finalize(true /* destructing */);
307
308 // The general Finalize is going to try to destroy the process and that
309 // SHOULD shut down the async thread. However, if we don't kill it it will
310 // get stranded and its connection will go away so when it wakes up it will
311 // crash. So kill it for sure here.
314}
315
317 const FileSpec &target_definition_fspec) {
318 ScriptInterpreter *interpreter =
321 StructuredData::ObjectSP module_object_sp(
322 interpreter->LoadPluginModule(target_definition_fspec, error));
323 if (module_object_sp) {
324 StructuredData::DictionarySP target_definition_sp(
325 interpreter->GetDynamicSettings(module_object_sp, &GetTarget(),
326 "gdb-server-target-definition", error));
327
328 if (target_definition_sp) {
329 StructuredData::ObjectSP target_object(
330 target_definition_sp->GetValueForKey("host-info"));
331 if (target_object) {
332 if (auto host_info_dict = target_object->GetAsDictionary()) {
333 StructuredData::ObjectSP triple_value =
334 host_info_dict->GetValueForKey("triple");
335 if (auto triple_string_value = triple_value->GetAsString()) {
336 std::string triple_string =
337 std::string(triple_string_value->GetValue());
338 ArchSpec host_arch(triple_string.c_str());
339 if (!host_arch.IsCompatibleMatch(GetTarget().GetArchitecture())) {
340 GetTarget().SetArchitecture(host_arch);
341 }
342 }
343 }
344 }
346 StructuredData::ObjectSP breakpoint_pc_offset_value =
347 target_definition_sp->GetValueForKey("breakpoint-pc-offset");
348 if (breakpoint_pc_offset_value) {
349 if (auto breakpoint_pc_int_value =
350 breakpoint_pc_offset_value->GetAsSignedInteger())
351 m_breakpoint_pc_offset = breakpoint_pc_int_value->GetValue();
352 }
353
354 if (m_register_info_sp->SetRegisterInfo(
355 *target_definition_sp, GetTarget().GetArchitecture()) > 0) {
356 return true;
357 }
358 }
359 }
360 return false;
361}
362
364 const llvm::StringRef &comma_separated_register_numbers,
365 std::vector<uint32_t> &regnums, int base) {
366 regnums.clear();
367 for (llvm::StringRef x : llvm::split(comma_separated_register_numbers, ',')) {
368 uint32_t reg;
369 if (llvm::to_integer(x, reg, base))
370 regnums.push_back(reg);
371 }
372 return regnums.size();
373}
374
376 if (!force && m_register_info_sp)
377 return;
378
379 m_register_info_sp = std::make_shared<GDBRemoteDynamicRegisterInfo>();
380
381 // Check if qHostInfo specified a specific packet timeout for this
382 // connection. If so then lets update our setting so the user knows what the
383 // timeout is and can see it.
384 const auto host_packet_timeout = m_gdb_comm.GetHostDefaultPacketTimeout();
385 if (host_packet_timeout > std::chrono::seconds(0)) {
386 GetGlobalPluginProperties().SetPacketTimeout(host_packet_timeout.count());
387 }
388
389 // Register info search order:
390 // 1 - Use the target definition python file if one is specified.
391 // 2 - If the target definition doesn't have any of the info from the
392 // target.xml (registers) then proceed to read the target.xml.
393 // 3 - Fall back on the qRegisterInfo packets.
394 // 4 - Use hardcoded defaults if available.
395
396 FileSpec target_definition_fspec =
397 GetGlobalPluginProperties().GetTargetDefinitionFile();
398 if (!FileSystem::Instance().Exists(target_definition_fspec)) {
399 // If the filename doesn't exist, it may be a ~ not having been expanded -
400 // try to resolve it.
401 FileSystem::Instance().Resolve(target_definition_fspec);
402 }
403 if (target_definition_fspec) {
404 // See if we can get register definitions from a python file
405 if (ParsePythonTargetDefinition(target_definition_fspec))
406 return;
407
408 Debugger::ReportError("target description file " +
409 target_definition_fspec.GetPath() +
410 " failed to parse",
411 GetTarget().GetDebugger().GetID());
412 }
413
414 const ArchSpec &target_arch = GetTarget().GetArchitecture();
415 const ArchSpec &remote_host_arch = m_gdb_comm.GetHostArchitecture();
416 const ArchSpec &remote_process_arch = m_gdb_comm.GetProcessArchitecture();
417
418 // Use the process' architecture instead of the host arch, if available
419 ArchSpec arch_to_use;
420 if (remote_process_arch.IsValid())
421 arch_to_use = remote_process_arch;
422 else
423 arch_to_use = remote_host_arch;
424
425 if (!arch_to_use.IsValid())
426 arch_to_use = target_arch;
427
428 if (GetGDBServerRegisterInfo(arch_to_use))
429 return;
430
431 char packet[128];
432 std::vector<DynamicRegisterInfo::Register> registers;
433 uint32_t reg_num = 0;
434 for (StringExtractorGDBRemote::ResponseType response_type =
436 response_type == StringExtractorGDBRemote::eResponse; ++reg_num) {
437 const int packet_len =
438 ::snprintf(packet, sizeof(packet), "qRegisterInfo%x", reg_num);
439 assert(packet_len < (int)sizeof(packet));
440 UNUSED_IF_ASSERT_DISABLED(packet_len);
442 if (m_gdb_comm.SendPacketAndWaitForResponse(packet, response) ==
444 response_type = response.GetResponseType();
445 if (response_type == StringExtractorGDBRemote::eResponse) {
446 llvm::StringRef name;
447 llvm::StringRef value;
449
450 while (response.GetNameColonValue(name, value)) {
451 if (name == "name") {
452 reg_info.name.SetString(value);
453 } else if (name == "alt-name") {
454 reg_info.alt_name.SetString(value);
455 } else if (name == "bitsize") {
456 if (!value.getAsInteger(0, reg_info.byte_size))
457 reg_info.byte_size /= CHAR_BIT;
458 } else if (name == "offset") {
459 value.getAsInteger(0, reg_info.byte_offset);
460 } else if (name == "encoding") {
461 const Encoding encoding = Args::StringToEncoding(value);
462 if (encoding != eEncodingInvalid)
463 reg_info.encoding = encoding;
464 } else if (name == "format") {
465 if (!OptionArgParser::ToFormat(value.str().c_str(), reg_info.format, nullptr)
466 .Success())
467 reg_info.format =
468 llvm::StringSwitch<Format>(value)
469 .Case("binary", eFormatBinary)
470 .Case("decimal", eFormatDecimal)
471 .Case("hex", eFormatHex)
472 .Case("float", eFormatFloat)
473 .Case("vector-sint8", eFormatVectorOfSInt8)
474 .Case("vector-uint8", eFormatVectorOfUInt8)
475 .Case("vector-sint16", eFormatVectorOfSInt16)
476 .Case("vector-uint16", eFormatVectorOfUInt16)
477 .Case("vector-sint32", eFormatVectorOfSInt32)
478 .Case("vector-uint32", eFormatVectorOfUInt32)
479 .Case("vector-float32", eFormatVectorOfFloat32)
480 .Case("vector-uint64", eFormatVectorOfUInt64)
481 .Case("vector-uint128", eFormatVectorOfUInt128)
482 .Default(eFormatInvalid);
483 } else if (name == "set") {
484 reg_info.set_name.SetString(value);
485 } else if (name == "gcc" || name == "ehframe") {
486 value.getAsInteger(0, reg_info.regnum_ehframe);
487 } else if (name == "dwarf") {
488 value.getAsInteger(0, reg_info.regnum_dwarf);
489 } else if (name == "generic") {
491 } else if (name == "container-regs") {
493 } else if (name == "invalidate-regs") {
495 }
496 }
497
498 assert(reg_info.byte_size != 0);
499 registers.push_back(reg_info);
500 } else {
501 break; // ensure exit before reg_num is incremented
502 }
503 } else {
504 break;
505 }
506 }
507
508 if (registers.empty())
509 registers = GetFallbackRegisters(arch_to_use);
510
511 AddRemoteRegisters(registers, arch_to_use);
512}
513
515 return WillLaunchOrAttach();
516}
517
519 return WillLaunchOrAttach();
520}
521
523 bool wait_for_launch) {
524 return WillLaunchOrAttach();
525}
526
527Status ProcessGDBRemote::DoConnectRemote(llvm::StringRef remote_url) {
529
531 if (error.Fail())
532 return error;
533
534 error = ConnectToDebugserver(remote_url);
535 if (error.Fail())
536 return error;
537
539
541 if (pid == LLDB_INVALID_PROCESS_ID) {
542 // We don't have a valid process ID, so note that we are connected and
543 // could now request to launch or attach, or get remote process listings...
545 } else {
546 // We have a valid process
547 SetID(pid);
550 if (m_gdb_comm.GetStopReply(response)) {
551 SetLastStopPacket(response);
552
553 Target &target = GetTarget();
554 if (!target.GetArchitecture().IsValid()) {
557 } else {
560 }
561 }
562 }
563
564 const StateType state = SetThreadStopInfo(response);
565 if (state != eStateInvalid) {
566 SetPrivateState(state);
567 } else
569 "Process %" PRIu64 " was reported after connecting to "
570 "'%s', but state was not stopped: %s",
571 pid, remote_url.str().c_str(), StateAsCString(state));
572 } else
574 "Process %" PRIu64 " was reported after connecting to '%s', "
575 "but no stop reply packet was received",
576 pid, remote_url.str().c_str());
577 }
578
579 LLDB_LOGF(log,
580 "ProcessGDBRemote::%s pid %" PRIu64
581 ": normalizing target architecture initial triple: %s "
582 "(GetTarget().GetArchitecture().IsValid() %s, "
583 "m_gdb_comm.GetHostArchitecture().IsValid(): %s)",
584 __FUNCTION__, GetID(),
585 GetTarget().GetArchitecture().GetTriple().getTriple().c_str(),
586 GetTarget().GetArchitecture().IsValid() ? "true" : "false",
587 m_gdb_comm.GetHostArchitecture().IsValid() ? "true" : "false");
588
589 if (error.Success() && !GetTarget().GetArchitecture().IsValid() &&
591 // Prefer the *process'* architecture over that of the *host*, if
592 // available.
595 else
597 }
598
599 LLDB_LOGF(log,
600 "ProcessGDBRemote::%s pid %" PRIu64
601 ": normalized target architecture triple: %s",
602 __FUNCTION__, GetID(),
603 GetTarget().GetArchitecture().GetTriple().getTriple().c_str());
604
605 return error;
606}
607
611 return error;
612}
613
614// Process Control
616 ProcessLaunchInfo &launch_info) {
619
620 LLDB_LOGF(log, "ProcessGDBRemote::%s() entered", __FUNCTION__);
621
622 uint32_t launch_flags = launch_info.GetFlags().Get();
623 FileSpec stdin_file_spec{};
624 FileSpec stdout_file_spec{};
625 FileSpec stderr_file_spec{};
626 FileSpec working_dir = launch_info.GetWorkingDirectory();
627
628 const FileAction *file_action;
629 file_action = launch_info.GetFileActionForFD(STDIN_FILENO);
630 if (file_action) {
631 if (file_action->GetAction() == FileAction::eFileActionOpen)
632 stdin_file_spec = file_action->GetFileSpec();
633 }
634 file_action = launch_info.GetFileActionForFD(STDOUT_FILENO);
635 if (file_action) {
636 if (file_action->GetAction() == FileAction::eFileActionOpen)
637 stdout_file_spec = file_action->GetFileSpec();
638 }
639 file_action = launch_info.GetFileActionForFD(STDERR_FILENO);
640 if (file_action) {
641 if (file_action->GetAction() == FileAction::eFileActionOpen)
642 stderr_file_spec = file_action->GetFileSpec();
643 }
644
645 if (log) {
646 if (stdin_file_spec || stdout_file_spec || stderr_file_spec)
647 LLDB_LOGF(log,
648 "ProcessGDBRemote::%s provided with STDIO paths via "
649 "launch_info: stdin=%s, stdout=%s, stderr=%s",
650 __FUNCTION__,
651 stdin_file_spec ? stdin_file_spec.GetPath().c_str() : "<null>",
652 stdout_file_spec ? stdout_file_spec.GetPath().c_str() : "<null>",
653 stderr_file_spec ? stderr_file_spec.GetPath().c_str() : "<null>");
654 else
655 LLDB_LOGF(log,
656 "ProcessGDBRemote::%s no STDIO paths given via launch_info",
657 __FUNCTION__);
658 }
659
660 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
661 if (stdin_file_spec || disable_stdio) {
662 // the inferior will be reading stdin from the specified file or stdio is
663 // completely disabled
664 m_stdin_forward = false;
665 } else {
666 m_stdin_forward = true;
667 }
668
669 // ::LogSetBitMask (GDBR_LOG_DEFAULT);
670 // ::LogSetOptions (LLDB_LOG_OPTION_THREADSAFE |
671 // LLDB_LOG_OPTION_PREPEND_TIMESTAMP |
672 // LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD);
673 // ::LogSetLogFile ("/dev/stdout");
674
675 error = EstablishConnectionIfNeeded(launch_info);
676 if (error.Success()) {
677 PseudoTerminal pty;
678 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
679
680 PlatformSP platform_sp(GetTarget().GetPlatform());
681 if (disable_stdio) {
682 // set to /dev/null unless redirected to a file above
683 if (!stdin_file_spec)
684 stdin_file_spec.SetFile(FileSystem::DEV_NULL,
685 FileSpec::Style::native);
686 if (!stdout_file_spec)
687 stdout_file_spec.SetFile(FileSystem::DEV_NULL,
688 FileSpec::Style::native);
689 if (!stderr_file_spec)
690 stderr_file_spec.SetFile(FileSystem::DEV_NULL,
691 FileSpec::Style::native);
692 } else if (platform_sp && platform_sp->IsHost()) {
693 // If the debugserver is local and we aren't disabling STDIO, lets use
694 // a pseudo terminal to instead of relying on the 'O' packets for stdio
695 // since 'O' packets can really slow down debugging if the inferior
696 // does a lot of output.
697 if ((!stdin_file_spec || !stdout_file_spec || !stderr_file_spec) &&
698 !errorToBool(pty.OpenFirstAvailablePrimary(O_RDWR | O_NOCTTY))) {
699 FileSpec secondary_name(pty.GetSecondaryName());
700
701 if (!stdin_file_spec)
702 stdin_file_spec = secondary_name;
703
704 if (!stdout_file_spec)
705 stdout_file_spec = secondary_name;
706
707 if (!stderr_file_spec)
708 stderr_file_spec = secondary_name;
709 }
710 LLDB_LOGF(
711 log,
712 "ProcessGDBRemote::%s adjusted STDIO paths for local platform "
713 "(IsHost() is true) using secondary: stdin=%s, stdout=%s, "
714 "stderr=%s",
715 __FUNCTION__,
716 stdin_file_spec ? stdin_file_spec.GetPath().c_str() : "<null>",
717 stdout_file_spec ? stdout_file_spec.GetPath().c_str() : "<null>",
718 stderr_file_spec ? stderr_file_spec.GetPath().c_str() : "<null>");
719 }
720
721 LLDB_LOGF(log,
722 "ProcessGDBRemote::%s final STDIO paths after all "
723 "adjustments: stdin=%s, stdout=%s, stderr=%s",
724 __FUNCTION__,
725 stdin_file_spec ? stdin_file_spec.GetPath().c_str() : "<null>",
726 stdout_file_spec ? stdout_file_spec.GetPath().c_str() : "<null>",
727 stderr_file_spec ? stderr_file_spec.GetPath().c_str() : "<null>");
728
729 if (stdin_file_spec)
730 m_gdb_comm.SetSTDIN(stdin_file_spec);
731 if (stdout_file_spec)
732 m_gdb_comm.SetSTDOUT(stdout_file_spec);
733 if (stderr_file_spec)
734 m_gdb_comm.SetSTDERR(stderr_file_spec);
735
736 m_gdb_comm.SetDisableASLR(launch_flags & eLaunchFlagDisableASLR);
737 m_gdb_comm.SetDetachOnError(launch_flags & eLaunchFlagDetachOnError);
738
740 GetTarget().GetArchitecture().GetArchitectureName());
741
742 const char *launch_event_data = launch_info.GetLaunchEventData();
743 if (launch_event_data != nullptr && *launch_event_data != '\0')
744 m_gdb_comm.SendLaunchEventDataPacket(launch_event_data);
745
746 if (working_dir) {
747 m_gdb_comm.SetWorkingDir(working_dir);
748 }
749
750 // Send the environment and the program + arguments after we connect
752
753 {
754 // Scope for the scoped timeout object
756 std::chrono::seconds(10));
757
758 // Since we can't send argv0 separate from the executable path, we need to
759 // make sure to use the actual executable path found in the launch_info...
760 Args args = launch_info.GetArguments();
761 if (FileSpec exe_file = launch_info.GetExecutableFile())
762 args.ReplaceArgumentAtIndex(0, exe_file.GetPath(false));
763 if (llvm::Error err = m_gdb_comm.LaunchProcess(args)) {
765 "Cannot launch '{0}': {1}", args.GetArgumentAtIndex(0),
766 llvm::fmt_consume(std::move(err)));
767 } else {
769 }
770 }
771
773 LLDB_LOGF(log, "failed to connect to debugserver: %s",
774 error.AsCString());
776 return error;
777 }
778
780 if (m_gdb_comm.GetStopReply(response)) {
781 SetLastStopPacket(response);
782
783 const ArchSpec &process_arch = m_gdb_comm.GetProcessArchitecture();
784
785 if (process_arch.IsValid()) {
786 GetTarget().MergeArchitecture(process_arch);
787 } else {
788 const ArchSpec &host_arch = m_gdb_comm.GetHostArchitecture();
789 if (host_arch.IsValid())
790 GetTarget().MergeArchitecture(host_arch);
791 }
792
794
795 if (!disable_stdio) {
798 }
799 }
800 } else {
801 LLDB_LOGF(log, "failed to connect to debugserver: %s", error.AsCString());
802 }
803 return error;
804}
805
806Status ProcessGDBRemote::ConnectToDebugserver(llvm::StringRef connect_url) {
808 // Only connect if we have a valid connect URL
810
811 if (!connect_url.empty()) {
812 LLDB_LOGF(log, "ProcessGDBRemote::%s Connecting to %s", __FUNCTION__,
813 connect_url.str().c_str());
814 std::unique_ptr<ConnectionFileDescriptor> conn_up(
816 if (conn_up) {
817 const uint32_t max_retry_count = 50;
818 uint32_t retry_count = 0;
819 while (!m_gdb_comm.IsConnected()) {
820 if (conn_up->Connect(connect_url, &error) == eConnectionStatusSuccess) {
821 m_gdb_comm.SetConnection(std::move(conn_up));
822 break;
823 }
824
825 retry_count++;
826
827 if (retry_count >= max_retry_count)
828 break;
829
830 std::this_thread::sleep_for(std::chrono::milliseconds(100));
831 }
832 }
833 }
834
835 if (!m_gdb_comm.IsConnected()) {
836 if (error.Success())
837 error = Status::FromErrorString("not connected to remote gdb server");
838 return error;
839 }
840
841 // We always seem to be able to open a connection to a local port so we need
842 // to make sure we can then send data to it. If we can't then we aren't
843 // actually connected to anything, so try and do the handshake with the
844 // remote GDB server and make sure that goes alright.
847 if (error.Success())
848 error = Status::FromErrorString("not connected to remote gdb server");
849 return error;
850 }
851
859
860 // First dispatch any commands from the platform:
861 auto handle_cmds = [&] (const Args &args) -> void {
862 for (const Args::ArgEntry &entry : args) {
865 entry.c_str(), response);
866 }
867 };
868
869 PlatformSP platform_sp = GetTarget().GetPlatform();
870 if (platform_sp) {
871 handle_cmds(platform_sp->GetExtraStartupCommands());
872 }
873
874 // Then dispatch any process commands:
875 handle_cmds(GetExtraStartupCommands());
876
877 return error;
878}
879
883
884 // See if the GDB server supports qHostInfo or qProcessInfo packets. Prefer
885 // qProcessInfo as it will be more specific to our process.
886
887 const ArchSpec &remote_process_arch = m_gdb_comm.GetProcessArchitecture();
888 if (remote_process_arch.IsValid()) {
889 process_arch = remote_process_arch;
890 LLDB_LOG(log, "gdb-remote had process architecture, using {0} {1}",
891 process_arch.GetArchitectureName(),
892 process_arch.GetTriple().getTriple());
893 } else {
894 process_arch = m_gdb_comm.GetHostArchitecture();
895 LLDB_LOG(log,
896 "gdb-remote did not have process architecture, using gdb-remote "
897 "host architecture {0} {1}",
898 process_arch.GetArchitectureName(),
899 process_arch.GetTriple().getTriple());
900 }
901
902 AddressableBits addressable_bits = m_gdb_comm.GetAddressableBits();
903 SetAddressableBitMasks(addressable_bits);
904
905 if (process_arch.IsValid()) {
906 const ArchSpec &target_arch = GetTarget().GetArchitecture();
907 if (target_arch.IsValid()) {
908 LLDB_LOG(log, "analyzing target arch, currently {0} {1}",
909 target_arch.GetArchitectureName(),
910 target_arch.GetTriple().getTriple());
911
912 // If the remote host is ARM and we have apple as the vendor, then
913 // ARM executables and shared libraries can have mixed ARM
914 // architectures.
915 // You can have an armv6 executable, and if the host is armv7, then the
916 // system will load the best possible architecture for all shared
917 // libraries it has, so we really need to take the remote host
918 // architecture as our defacto architecture in this case.
919
920 if ((process_arch.GetMachine() == llvm::Triple::arm ||
921 process_arch.GetMachine() == llvm::Triple::thumb) &&
922 process_arch.GetTriple().getVendor() == llvm::Triple::Apple) {
923 GetTarget().SetArchitecture(process_arch);
924 LLDB_LOG(log,
925 "remote process is ARM/Apple, "
926 "setting target arch to {0} {1}",
927 process_arch.GetArchitectureName(),
928 process_arch.GetTriple().getTriple());
929 } else {
930 // Fill in what is missing in the triple
931 const llvm::Triple &remote_triple = process_arch.GetTriple();
932 llvm::Triple new_target_triple = target_arch.GetTriple();
933 if (new_target_triple.getVendorName().size() == 0) {
934 new_target_triple.setVendor(remote_triple.getVendor());
935
936 if (new_target_triple.getOSName().size() == 0) {
937 new_target_triple.setOS(remote_triple.getOS());
938
939 if (new_target_triple.getEnvironmentName().size() == 0)
940 new_target_triple.setEnvironment(remote_triple.getEnvironment());
941 }
942
943 ArchSpec new_target_arch = target_arch;
944 new_target_arch.SetTriple(new_target_triple);
945 GetTarget().SetArchitecture(new_target_arch);
946 }
947 }
948
949 LLDB_LOG(log,
950 "final target arch after adjustments for remote architecture: "
951 "{0} {1}",
952 target_arch.GetArchitectureName(),
953 target_arch.GetTriple().getTriple());
954 } else {
955 // The target doesn't have a valid architecture yet, set it from the
956 // architecture we got from the remote GDB server
957 GetTarget().SetArchitecture(process_arch);
958 }
959 }
960
961 // Target and Process are reasonably initailized;
962 // load any binaries we have metadata for / set load address.
965
966 // Find out which StructuredDataPlugins are supported by the debug monitor.
967 // These plugins transmit data over async $J packets.
968 if (StructuredData::Array *supported_packets =
970 MapSupportedStructuredDataPlugins(*supported_packets);
971
972 // If connected to LLDB ("native-signals+"), use signal defs for
973 // the remote platform. If connected to GDB, just use the standard set.
975 SetUnixSignals(std::make_shared<GDBRemoteSignals>());
976 } else {
977 PlatformSP platform_sp = GetTarget().GetPlatform();
978 if (platform_sp && platform_sp->IsConnected())
979 SetUnixSignals(platform_sp->GetUnixSignals());
980 else
981 SetUnixSignals(UnixSignals::Create(GetTarget().GetArchitecture()));
982 }
983}
984
986 // The remote stub may know about the "main binary" in
987 // the context of a firmware debug session, and can
988 // give us a UUID and an address/slide of where the
989 // binary is loaded in memory.
990 UUID standalone_uuid;
991 addr_t standalone_value;
992 bool standalone_value_is_offset;
993 if (m_gdb_comm.GetProcessStandaloneBinary(standalone_uuid, standalone_value,
994 standalone_value_is_offset)) {
995 ModuleSP module_sp;
996
997 if (standalone_uuid.IsValid()) {
998 const bool force_symbol_search = true;
999 const bool notify = true;
1000 const bool set_address_in_target = true;
1001 const bool allow_memory_image_last_resort = false;
1003 this, "", standalone_uuid, standalone_value,
1004 standalone_value_is_offset, force_symbol_search, notify,
1005 set_address_in_target, allow_memory_image_last_resort);
1006 }
1007 }
1008
1009 // The remote stub may know about a list of binaries to
1010 // force load into the process -- a firmware type situation
1011 // where multiple binaries are present in virtual memory,
1012 // and we are only given the addresses of the binaries.
1013 // Not intended for use with userland debugging, when we use
1014 // a DynamicLoader plugin that knows how to find the loaded
1015 // binaries, and will track updates as binaries are added.
1016
1017 std::vector<addr_t> bin_addrs = m_gdb_comm.GetProcessStandaloneBinaries();
1018 if (bin_addrs.size()) {
1019 UUID uuid;
1020 const bool value_is_slide = false;
1021 for (addr_t addr : bin_addrs) {
1022 const bool notify = true;
1023 // First see if this is a special platform
1024 // binary that may determine the DynamicLoader and
1025 // Platform to be used in this Process and Target.
1026 if (GetTarget()
1027 .GetDebugger()
1028 .GetPlatformList()
1029 .LoadPlatformBinaryAndSetup(this, addr, notify))
1030 continue;
1031
1032 const bool force_symbol_search = true;
1033 const bool set_address_in_target = true;
1034 const bool allow_memory_image_last_resort = false;
1035 // Second manually load this binary into the Target.
1037 this, llvm::StringRef(), uuid, addr, value_is_slide,
1038 force_symbol_search, notify, set_address_in_target,
1039 allow_memory_image_last_resort);
1040 }
1041 }
1042}
1043
1045 ModuleSP module_sp = GetTarget().GetExecutableModule();
1046 if (!module_sp)
1047 return;
1048
1049 std::optional<QOffsets> offsets = m_gdb_comm.GetQOffsets();
1050 if (!offsets)
1051 return;
1052
1053 bool is_uniform =
1054 size_t(llvm::count(offsets->offsets, offsets->offsets[0])) ==
1055 offsets->offsets.size();
1056 if (!is_uniform)
1057 return; // TODO: Handle non-uniform responses.
1058
1059 bool changed = false;
1060 module_sp->SetLoadAddress(GetTarget(), offsets->offsets[0],
1061 /*value_is_offset=*/true, changed);
1062 if (changed) {
1063 ModuleList list;
1064 list.Append(module_sp);
1066 }
1067}
1068
1070 ArchSpec process_arch;
1071 DidLaunchOrAttach(process_arch);
1072}
1073
1075 lldb::pid_t attach_pid, const ProcessAttachInfo &attach_info) {
1076 Log *log = GetLog(GDBRLog::Process);
1077 Status error;
1078
1079 LLDB_LOGF(log, "ProcessGDBRemote::%s()", __FUNCTION__);
1080
1081 // Clear out and clean up from any current state
1082 Clear();
1083 if (attach_pid != LLDB_INVALID_PROCESS_ID) {
1084 error = EstablishConnectionIfNeeded(attach_info);
1085 if (error.Success()) {
1087
1088 char packet[64];
1089 const int packet_len =
1090 ::snprintf(packet, sizeof(packet), "vAttach;%" PRIx64, attach_pid);
1091 SetID(attach_pid);
1092 auto data_sp =
1093 std::make_shared<EventDataBytes>(llvm::StringRef(packet, packet_len));
1095 } else
1096 SetExitStatus(-1, error.AsCString());
1097 }
1098
1099 return error;
1100}
1101
1103 const char *process_name, const ProcessAttachInfo &attach_info) {
1104 Status error;
1105 // Clear out and clean up from any current state
1106 Clear();
1107
1108 if (process_name && process_name[0]) {
1109 error = EstablishConnectionIfNeeded(attach_info);
1110 if (error.Success()) {
1111 StreamString packet;
1112
1114
1115 if (attach_info.GetWaitForLaunch()) {
1117 packet.PutCString("vAttachWait");
1118 } else {
1119 if (attach_info.GetIgnoreExisting())
1120 packet.PutCString("vAttachWait");
1121 else
1122 packet.PutCString("vAttachOrWait");
1123 }
1124 } else
1125 packet.PutCString("vAttachName");
1126 packet.PutChar(';');
1127 packet.PutBytesAsRawHex8(process_name, strlen(process_name),
1130
1131 auto data_sp = std::make_shared<EventDataBytes>(packet.GetString());
1133
1134 } else
1135 SetExitStatus(-1, error.AsCString());
1136 }
1137 return error;
1138}
1139
1140llvm::Expected<TraceSupportedResponse> ProcessGDBRemote::TraceSupported() {
1142}
1143
1145 return m_gdb_comm.SendTraceStop(request, GetInterruptTimeout());
1146}
1147
1148llvm::Error ProcessGDBRemote::TraceStart(const llvm::json::Value &request) {
1150}
1151
1152llvm::Expected<std::string>
1153ProcessGDBRemote::TraceGetState(llvm::StringRef type) {
1155}
1156
1157llvm::Expected<std::vector<uint8_t>>
1160}
1161
1163 // When we exit, disconnect from the GDB server communications
1165}
1166
1168 // If you can figure out what the architecture is, fill it in here.
1169 process_arch.Clear();
1170 DidLaunchOrAttach(process_arch);
1171}
1172
1174 m_continue_c_tids.clear();
1175 m_continue_C_tids.clear();
1176 m_continue_s_tids.clear();
1177 m_continue_S_tids.clear();
1178 m_jstopinfo_sp.reset();
1179 m_jthreadsinfo_sp.reset();
1180 return Status();
1181}
1182
1184 Status error;
1185 Log *log = GetLog(GDBRLog::Process);
1186 LLDB_LOGF(log, "ProcessGDBRemote::Resume()");
1187
1188 ListenerSP listener_sp(
1189 Listener::MakeListener("gdb-remote.resume-packet-sent"));
1190 if (listener_sp->StartListeningForEvents(
1192 listener_sp->StartListeningForEvents(
1195
1196 const size_t num_threads = GetThreadList().GetSize();
1197
1198 StreamString continue_packet;
1199 bool continue_packet_error = false;
1201 std::string pid_prefix;
1203 pid_prefix = llvm::formatv("p{0:x-}.", GetID());
1204
1205 if (m_continue_c_tids.size() == num_threads ||
1206 (m_continue_c_tids.empty() && m_continue_C_tids.empty() &&
1207 m_continue_s_tids.empty() && m_continue_S_tids.empty())) {
1208 // All threads are continuing
1210 continue_packet.Format("vCont;c:{0}-1", pid_prefix);
1211 else
1212 continue_packet.PutCString("c");
1213 } else {
1214 continue_packet.PutCString("vCont");
1215
1216 if (!m_continue_c_tids.empty()) {
1217 if (m_gdb_comm.GetVContSupported('c')) {
1218 for (tid_collection::const_iterator
1219 t_pos = m_continue_c_tids.begin(),
1220 t_end = m_continue_c_tids.end();
1221 t_pos != t_end; ++t_pos)
1222 continue_packet.Format(";c:{0}{1:x-}", pid_prefix, *t_pos);
1223 } else
1224 continue_packet_error = true;
1225 }
1226
1227 if (!continue_packet_error && !m_continue_C_tids.empty()) {
1228 if (m_gdb_comm.GetVContSupported('C')) {
1229 for (tid_sig_collection::const_iterator
1230 s_pos = m_continue_C_tids.begin(),
1231 s_end = m_continue_C_tids.end();
1232 s_pos != s_end; ++s_pos)
1233 continue_packet.Format(";C{0:x-2}:{1}{2:x-}", s_pos->second,
1234 pid_prefix, s_pos->first);
1235 } else
1236 continue_packet_error = true;
1237 }
1238
1239 if (!continue_packet_error && !m_continue_s_tids.empty()) {
1240 if (m_gdb_comm.GetVContSupported('s')) {
1241 for (tid_collection::const_iterator
1242 t_pos = m_continue_s_tids.begin(),
1243 t_end = m_continue_s_tids.end();
1244 t_pos != t_end; ++t_pos)
1245 continue_packet.Format(";s:{0}{1:x-}", pid_prefix, *t_pos);
1246 } else
1247 continue_packet_error = true;
1248 }
1249
1250 if (!continue_packet_error && !m_continue_S_tids.empty()) {
1251 if (m_gdb_comm.GetVContSupported('S')) {
1252 for (tid_sig_collection::const_iterator
1253 s_pos = m_continue_S_tids.begin(),
1254 s_end = m_continue_S_tids.end();
1255 s_pos != s_end; ++s_pos)
1256 continue_packet.Format(";S{0:x-2}:{1}{2:x-}", s_pos->second,
1257 pid_prefix, s_pos->first);
1258 } else
1259 continue_packet_error = true;
1260 }
1261
1262 if (continue_packet_error)
1263 continue_packet.Clear();
1264 }
1265 } else
1266 continue_packet_error = true;
1267
1268 if (continue_packet_error) {
1269 // Either no vCont support, or we tried to use part of the vCont packet
1270 // that wasn't supported by the remote GDB server. We need to try and
1271 // make a simple packet that can do our continue
1272 const size_t num_continue_c_tids = m_continue_c_tids.size();
1273 const size_t num_continue_C_tids = m_continue_C_tids.size();
1274 const size_t num_continue_s_tids = m_continue_s_tids.size();
1275 const size_t num_continue_S_tids = m_continue_S_tids.size();
1276 if (num_continue_c_tids > 0) {
1277 if (num_continue_c_tids == num_threads) {
1278 // All threads are resuming...
1280 continue_packet.PutChar('c');
1281 continue_packet_error = false;
1282 } else if (num_continue_c_tids == 1 && num_continue_C_tids == 0 &&
1283 num_continue_s_tids == 0 && num_continue_S_tids == 0) {
1284 // Only one thread is continuing
1286 continue_packet.PutChar('c');
1287 continue_packet_error = false;
1288 }
1289 }
1290
1291 if (continue_packet_error && num_continue_C_tids > 0) {
1292 if ((num_continue_C_tids + num_continue_c_tids) == num_threads &&
1293 num_continue_C_tids > 0 && num_continue_s_tids == 0 &&
1294 num_continue_S_tids == 0) {
1295 const int continue_signo = m_continue_C_tids.front().second;
1296 // Only one thread is continuing
1297 if (num_continue_C_tids > 1) {
1298 // More that one thread with a signal, yet we don't have vCont
1299 // support and we are being asked to resume each thread with a
1300 // signal, we need to make sure they are all the same signal, or we
1301 // can't issue the continue accurately with the current support...
1302 if (num_continue_C_tids > 1) {
1303 continue_packet_error = false;
1304 for (size_t i = 1; i < m_continue_C_tids.size(); ++i) {
1305 if (m_continue_C_tids[i].second != continue_signo)
1306 continue_packet_error = true;
1307 }
1308 }
1309 if (!continue_packet_error)
1311 } else {
1312 // Set the continue thread ID
1313 continue_packet_error = false;
1315 }
1316 if (!continue_packet_error) {
1317 // Add threads continuing with the same signo...
1318 continue_packet.Printf("C%2.2x", continue_signo);
1319 }
1320 }
1321 }
1322
1323 if (continue_packet_error && num_continue_s_tids > 0) {
1324 if (num_continue_s_tids == num_threads) {
1325 // All threads are resuming...
1327
1328 continue_packet.PutChar('s');
1329
1330 continue_packet_error = false;
1331 } else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1332 num_continue_s_tids == 1 && num_continue_S_tids == 0) {
1333 // Only one thread is stepping
1335 continue_packet.PutChar('s');
1336 continue_packet_error = false;
1337 }
1338 }
1339
1340 if (!continue_packet_error && num_continue_S_tids > 0) {
1341 if (num_continue_S_tids == num_threads) {
1342 const int step_signo = m_continue_S_tids.front().second;
1343 // Are all threads trying to step with the same signal?
1344 continue_packet_error = false;
1345 if (num_continue_S_tids > 1) {
1346 for (size_t i = 1; i < num_threads; ++i) {
1347 if (m_continue_S_tids[i].second != step_signo)
1348 continue_packet_error = true;
1349 }
1350 }
1351 if (!continue_packet_error) {
1352 // Add threads stepping with the same signo...
1354 continue_packet.Printf("S%2.2x", step_signo);
1355 }
1356 } else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1357 num_continue_s_tids == 0 && num_continue_S_tids == 1) {
1358 // Only one thread is stepping with signal
1360 continue_packet.Printf("S%2.2x", m_continue_S_tids.front().second);
1361 continue_packet_error = false;
1362 }
1363 }
1364 }
1365
1366 if (continue_packet_error) {
1367 error =
1368 Status::FromErrorString("can't make continue packet for this resume");
1369 } else {
1370 EventSP event_sp;
1371 if (!m_async_thread.IsJoinable()) {
1373 "Trying to resume but the async thread is dead.");
1374 LLDB_LOGF(log, "ProcessGDBRemote::DoResume: Trying to resume but the "
1375 "async thread is dead.");
1376 return error;
1377 }
1378
1379 auto data_sp =
1380 std::make_shared<EventDataBytes>(continue_packet.GetString());
1382
1383 if (!listener_sp->GetEvent(event_sp, std::chrono::seconds(5))) {
1384 error = Status::FromErrorString("Resume timed out.");
1385 LLDB_LOGF(log, "ProcessGDBRemote::DoResume: Resume timed out.");
1386 } else if (event_sp->BroadcasterIs(&m_async_broadcaster)) {
1388 "Broadcast continue, but the async thread was "
1389 "killed before we got an ack back.");
1390 LLDB_LOGF(log,
1391 "ProcessGDBRemote::DoResume: Broadcast continue, but the "
1392 "async thread was killed before we got an ack back.");
1393 return error;
1394 }
1395 }
1396 }
1397
1398 return error;
1399}
1400
1402 std::lock_guard<std::recursive_mutex> guard(m_thread_list_real.GetMutex());
1403 m_thread_ids.clear();
1404 m_thread_pcs.clear();
1405}
1406
1408 llvm::StringRef value) {
1409 m_thread_ids.clear();
1411 StringExtractorGDBRemote thread_ids{value};
1412
1413 do {
1414 auto pid_tid = thread_ids.GetPidTid(pid);
1415 if (pid_tid && pid_tid->first == pid) {
1416 lldb::tid_t tid = pid_tid->second;
1417 if (tid != LLDB_INVALID_THREAD_ID &&
1419 m_thread_ids.push_back(tid);
1420 }
1421 } while (thread_ids.GetChar() == ',');
1422
1423 return m_thread_ids.size();
1424}
1425
1427 llvm::StringRef value) {
1428 m_thread_pcs.clear();
1429 for (llvm::StringRef x : llvm::split(value, ',')) {
1431 if (llvm::to_integer(x, pc, 16))
1432 m_thread_pcs.push_back(pc);
1433 }
1434 return m_thread_pcs.size();
1435}
1436
1438 std::lock_guard<std::recursive_mutex> guard(m_thread_list_real.GetMutex());
1439
1440 if (m_jthreadsinfo_sp) {
1441 // If we have the JSON threads info, we can get the thread list from that
1442 StructuredData::Array *thread_infos = m_jthreadsinfo_sp->GetAsArray();
1443 if (thread_infos && thread_infos->GetSize() > 0) {
1444 m_thread_ids.clear();
1445 m_thread_pcs.clear();
1446 thread_infos->ForEach([this](StructuredData::Object *object) -> bool {
1447 StructuredData::Dictionary *thread_dict = object->GetAsDictionary();
1448 if (thread_dict) {
1449 // Set the thread stop info from the JSON dictionary
1450 SetThreadStopInfo(thread_dict);
1452 if (thread_dict->GetValueForKeyAsInteger<lldb::tid_t>("tid", tid))
1453 m_thread_ids.push_back(tid);
1454 }
1455 return true; // Keep iterating through all thread_info objects
1456 });
1457 }
1458 if (!m_thread_ids.empty())
1459 return true;
1460 } else {
1461 // See if we can get the thread IDs from the current stop reply packets
1462 // that might contain a "threads" key/value pair
1463
1464 if (m_last_stop_packet) {
1465 // Get the thread stop info
1467 const std::string &stop_info_str = std::string(stop_info.GetStringRef());
1468
1469 m_thread_pcs.clear();
1470 const size_t thread_pcs_pos = stop_info_str.find(";thread-pcs:");
1471 if (thread_pcs_pos != std::string::npos) {
1472 const size_t start = thread_pcs_pos + strlen(";thread-pcs:");
1473 const size_t end = stop_info_str.find(';', start);
1474 if (end != std::string::npos) {
1475 std::string value = stop_info_str.substr(start, end - start);
1477 }
1478 }
1479
1480 const size_t threads_pos = stop_info_str.find(";threads:");
1481 if (threads_pos != std::string::npos) {
1482 const size_t start = threads_pos + strlen(";threads:");
1483 const size_t end = stop_info_str.find(';', start);
1484 if (end != std::string::npos) {
1485 std::string value = stop_info_str.substr(start, end - start);
1487 return true;
1488 }
1489 }
1490 }
1491 }
1492
1493 bool sequence_mutex_unavailable = false;
1494 m_gdb_comm.GetCurrentThreadIDs(m_thread_ids, sequence_mutex_unavailable);
1495 if (sequence_mutex_unavailable) {
1496 return false; // We just didn't get the list
1497 }
1498 return true;
1499}
1500
1502 ThreadList &new_thread_list) {
1503 // locker will keep a mutex locked until it goes out of scope
1504 Log *log = GetLog(GDBRLog::Thread);
1505 LLDB_LOGV(log, "pid = {0}", GetID());
1506
1507 size_t num_thread_ids = m_thread_ids.size();
1508 // The "m_thread_ids" thread ID list should always be updated after each stop
1509 // reply packet, but in case it isn't, update it here.
1510 if (num_thread_ids == 0) {
1511 if (!UpdateThreadIDList())
1512 return false;
1513 num_thread_ids = m_thread_ids.size();
1514 }
1515
1516 ThreadList old_thread_list_copy(old_thread_list);
1517 if (num_thread_ids > 0) {
1518 for (size_t i = 0; i < num_thread_ids; ++i) {
1519 lldb::tid_t tid = m_thread_ids[i];
1520 ThreadSP thread_sp(
1521 old_thread_list_copy.RemoveThreadByProtocolID(tid, false));
1522 if (!thread_sp) {
1523 thread_sp = std::make_shared<ThreadGDBRemote>(*this, tid);
1524 LLDB_LOGV(log, "Making new thread: {0} for thread ID: {1:x}.",
1525 thread_sp.get(), thread_sp->GetID());
1526 } else {
1527 LLDB_LOGV(log, "Found old thread: {0} for thread ID: {1:x}.",
1528 thread_sp.get(), thread_sp->GetID());
1529 }
1530
1531 SetThreadPc(thread_sp, i);
1532 new_thread_list.AddThreadSortedByIndexID(thread_sp);
1533 }
1534 }
1535
1536 // Whatever that is left in old_thread_list_copy are not present in
1537 // new_thread_list. Remove non-existent threads from internal id table.
1538 size_t old_num_thread_ids = old_thread_list_copy.GetSize(false);
1539 for (size_t i = 0; i < old_num_thread_ids; i++) {
1540 ThreadSP old_thread_sp(old_thread_list_copy.GetThreadAtIndex(i, false));
1541 if (old_thread_sp) {
1542 lldb::tid_t old_thread_id = old_thread_sp->GetProtocolID();
1543 m_thread_id_to_index_id_map.erase(old_thread_id);
1544 }
1545 }
1546
1547 return true;
1548}
1549
1550void ProcessGDBRemote::SetThreadPc(const ThreadSP &thread_sp, uint64_t index) {
1551 if (m_thread_ids.size() == m_thread_pcs.size() && thread_sp.get() &&
1553 ThreadGDBRemote *gdb_thread =
1554 static_cast<ThreadGDBRemote *>(thread_sp.get());
1555 RegisterContextSP reg_ctx_sp(thread_sp->GetRegisterContext());
1556 if (reg_ctx_sp) {
1557 uint32_t pc_regnum = reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1559 if (pc_regnum != LLDB_INVALID_REGNUM) {
1560 gdb_thread->PrivateSetRegisterValue(pc_regnum, m_thread_pcs[index]);
1561 }
1562 }
1563 }
1564}
1565
1567 ThreadGDBRemote *thread, const StructuredData::ObjectSP &thread_infos_sp) {
1568 // See if we got thread stop infos for all threads via the "jThreadsInfo"
1569 // packet
1570 if (thread_infos_sp) {
1571 StructuredData::Array *thread_infos = thread_infos_sp->GetAsArray();
1572 if (thread_infos) {
1573 lldb::tid_t tid;
1574 const size_t n = thread_infos->GetSize();
1575 for (size_t i = 0; i < n; ++i) {
1576 StructuredData::Dictionary *thread_dict =
1577 thread_infos->GetItemAtIndex(i)->GetAsDictionary();
1578 if (thread_dict) {
1579 if (thread_dict->GetValueForKeyAsInteger<lldb::tid_t>(
1580 "tid", tid, LLDB_INVALID_THREAD_ID)) {
1581 if (tid == thread->GetID())
1582 return (bool)SetThreadStopInfo(thread_dict);
1583 }
1584 }
1585 }
1586 }
1587 }
1588 return false;
1589}
1590
1592 // See if we got thread stop infos for all threads via the "jThreadsInfo"
1593 // packet
1595 return true;
1596
1597 // See if we got thread stop info for any threads valid stop info reasons
1598 // threads via the "jstopinfo" packet stop reply packet key/value pair?
1599 if (m_jstopinfo_sp) {
1600 // If we have "jstopinfo" then we have stop descriptions for all threads
1601 // that have stop reasons, and if there is no entry for a thread, then it
1602 // has no stop reason.
1604 // If a thread is stopped at a breakpoint site, set that as the stop
1605 // reason even if it hasn't executed the breakpoint instruction yet.
1606 // We will silently step over the breakpoint when we resume execution
1607 // and miss the fact that this thread hit the breakpoint.
1608 const size_t num_thread_ids = m_thread_ids.size();
1609 for (size_t i = 0; i < num_thread_ids; i++) {
1610 if (m_thread_ids[i] == thread->GetID() && m_thread_pcs.size() > i) {
1611 addr_t pc = m_thread_pcs[i];
1612 lldb::BreakpointSiteSP bp_site_sp =
1613 thread->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
1614 if (bp_site_sp) {
1615 if (bp_site_sp->ValidForThisThread(*thread)) {
1616 thread->SetStopInfo(
1618 *thread, bp_site_sp->GetID()));
1619 return true;
1620 }
1621 }
1622 }
1623 }
1624 thread->SetStopInfo(StopInfoSP());
1625 }
1626 return true;
1627 }
1628
1629 // Fall back to using the qThreadStopInfo packet
1630 StringExtractorGDBRemote stop_packet;
1631 if (GetGDBRemote().GetThreadStopInfo(thread->GetProtocolID(), stop_packet))
1632 return SetThreadStopInfo(stop_packet) == eStateStopped;
1633 return false;
1634}
1635
1637 ExpeditedRegisterMap &expedited_register_map, ThreadSP thread_sp) {
1638 ThreadGDBRemote *gdb_thread = static_cast<ThreadGDBRemote *>(thread_sp.get());
1639 RegisterContextSP gdb_reg_ctx_sp(gdb_thread->GetRegisterContext());
1640
1641 for (const auto &pair : expedited_register_map) {
1642 StringExtractor reg_value_extractor(pair.second);
1643 WritableDataBufferSP buffer_sp(
1644 new DataBufferHeap(reg_value_extractor.GetStringRef().size() / 2, 0));
1645 reg_value_extractor.GetHexBytes(buffer_sp->GetData(), '\xcc');
1646 uint32_t lldb_regnum = gdb_reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1647 eRegisterKindProcessPlugin, pair.first);
1648 gdb_thread->PrivateSetRegisterValue(lldb_regnum, buffer_sp->GetData());
1649 }
1650}
1651
1653 lldb::tid_t tid, ExpeditedRegisterMap &expedited_register_map,
1654 uint8_t signo, const std::string &thread_name, const std::string &reason,
1655 const std::string &description, uint32_t exc_type,
1656 const std::vector<addr_t> &exc_data, addr_t thread_dispatch_qaddr,
1657 bool queue_vars_valid, // Set to true if queue_name, queue_kind and
1658 // queue_serial are valid
1659 LazyBool associated_with_dispatch_queue, addr_t dispatch_queue_t,
1660 std::string &queue_name, QueueKind queue_kind, uint64_t queue_serial) {
1661
1662 if (tid == LLDB_INVALID_THREAD_ID)
1663 return nullptr;
1664
1665 ThreadSP thread_sp;
1666 // Scope for "locker" below
1667 {
1668 // m_thread_list_real does have its own mutex, but we need to hold onto the
1669 // mutex between the call to m_thread_list_real.FindThreadByID(...) and the
1670 // m_thread_list_real.AddThread(...) so it doesn't change on us
1671 std::lock_guard<std::recursive_mutex> guard(m_thread_list_real.GetMutex());
1672 thread_sp = m_thread_list_real.FindThreadByProtocolID(tid, false);
1673
1674 if (!thread_sp) {
1675 // Create the thread if we need to
1676 thread_sp = std::make_shared<ThreadGDBRemote>(*this, tid);
1677 m_thread_list_real.AddThread(thread_sp);
1678 }
1679 }
1680
1681 ThreadGDBRemote *gdb_thread = static_cast<ThreadGDBRemote *>(thread_sp.get());
1682 RegisterContextSP reg_ctx_sp(gdb_thread->GetRegisterContext());
1683
1684 reg_ctx_sp->InvalidateIfNeeded(true);
1685
1686 auto iter = std::find(m_thread_ids.begin(), m_thread_ids.end(), tid);
1687 if (iter != m_thread_ids.end())
1688 SetThreadPc(thread_sp, iter - m_thread_ids.begin());
1689
1690 ParseExpeditedRegisters(expedited_register_map, thread_sp);
1691
1692 if (reg_ctx_sp->ReconfigureRegisterInfo()) {
1693 // Now we have changed the offsets of all the registers, so the values
1694 // will be corrupted.
1695 reg_ctx_sp->InvalidateAllRegisters();
1696 // Expedited registers values will never contain registers that would be
1697 // resized by a reconfigure. So we are safe to continue using these
1698 // values.
1699 ParseExpeditedRegisters(expedited_register_map, thread_sp);
1700 }
1701
1702 thread_sp->SetName(thread_name.empty() ? nullptr : thread_name.c_str());
1703
1704 gdb_thread->SetThreadDispatchQAddr(thread_dispatch_qaddr);
1705 // Check if the GDB server was able to provide the queue name, kind and serial
1706 // number
1707 if (queue_vars_valid)
1708 gdb_thread->SetQueueInfo(std::move(queue_name), queue_kind, queue_serial,
1709 dispatch_queue_t, associated_with_dispatch_queue);
1710 else
1711 gdb_thread->ClearQueueInfo();
1712
1713 gdb_thread->SetAssociatedWithLibdispatchQueue(associated_with_dispatch_queue);
1714
1715 if (dispatch_queue_t != LLDB_INVALID_ADDRESS)
1716 gdb_thread->SetQueueLibdispatchQueueAddress(dispatch_queue_t);
1717
1718 // Make sure we update our thread stop reason just once, but don't overwrite
1719 // the stop info for threads that haven't moved:
1720 StopInfoSP current_stop_info_sp = thread_sp->GetPrivateStopInfo(false);
1721 if (thread_sp->GetTemporaryResumeState() == eStateSuspended &&
1722 current_stop_info_sp) {
1723 thread_sp->SetStopInfo(current_stop_info_sp);
1724 return thread_sp;
1725 }
1726
1727 if (!thread_sp->StopInfoIsUpToDate()) {
1728 thread_sp->SetStopInfo(StopInfoSP());
1729 // If there's a memory thread backed by this thread, we need to use it to
1730 // calculate StopInfo.
1731 if (ThreadSP memory_thread_sp = m_thread_list.GetBackingThread(thread_sp))
1732 thread_sp = memory_thread_sp;
1733
1734 if (exc_type != 0) {
1735 // For thread plan async interrupt, creating stop info on the
1736 // original async interrupt request thread instead. If interrupt thread
1737 // does not exist anymore we fallback to current signal receiving thread
1738 // instead.
1739 ThreadSP interrupt_thread;
1741 interrupt_thread = HandleThreadAsyncInterrupt(signo, description);
1742 if (interrupt_thread)
1743 thread_sp = interrupt_thread;
1744 else {
1745 const size_t exc_data_size = exc_data.size();
1746 thread_sp->SetStopInfo(
1748 *thread_sp, exc_type, exc_data_size,
1749 exc_data_size >= 1 ? exc_data[0] : 0,
1750 exc_data_size >= 2 ? exc_data[1] : 0,
1751 exc_data_size >= 3 ? exc_data[2] : 0));
1752 }
1753 } else {
1754 bool handled = false;
1755 bool did_exec = false;
1756 // debugserver can send reason = "none" which is equivalent
1757 // to no reason.
1758 if (!reason.empty() && reason != "none") {
1759 if (reason == "trace") {
1760 addr_t pc = thread_sp->GetRegisterContext()->GetPC();
1761 lldb::BreakpointSiteSP bp_site_sp =
1762 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
1763 pc);
1764
1765 // If the current pc is a breakpoint site then the StopInfo should be
1766 // set to Breakpoint Otherwise, it will be set to Trace.
1767 if (bp_site_sp && bp_site_sp->ValidForThisThread(*thread_sp)) {
1768 thread_sp->SetStopInfo(
1770 *thread_sp, bp_site_sp->GetID()));
1771 } else
1772 thread_sp->SetStopInfo(
1774 handled = true;
1775 } else if (reason == "breakpoint") {
1776 addr_t pc = thread_sp->GetRegisterContext()->GetPC();
1777 lldb::BreakpointSiteSP bp_site_sp =
1778 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
1779 pc);
1780 if (bp_site_sp) {
1781 // If the breakpoint is for this thread, then we'll report the hit,
1782 // but if it is for another thread, we can just report no reason.
1783 // We don't need to worry about stepping over the breakpoint here,
1784 // that will be taken care of when the thread resumes and notices
1785 // that there's a breakpoint under the pc.
1786 handled = true;
1787 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
1788 thread_sp->SetStopInfo(
1790 *thread_sp, bp_site_sp->GetID()));
1791 } else {
1792 StopInfoSP invalid_stop_info_sp;
1793 thread_sp->SetStopInfo(invalid_stop_info_sp);
1794 }
1795 }
1796 } else if (reason == "trap") {
1797 // Let the trap just use the standard signal stop reason below...
1798 } else if (reason == "watchpoint") {
1799 // We will have between 1 and 3 fields in the description.
1800 //
1801 // \a wp_addr which is the original start address that
1802 // lldb requested be watched, or an address that the
1803 // hardware reported. This address should be within the
1804 // range of a currently active watchpoint region - lldb
1805 // should be able to find a watchpoint with this address.
1806 //
1807 // \a wp_index is the hardware watchpoint register number.
1808 //
1809 // \a wp_hit_addr is the actual address reported by the hardware,
1810 // which may be outside the range of a region we are watching.
1811 //
1812 // On MIPS, we may get a false watchpoint exception where an
1813 // access to the same 8 byte granule as a watchpoint will trigger,
1814 // even if the access was not within the range of the watched
1815 // region. When we get a \a wp_hit_addr outside the range of any
1816 // set watchpoint, continue execution without making it visible to
1817 // the user.
1818 //
1819 // On ARM, a related issue where a large access that starts
1820 // before the watched region (and extends into the watched
1821 // region) may report a hit address before the watched region.
1822 // lldb will not find the "nearest" watchpoint to
1823 // disable/step/re-enable it, so one of the valid watchpoint
1824 // addresses should be provided as \a wp_addr.
1825 StringExtractor desc_extractor(description.c_str());
1826 // FIXME NativeThreadLinux::SetStoppedByWatchpoint sends this
1827 // up as
1828 // <address within wp range> <wp hw index> <actual accessed addr>
1829 // but this is not reading the <wp hw index>. Seems like it
1830 // wouldn't work on MIPS, where that third field is important.
1831 addr_t wp_addr = desc_extractor.GetU64(LLDB_INVALID_ADDRESS);
1832 addr_t wp_hit_addr = desc_extractor.GetU64(LLDB_INVALID_ADDRESS);
1834 bool silently_continue = false;
1835 WatchpointResourceSP wp_resource_sp;
1836 if (wp_hit_addr != LLDB_INVALID_ADDRESS) {
1837 wp_resource_sp =
1839 // On MIPS, \a wp_hit_addr outside the range of a watched
1840 // region means we should silently continue, it is a false hit.
1842 if (!wp_resource_sp && core >= ArchSpec::kCore_mips_first &&
1844 silently_continue = true;
1845 }
1846 if (!wp_resource_sp && wp_addr != LLDB_INVALID_ADDRESS)
1847 wp_resource_sp = m_watchpoint_resource_list.FindByAddress(wp_addr);
1848 if (!wp_resource_sp) {
1850 LLDB_LOGF(log, "failed to find watchpoint");
1851 watch_id = LLDB_INVALID_SITE_ID;
1852 } else {
1853 // LWP_TODO: This is hardcoding a single Watchpoint in a
1854 // Resource, need to add
1855 // StopInfo::CreateStopReasonWithWatchpointResource which
1856 // represents all watchpoints that were tripped at this stop.
1857 watch_id = wp_resource_sp->GetConstituentAtIndex(0)->GetID();
1858 }
1859 thread_sp->SetStopInfo(StopInfo::CreateStopReasonWithWatchpointID(
1860 *thread_sp, watch_id, silently_continue));
1861 handled = true;
1862 } else if (reason == "exception") {
1863 thread_sp->SetStopInfo(StopInfo::CreateStopReasonWithException(
1864 *thread_sp, description.c_str()));
1865 handled = true;
1866 } else if (reason == "exec") {
1867 did_exec = true;
1868 thread_sp->SetStopInfo(
1870 handled = true;
1871 } else if (reason == "processor trace") {
1872 thread_sp->SetStopInfo(StopInfo::CreateStopReasonProcessorTrace(
1873 *thread_sp, description.c_str()));
1874 } else if (reason == "fork") {
1875 StringExtractor desc_extractor(description.c_str());
1876 lldb::pid_t child_pid =
1877 desc_extractor.GetU64(LLDB_INVALID_PROCESS_ID);
1878 lldb::tid_t child_tid = desc_extractor.GetU64(LLDB_INVALID_THREAD_ID);
1879 thread_sp->SetStopInfo(
1880 StopInfo::CreateStopReasonFork(*thread_sp, child_pid, child_tid));
1881 handled = true;
1882 } else if (reason == "vfork") {
1883 StringExtractor desc_extractor(description.c_str());
1884 lldb::pid_t child_pid =
1885 desc_extractor.GetU64(LLDB_INVALID_PROCESS_ID);
1886 lldb::tid_t child_tid = desc_extractor.GetU64(LLDB_INVALID_THREAD_ID);
1887 thread_sp->SetStopInfo(StopInfo::CreateStopReasonVFork(
1888 *thread_sp, child_pid, child_tid));
1889 handled = true;
1890 } else if (reason == "vforkdone") {
1891 thread_sp->SetStopInfo(
1893 handled = true;
1894 }
1895 } else if (!signo) {
1896 addr_t pc = thread_sp->GetRegisterContext()->GetPC();
1897 lldb::BreakpointSiteSP bp_site_sp =
1898 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
1899
1900 // If a thread is stopped at a breakpoint site, set that as the stop
1901 // reason even if it hasn't executed the breakpoint instruction yet.
1902 // We will silently step over the breakpoint when we resume execution
1903 // and miss the fact that this thread hit the breakpoint.
1904 if (bp_site_sp && bp_site_sp->ValidForThisThread(*thread_sp)) {
1906 *thread_sp, bp_site_sp->GetID()));
1907 handled = true;
1908 }
1909 }
1910
1911 if (!handled && signo && !did_exec) {
1912 if (signo == SIGTRAP) {
1913 // Currently we are going to assume SIGTRAP means we are either
1914 // hitting a breakpoint or hardware single stepping.
1915 handled = true;
1916 addr_t pc =
1917 thread_sp->GetRegisterContext()->GetPC() + m_breakpoint_pc_offset;
1918 lldb::BreakpointSiteSP bp_site_sp =
1919 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
1920 pc);
1921
1922 if (bp_site_sp) {
1923 // If the breakpoint is for this thread, then we'll report the hit,
1924 // but if it is for another thread, we can just report no reason.
1925 // We don't need to worry about stepping over the breakpoint here,
1926 // that will be taken care of when the thread resumes and notices
1927 // that there's a breakpoint under the pc.
1928 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
1929 if (m_breakpoint_pc_offset != 0)
1930 thread_sp->GetRegisterContext()->SetPC(pc);
1931 thread_sp->SetStopInfo(
1933 *thread_sp, bp_site_sp->GetID()));
1934 } else {
1935 StopInfoSP invalid_stop_info_sp;
1936 thread_sp->SetStopInfo(invalid_stop_info_sp);
1937 }
1938 } else {
1939 // If we were stepping then assume the stop was the result of the
1940 // trace. If we were not stepping then report the SIGTRAP.
1941 // FIXME: We are still missing the case where we single step over a
1942 // trap instruction.
1943 if (thread_sp->GetTemporaryResumeState() == eStateStepping)
1944 thread_sp->SetStopInfo(
1946 else
1947 thread_sp->SetStopInfo(StopInfo::CreateStopReasonWithSignal(
1948 *thread_sp, signo, description.c_str()));
1949 }
1950 }
1951 if (!handled) {
1952 // For thread plan async interrupt, creating stop info on the
1953 // original async interrupt request thread instead. If interrupt
1954 // thread does not exist anymore we fallback to current signal
1955 // receiving thread instead.
1956 ThreadSP interrupt_thread;
1958 interrupt_thread = HandleThreadAsyncInterrupt(signo, description);
1959 if (interrupt_thread)
1960 thread_sp = interrupt_thread;
1961 else
1962 thread_sp->SetStopInfo(StopInfo::CreateStopReasonWithSignal(
1963 *thread_sp, signo, description.c_str()));
1964 }
1965 }
1966
1967 if (!description.empty()) {
1968 lldb::StopInfoSP stop_info_sp(thread_sp->GetStopInfo());
1969 if (stop_info_sp) {
1970 const char *stop_info_desc = stop_info_sp->GetDescription();
1971 if (!stop_info_desc || !stop_info_desc[0])
1972 stop_info_sp->SetDescription(description.c_str());
1973 } else {
1974 thread_sp->SetStopInfo(StopInfo::CreateStopReasonWithException(
1975 *thread_sp, description.c_str()));
1976 }
1977 }
1978 }
1979 }
1980 return thread_sp;
1981}
1982
1985 const std::string &description) {
1986 ThreadSP thread_sp;
1987 {
1988 std::lock_guard<std::recursive_mutex> guard(m_thread_list_real.GetMutex());
1990 /*can_update=*/false);
1991 }
1992 if (thread_sp)
1993 thread_sp->SetStopInfo(StopInfo::CreateStopReasonWithInterrupt(
1994 *thread_sp, signo, description.c_str()));
1995 // Clear m_interrupt_tid regardless we can find original interrupt thread or
1996 // not.
1998 return thread_sp;
1999}
2000
2003 static constexpr llvm::StringLiteral g_key_tid("tid");
2004 static constexpr llvm::StringLiteral g_key_name("name");
2005 static constexpr llvm::StringLiteral g_key_reason("reason");
2006 static constexpr llvm::StringLiteral g_key_metype("metype");
2007 static constexpr llvm::StringLiteral g_key_medata("medata");
2008 static constexpr llvm::StringLiteral g_key_qaddr("qaddr");
2009 static constexpr llvm::StringLiteral g_key_dispatch_queue_t(
2010 "dispatch_queue_t");
2011 static constexpr llvm::StringLiteral g_key_associated_with_dispatch_queue(
2012 "associated_with_dispatch_queue");
2013 static constexpr llvm::StringLiteral g_key_queue_name("qname");
2014 static constexpr llvm::StringLiteral g_key_queue_kind("qkind");
2015 static constexpr llvm::StringLiteral g_key_queue_serial_number("qserialnum");
2016 static constexpr llvm::StringLiteral g_key_registers("registers");
2017 static constexpr llvm::StringLiteral g_key_memory("memory");
2018 static constexpr llvm::StringLiteral g_key_description("description");
2019 static constexpr llvm::StringLiteral g_key_signal("signal");
2020
2021 // Stop with signal and thread info
2023 uint8_t signo = 0;
2024 std::string value;
2025 std::string thread_name;
2026 std::string reason;
2027 std::string description;
2028 uint32_t exc_type = 0;
2029 std::vector<addr_t> exc_data;
2030 addr_t thread_dispatch_qaddr = LLDB_INVALID_ADDRESS;
2031 ExpeditedRegisterMap expedited_register_map;
2032 bool queue_vars_valid = false;
2033 addr_t dispatch_queue_t = LLDB_INVALID_ADDRESS;
2034 LazyBool associated_with_dispatch_queue = eLazyBoolCalculate;
2035 std::string queue_name;
2036 QueueKind queue_kind = eQueueKindUnknown;
2037 uint64_t queue_serial_number = 0;
2038 // Iterate through all of the thread dictionary key/value pairs from the
2039 // structured data dictionary
2040
2041 // FIXME: we're silently ignoring invalid data here
2042 thread_dict->ForEach([this, &tid, &expedited_register_map, &thread_name,
2043 &signo, &reason, &description, &exc_type, &exc_data,
2044 &thread_dispatch_qaddr, &queue_vars_valid,
2045 &associated_with_dispatch_queue, &dispatch_queue_t,
2046 &queue_name, &queue_kind, &queue_serial_number](
2047 llvm::StringRef key,
2048 StructuredData::Object *object) -> bool {
2049 if (key == g_key_tid) {
2050 // thread in big endian hex
2051 tid = object->GetUnsignedIntegerValue(LLDB_INVALID_THREAD_ID);
2052 } else if (key == g_key_metype) {
2053 // exception type in big endian hex
2054 exc_type = object->GetUnsignedIntegerValue(0);
2055 } else if (key == g_key_medata) {
2056 // exception data in big endian hex
2057 StructuredData::Array *array = object->GetAsArray();
2058 if (array) {
2059 array->ForEach([&exc_data](StructuredData::Object *object) -> bool {
2060 exc_data.push_back(object->GetUnsignedIntegerValue());
2061 return true; // Keep iterating through all array items
2062 });
2063 }
2064 } else if (key == g_key_name) {
2065 thread_name = std::string(object->GetStringValue());
2066 } else if (key == g_key_qaddr) {
2067 thread_dispatch_qaddr =
2068 object->GetUnsignedIntegerValue(LLDB_INVALID_ADDRESS);
2069 } else if (key == g_key_queue_name) {
2070 queue_vars_valid = true;
2071 queue_name = std::string(object->GetStringValue());
2072 } else if (key == g_key_queue_kind) {
2073 std::string queue_kind_str = std::string(object->GetStringValue());
2074 if (queue_kind_str == "serial") {
2075 queue_vars_valid = true;
2076 queue_kind = eQueueKindSerial;
2077 } else if (queue_kind_str == "concurrent") {
2078 queue_vars_valid = true;
2079 queue_kind = eQueueKindConcurrent;
2080 }
2081 } else if (key == g_key_queue_serial_number) {
2082 queue_serial_number = object->GetUnsignedIntegerValue(0);
2083 if (queue_serial_number != 0)
2084 queue_vars_valid = true;
2085 } else if (key == g_key_dispatch_queue_t) {
2086 dispatch_queue_t = object->GetUnsignedIntegerValue(0);
2087 if (dispatch_queue_t != 0 && dispatch_queue_t != LLDB_INVALID_ADDRESS)
2088 queue_vars_valid = true;
2089 } else if (key == g_key_associated_with_dispatch_queue) {
2090 queue_vars_valid = true;
2091 bool associated = object->GetBooleanValue();
2092 if (associated)
2093 associated_with_dispatch_queue = eLazyBoolYes;
2094 else
2095 associated_with_dispatch_queue = eLazyBoolNo;
2096 } else if (key == g_key_reason) {
2097 reason = std::string(object->GetStringValue());
2098 } else if (key == g_key_description) {
2099 description = std::string(object->GetStringValue());
2100 } else if (key == g_key_registers) {
2101 StructuredData::Dictionary *registers_dict = object->GetAsDictionary();
2102
2103 if (registers_dict) {
2104 registers_dict->ForEach(
2105 [&expedited_register_map](llvm::StringRef key,
2106 StructuredData::Object *object) -> bool {
2107 uint32_t reg;
2108 if (llvm::to_integer(key, reg))
2109 expedited_register_map[reg] =
2110 std::string(object->GetStringValue());
2111 return true; // Keep iterating through all array items
2112 });
2113 }
2114 } else if (key == g_key_memory) {
2115 StructuredData::Array *array = object->GetAsArray();
2116 if (array) {
2117 array->ForEach([this](StructuredData::Object *object) -> bool {
2118 StructuredData::Dictionary *mem_cache_dict =
2119 object->GetAsDictionary();
2120 if (mem_cache_dict) {
2121 lldb::addr_t mem_cache_addr = LLDB_INVALID_ADDRESS;
2122 if (mem_cache_dict->GetValueForKeyAsInteger<lldb::addr_t>(
2123 "address", mem_cache_addr)) {
2124 if (mem_cache_addr != LLDB_INVALID_ADDRESS) {
2125 llvm::StringRef str;
2126 if (mem_cache_dict->GetValueForKeyAsString("bytes", str)) {
2127 StringExtractor bytes(str);
2128 bytes.SetFilePos(0);
2129
2130 const size_t byte_size = bytes.GetStringRef().size() / 2;
2131 WritableDataBufferSP data_buffer_sp(
2132 new DataBufferHeap(byte_size, 0));
2133 const size_t bytes_copied =
2134 bytes.GetHexBytes(data_buffer_sp->GetData(), 0);
2135 if (bytes_copied == byte_size)
2136 m_memory_cache.AddL1CacheData(mem_cache_addr,
2137 data_buffer_sp);
2138 }
2139 }
2140 }
2141 }
2142 return true; // Keep iterating through all array items
2143 });
2144 }
2145
2146 } else if (key == g_key_signal)
2147 signo = object->GetUnsignedIntegerValue(LLDB_INVALID_SIGNAL_NUMBER);
2148 return true; // Keep iterating through all dictionary key/value pairs
2149 });
2150
2151 return SetThreadStopInfo(tid, expedited_register_map, signo, thread_name,
2152 reason, description, exc_type, exc_data,
2153 thread_dispatch_qaddr, queue_vars_valid,
2154 associated_with_dispatch_queue, dispatch_queue_t,
2155 queue_name, queue_kind, queue_serial_number);
2156}
2157
2160 stop_packet.SetFilePos(0);
2161 const char stop_type = stop_packet.GetChar();
2162 switch (stop_type) {
2163 case 'T':
2164 case 'S': {
2165 // This is a bit of a hack, but it is required. If we did exec, we need to
2166 // clear our thread lists and also know to rebuild our dynamic register
2167 // info before we lookup and threads and populate the expedited register
2168 // values so we need to know this right away so we can cleanup and update
2169 // our registers.
2170 const uint32_t stop_id = GetStopID();
2171 if (stop_id == 0) {
2172 // Our first stop, make sure we have a process ID, and also make sure we
2173 // know about our registers
2175 SetID(pid);
2177 }
2178 // Stop with signal and thread info
2181 const uint8_t signo = stop_packet.GetHexU8();
2182 llvm::StringRef key;
2183 llvm::StringRef value;
2184 std::string thread_name;
2185 std::string reason;
2186 std::string description;
2187 uint32_t exc_type = 0;
2188 std::vector<addr_t> exc_data;
2189 addr_t thread_dispatch_qaddr = LLDB_INVALID_ADDRESS;
2190 bool queue_vars_valid =
2191 false; // says if locals below that start with "queue_" are valid
2192 addr_t dispatch_queue_t = LLDB_INVALID_ADDRESS;
2193 LazyBool associated_with_dispatch_queue = eLazyBoolCalculate;
2194 std::string queue_name;
2195 QueueKind queue_kind = eQueueKindUnknown;
2196 uint64_t queue_serial_number = 0;
2197 ExpeditedRegisterMap expedited_register_map;
2198 AddressableBits addressable_bits;
2199 while (stop_packet.GetNameColonValue(key, value)) {
2200 if (key.compare("metype") == 0) {
2201 // exception type in big endian hex
2202 value.getAsInteger(16, exc_type);
2203 } else if (key.compare("medata") == 0) {
2204 // exception data in big endian hex
2205 uint64_t x;
2206 value.getAsInteger(16, x);
2207 exc_data.push_back(x);
2208 } else if (key.compare("thread") == 0) {
2209 // thread-id
2210 StringExtractorGDBRemote thread_id{value};
2211 auto pid_tid = thread_id.GetPidTid(pid);
2212 if (pid_tid) {
2213 stop_pid = pid_tid->first;
2214 tid = pid_tid->second;
2215 } else
2217 } else if (key.compare("threads") == 0) {
2218 std::lock_guard<std::recursive_mutex> guard(
2221 } else if (key.compare("thread-pcs") == 0) {
2222 m_thread_pcs.clear();
2223 // A comma separated list of all threads in the current
2224 // process that includes the thread for this stop reply packet
2226 while (!value.empty()) {
2227 llvm::StringRef pc_str;
2228 std::tie(pc_str, value) = value.split(',');
2229 if (pc_str.getAsInteger(16, pc))
2231 m_thread_pcs.push_back(pc);
2232 }
2233 } else if (key.compare("jstopinfo") == 0) {
2234 StringExtractor json_extractor(value);
2235 std::string json;
2236 // Now convert the HEX bytes into a string value
2237 json_extractor.GetHexByteString(json);
2238
2239 // This JSON contains thread IDs and thread stop info for all threads.
2240 // It doesn't contain expedited registers, memory or queue info.
2242 } else if (key.compare("hexname") == 0) {
2243 StringExtractor name_extractor(value);
2244 std::string name;
2245 // Now convert the HEX bytes into a string value
2246 name_extractor.GetHexByteString(thread_name);
2247 } else if (key.compare("name") == 0) {
2248 thread_name = std::string(value);
2249 } else if (key.compare("qaddr") == 0) {
2250 value.getAsInteger(16, thread_dispatch_qaddr);
2251 } else if (key.compare("dispatch_queue_t") == 0) {
2252 queue_vars_valid = true;
2253 value.getAsInteger(16, dispatch_queue_t);
2254 } else if (key.compare("qname") == 0) {
2255 queue_vars_valid = true;
2256 StringExtractor name_extractor(value);
2257 // Now convert the HEX bytes into a string value
2258 name_extractor.GetHexByteString(queue_name);
2259 } else if (key.compare("qkind") == 0) {
2260 queue_kind = llvm::StringSwitch<QueueKind>(value)
2261 .Case("serial", eQueueKindSerial)
2262 .Case("concurrent", eQueueKindConcurrent)
2263 .Default(eQueueKindUnknown);
2264 queue_vars_valid = queue_kind != eQueueKindUnknown;
2265 } else if (key.compare("qserialnum") == 0) {
2266 if (!value.getAsInteger(0, queue_serial_number))
2267 queue_vars_valid = true;
2268 } else if (key.compare("reason") == 0) {
2269 reason = std::string(value);
2270 } else if (key.compare("description") == 0) {
2271 StringExtractor desc_extractor(value);
2272 // Now convert the HEX bytes into a string value
2273 desc_extractor.GetHexByteString(description);
2274 } else if (key.compare("memory") == 0) {
2275 // Expedited memory. GDB servers can choose to send back expedited
2276 // memory that can populate the L1 memory cache in the process so that
2277 // things like the frame pointer backchain can be expedited. This will
2278 // help stack backtracing be more efficient by not having to send as
2279 // many memory read requests down the remote GDB server.
2280
2281 // Key/value pair format: memory:<addr>=<bytes>;
2282 // <addr> is a number whose base will be interpreted by the prefix:
2283 // "0x[0-9a-fA-F]+" for hex
2284 // "0[0-7]+" for octal
2285 // "[1-9]+" for decimal
2286 // <bytes> is native endian ASCII hex bytes just like the register
2287 // values
2288 llvm::StringRef addr_str, bytes_str;
2289 std::tie(addr_str, bytes_str) = value.split('=');
2290 if (!addr_str.empty() && !bytes_str.empty()) {
2291 lldb::addr_t mem_cache_addr = LLDB_INVALID_ADDRESS;
2292 if (!addr_str.getAsInteger(0, mem_cache_addr)) {
2293 StringExtractor bytes(bytes_str);
2294 const size_t byte_size = bytes.GetBytesLeft() / 2;
2295 WritableDataBufferSP data_buffer_sp(
2296 new DataBufferHeap(byte_size, 0));
2297 const size_t bytes_copied =
2298 bytes.GetHexBytes(data_buffer_sp->GetData(), 0);
2299 if (bytes_copied == byte_size)
2300 m_memory_cache.AddL1CacheData(mem_cache_addr, data_buffer_sp);
2301 }
2302 }
2303 } else if (key.compare("watch") == 0 || key.compare("rwatch") == 0 ||
2304 key.compare("awatch") == 0) {
2305 // Support standard GDB remote stop reply packet 'TAAwatch:addr'
2307 value.getAsInteger(16, wp_addr);
2308
2309 WatchpointResourceSP wp_resource_sp =
2311
2312 // Rewrite gdb standard watch/rwatch/awatch to
2313 // "reason:watchpoint" + "description:ADDR",
2314 // which is parsed in SetThreadStopInfo.
2315 reason = "watchpoint";
2316 StreamString ostr;
2317 ostr.Printf("%" PRIu64, wp_addr);
2318 description = std::string(ostr.GetString());
2319 } else if (key.compare("swbreak") == 0 || key.compare("hwbreak") == 0) {
2320 reason = "breakpoint";
2321 } else if (key.compare("library") == 0) {
2322 auto error = LoadModules();
2323 if (error) {
2325 LLDB_LOG_ERROR(log, std::move(error), "Failed to load modules: {0}");
2326 }
2327 } else if (key.compare("fork") == 0 || key.compare("vfork") == 0) {
2328 // fork includes child pid/tid in thread-id format
2329 StringExtractorGDBRemote thread_id{value};
2330 auto pid_tid = thread_id.GetPidTid(LLDB_INVALID_PROCESS_ID);
2331 if (!pid_tid) {
2333 LLDB_LOG(log, "Invalid PID/TID to fork: {0}", value);
2335 }
2336
2337 reason = key.str();
2338 StreamString ostr;
2339 ostr.Printf("%" PRIu64 " %" PRIu64, pid_tid->first, pid_tid->second);
2340 description = std::string(ostr.GetString());
2341 } else if (key.compare("addressing_bits") == 0) {
2342 uint64_t addressing_bits;
2343 if (!value.getAsInteger(0, addressing_bits)) {
2344 addressable_bits.SetAddressableBits(addressing_bits);
2345 }
2346 } else if (key.compare("low_mem_addressing_bits") == 0) {
2347 uint64_t addressing_bits;
2348 if (!value.getAsInteger(0, addressing_bits)) {
2349 addressable_bits.SetLowmemAddressableBits(addressing_bits);
2350 }
2351 } else if (key.compare("high_mem_addressing_bits") == 0) {
2352 uint64_t addressing_bits;
2353 if (!value.getAsInteger(0, addressing_bits)) {
2354 addressable_bits.SetHighmemAddressableBits(addressing_bits);
2355 }
2356 } else if (key.size() == 2 && ::isxdigit(key[0]) && ::isxdigit(key[1])) {
2357 uint32_t reg = UINT32_MAX;
2358 if (!key.getAsInteger(16, reg))
2359 expedited_register_map[reg] = std::string(std::move(value));
2360 }
2361 // swbreak and hwbreak are also expected keys, but we don't need to
2362 // change our behaviour for them because lldb always expects the remote
2363 // to adjust the program counter (if relevant, e.g., for x86 targets)
2364 }
2365
2366 if (stop_pid != LLDB_INVALID_PROCESS_ID && stop_pid != pid) {
2367 Log *log = GetLog(GDBRLog::Process);
2368 LLDB_LOG(log,
2369 "Received stop for incorrect PID = {0} (inferior PID = {1})",
2370 stop_pid, pid);
2371 return eStateInvalid;
2372 }
2373
2374 if (tid == LLDB_INVALID_THREAD_ID) {
2375 // A thread id may be invalid if the response is old style 'S' packet
2376 // which does not provide the
2377 // thread information. So update the thread list and choose the first
2378 // one.
2380
2381 if (!m_thread_ids.empty()) {
2382 tid = m_thread_ids.front();
2383 }
2384 }
2385
2386 SetAddressableBitMasks(addressable_bits);
2387
2388 ThreadSP thread_sp = SetThreadStopInfo(
2389 tid, expedited_register_map, signo, thread_name, reason, description,
2390 exc_type, exc_data, thread_dispatch_qaddr, queue_vars_valid,
2391 associated_with_dispatch_queue, dispatch_queue_t, queue_name,
2392 queue_kind, queue_serial_number);
2393
2394 return eStateStopped;
2395 } break;
2396
2397 case 'W':
2398 case 'X':
2399 // process exited
2400 return eStateExited;
2401
2402 default:
2403 break;
2404 }
2405 return eStateInvalid;
2406}
2407
2409 std::lock_guard<std::recursive_mutex> guard(m_thread_list_real.GetMutex());
2410
2411 m_thread_ids.clear();
2412 m_thread_pcs.clear();
2413
2414 // Set the thread stop info. It might have a "threads" key whose value is a
2415 // list of all thread IDs in the current process, so m_thread_ids might get
2416 // set.
2417 // Check to see if SetThreadStopInfo() filled in m_thread_ids?
2418 if (m_thread_ids.empty()) {
2419 // No, we need to fetch the thread list manually
2421 }
2422
2423 // We might set some stop info's so make sure the thread list is up to
2424 // date before we do that or we might overwrite what was computed here.
2426
2429 m_last_stop_packet.reset();
2430
2431 // If we have queried for a default thread id
2435 }
2436
2437 // Let all threads recover from stopping and do any clean up based on the
2438 // previous thread state (if any).
2440}
2441
2443 Status error;
2444
2446 // We are being asked to halt during an attach. We used to just close our
2447 // file handle and debugserver will go away, but with remote proxies, it
2448 // is better to send a positive signal, so let's send the interrupt first...
2449 caused_stop = m_gdb_comm.Interrupt(GetInterruptTimeout());
2451 } else
2452 caused_stop = m_gdb_comm.Interrupt(GetInterruptTimeout());
2453 return error;
2454}
2455
2457 Status error;
2458 Log *log = GetLog(GDBRLog::Process);
2459 LLDB_LOGF(log, "ProcessGDBRemote::DoDetach(keep_stopped: %i)", keep_stopped);
2460
2461 error = m_gdb_comm.Detach(keep_stopped);
2462 if (log) {
2463 if (error.Success())
2464 log->PutCString(
2465 "ProcessGDBRemote::DoDetach() detach packet sent successfully");
2466 else
2467 LLDB_LOGF(log,
2468 "ProcessGDBRemote::DoDetach() detach packet send failed: %s",
2469 error.AsCString() ? error.AsCString() : "<unknown error>");
2470 }
2471
2472 if (!error.Success())
2473 return error;
2474
2475 // Sleep for one second to let the process get all detached...
2477
2480
2481 // KillDebugserverProcess ();
2482 return error;
2483}
2484
2486 Log *log = GetLog(GDBRLog::Process);
2487 LLDB_LOGF(log, "ProcessGDBRemote::DoDestroy()");
2488
2489 // Interrupt if our inferior is running...
2490 int exit_status = SIGABRT;
2491 std::string exit_string;
2492
2493 if (m_gdb_comm.IsConnected()) {
2495 llvm::Expected<int> kill_res = m_gdb_comm.KillProcess(GetID());
2496
2497 if (kill_res) {
2498 exit_status = kill_res.get();
2499#if defined(__APPLE__)
2500 // For Native processes on Mac OS X, we launch through the Host
2501 // Platform, then hand the process off to debugserver, which becomes
2502 // the parent process through "PT_ATTACH". Then when we go to kill
2503 // the process on Mac OS X we call ptrace(PT_KILL) to kill it, then
2504 // we call waitpid which returns with no error and the correct
2505 // status. But amusingly enough that doesn't seem to actually reap
2506 // the process, but instead it is left around as a Zombie. Probably
2507 // the kernel is in the process of switching ownership back to lldb
2508 // which was the original parent, and gets confused in the handoff.
2509 // Anyway, so call waitpid here to finally reap it.
2510 PlatformSP platform_sp(GetTarget().GetPlatform());
2511 if (platform_sp && platform_sp->IsHost()) {
2512 int status;
2513 ::pid_t reap_pid;
2514 reap_pid = waitpid(GetID(), &status, WNOHANG);
2515 LLDB_LOGF(log, "Reaped pid: %d, status: %d.\n", reap_pid, status);
2516 }
2517#endif
2519 exit_string.assign("killed");
2520 } else {
2521 exit_string.assign(llvm::toString(kill_res.takeError()));
2522 }
2523 } else {
2524 exit_string.assign("killed or interrupted while attaching.");
2525 }
2526 } else {
2527 // If we missed setting the exit status on the way out, do it here.
2528 // NB set exit status can be called multiple times, the first one sets the
2529 // status.
2530 exit_string.assign("destroying when not connected to debugserver");
2531 }
2532
2533 SetExitStatus(exit_status, exit_string.c_str());
2534
2537 return Status();
2538}
2539
2541 const StringExtractorGDBRemote &response) {
2542 const bool did_exec =
2543 response.GetStringRef().find(";reason:exec;") != std::string::npos;
2544 if (did_exec) {
2545 Log *log = GetLog(GDBRLog::Process);
2546 LLDB_LOGF(log, "ProcessGDBRemote::SetLastStopPacket () - detected exec");
2547
2552 }
2553
2554 m_last_stop_packet = response;
2555}
2556
2558 Process::SetUnixSignals(std::make_shared<GDBRemoteSignals>(signals_sp));
2559}
2560
2561// Process Queries
2562
2565}
2566
2568 // request the link map address via the $qShlibInfoAddr packet
2570
2571 // the loaded module list can also provides a link map address
2572 if (addr == LLDB_INVALID_ADDRESS) {
2573 llvm::Expected<LoadedModuleInfoList> list = GetLoadedModuleList();
2574 if (!list) {
2575 Log *log = GetLog(GDBRLog::Process);
2576 LLDB_LOG_ERROR(log, list.takeError(), "Failed to read module list: {0}.");
2577 } else {
2578 addr = list->m_link_map;
2579 }
2580 }
2581
2582 return addr;
2583}
2584
2586 // See if the GDB remote client supports the JSON threads info. If so, we
2587 // gather stop info for all threads, expedited registers, expedited memory,
2588 // runtime queue information (iOS and MacOSX only), and more. Expediting
2589 // memory will help stack backtracing be much faster. Expediting registers
2590 // will make sure we don't have to read the thread registers for GPRs.
2592
2593 if (m_jthreadsinfo_sp) {
2594 // Now set the stop info for each thread and also expedite any registers
2595 // and memory that was in the jThreadsInfo response.
2596 StructuredData::Array *thread_infos = m_jthreadsinfo_sp->GetAsArray();
2597 if (thread_infos) {
2598 const size_t n = thread_infos->GetSize();
2599 for (size_t i = 0; i < n; ++i) {
2600 StructuredData::Dictionary *thread_dict =
2601 thread_infos->GetItemAtIndex(i)->GetAsDictionary();
2602 if (thread_dict)
2603 SetThreadStopInfo(thread_dict);
2604 }
2605 }
2606 }
2607}
2608
2609// Process Memory
2610size_t ProcessGDBRemote::DoReadMemory(addr_t addr, void *buf, size_t size,
2611 Status &error) {
2613 bool binary_memory_read = m_gdb_comm.GetxPacketSupported();
2614 // M and m packets take 2 bytes for 1 byte of memory
2615 size_t max_memory_size =
2616 binary_memory_read ? m_max_memory_size : m_max_memory_size / 2;
2617 if (size > max_memory_size) {
2618 // Keep memory read sizes down to a sane limit. This function will be
2619 // called multiple times in order to complete the task by
2620 // lldb_private::Process so it is ok to do this.
2621 size = max_memory_size;
2622 }
2623
2624 char packet[64];
2625 int packet_len;
2626 packet_len = ::snprintf(packet, sizeof(packet), "%c%" PRIx64 ",%" PRIx64,
2627 binary_memory_read ? 'x' : 'm', (uint64_t)addr,
2628 (uint64_t)size);
2629 assert(packet_len + 1 < (int)sizeof(packet));
2630 UNUSED_IF_ASSERT_DISABLED(packet_len);
2631 StringExtractorGDBRemote response;
2632 if (m_gdb_comm.SendPacketAndWaitForResponse(packet, response,
2635 if (response.IsNormalResponse()) {
2636 error.Clear();
2637 if (binary_memory_read) {
2638 // The lower level GDBRemoteCommunication packet receive layer has
2639 // already de-quoted any 0x7d character escaping that was present in
2640 // the packet
2641
2642 size_t data_received_size = response.GetBytesLeft();
2643 if (data_received_size > size) {
2644 // Don't write past the end of BUF if the remote debug server gave us
2645 // too much data for some reason.
2646 data_received_size = size;
2647 }
2648 memcpy(buf, response.GetStringRef().data(), data_received_size);
2649 return data_received_size;
2650 } else {
2651 return response.GetHexBytes(
2652 llvm::MutableArrayRef<uint8_t>((uint8_t *)buf, size), '\xdd');
2653 }
2654 } else if (response.IsErrorResponse())
2656 "memory read failed for 0x%" PRIx64, addr);
2657 else if (response.IsUnsupportedResponse())
2659 "GDB server does not support reading memory");
2660 else
2662 "unexpected response to GDB server memory read packet '%s': '%s'",
2663 packet, response.GetStringRef().data());
2664 } else {
2665 error = Status::FromErrorStringWithFormat("failed to send packet: '%s'",
2666 packet);
2667 }
2668 return 0;
2669}
2670
2673}
2674
2675llvm::Expected<std::vector<uint8_t>>
2677 int32_t type) {
2678 // By this point ReadMemoryTags has validated that tagging is enabled
2679 // for this target/process/address.
2680 DataBufferSP buffer_sp = m_gdb_comm.ReadMemoryTags(addr, len, type);
2681 if (!buffer_sp) {
2682 return llvm::createStringError(llvm::inconvertibleErrorCode(),
2683 "Error reading memory tags from remote");
2684 }
2685
2686 // Return the raw tag data
2687 llvm::ArrayRef<uint8_t> tag_data = buffer_sp->GetData();
2688 std::vector<uint8_t> got;
2689 got.reserve(tag_data.size());
2690 std::copy(tag_data.begin(), tag_data.end(), std::back_inserter(got));
2691 return got;
2692}
2693
2695 int32_t type,
2696 const std::vector<uint8_t> &tags) {
2697 // By now WriteMemoryTags should have validated that tagging is enabled
2698 // for this target/process.
2699 return m_gdb_comm.WriteMemoryTags(addr, len, type, tags);
2700}
2701
2703 std::vector<ObjectFile::LoadableData> entries) {
2704 Status error;
2705 // Sort the entries by address because some writes, like those to flash
2706 // memory, must happen in order of increasing address.
2707 std::stable_sort(
2708 std::begin(entries), std::end(entries),
2710 return a.Dest < b.Dest;
2711 });
2712 m_allow_flash_writes = true;
2714 if (error.Success())
2715 error = FlashDone();
2716 else
2717 // Even though some of the writing failed, try to send a flash done if some
2718 // of the writing succeeded so the flash state is reset to normal, but
2719 // don't stomp on the error status that was set in the write failure since
2720 // that's the one we want to report back.
2721 FlashDone();
2722 m_allow_flash_writes = false;
2723 return error;
2724}
2725
2727 auto size = m_erased_flash_ranges.GetSize();
2728 for (size_t i = 0; i < size; ++i)
2730 return true;
2731 return false;
2732}
2733
2735 Status status;
2736
2737 MemoryRegionInfo region;
2738 status = GetMemoryRegionInfo(addr, region);
2739 if (!status.Success())
2740 return status;
2741
2742 // The gdb spec doesn't say if erasures are allowed across multiple regions,
2743 // but we'll disallow it to be safe and to keep the logic simple by worring
2744 // about only one region's block size. DoMemoryWrite is this function's
2745 // primary user, and it can easily keep writes within a single memory region
2746 if (addr + size > region.GetRange().GetRangeEnd()) {
2747 status =
2748 Status::FromErrorString("Unable to erase flash in multiple regions");
2749 return status;
2750 }
2751
2752 uint64_t blocksize = region.GetBlocksize();
2753 if (blocksize == 0) {
2754 status =
2755 Status::FromErrorString("Unable to erase flash because blocksize is 0");
2756 return status;
2757 }
2758
2759 // Erasures can only be done on block boundary adresses, so round down addr
2760 // and round up size
2761 lldb::addr_t block_start_addr = addr - (addr % blocksize);
2762 size += (addr - block_start_addr);
2763 if ((size % blocksize) != 0)
2764 size += (blocksize - size % blocksize);
2765
2766 FlashRange range(block_start_addr, size);
2767
2768 if (HasErased(range))
2769 return status;
2770
2771 // We haven't erased the entire range, but we may have erased part of it.
2772 // (e.g., block A is already erased and range starts in A and ends in B). So,
2773 // adjust range if necessary to exclude already erased blocks.
2775 // Assuming that writes and erasures are done in increasing addr order,
2776 // because that is a requirement of the vFlashWrite command. Therefore, we
2777 // only need to look at the last range in the list for overlap.
2778 const auto &last_range = *m_erased_flash_ranges.Back();
2779 if (range.GetRangeBase() < last_range.GetRangeEnd()) {
2780 auto overlap = last_range.GetRangeEnd() - range.GetRangeBase();
2781 // overlap will be less than range.GetByteSize() or else HasErased()
2782 // would have been true
2783 range.SetByteSize(range.GetByteSize() - overlap);
2784 range.SetRangeBase(range.GetRangeBase() + overlap);
2785 }
2786 }
2787
2788 StreamString packet;
2789 packet.Printf("vFlashErase:%" PRIx64 ",%" PRIx64, range.GetRangeBase(),
2790 (uint64_t)range.GetByteSize());
2791
2792 StringExtractorGDBRemote response;
2793 if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetString(), response,
2796 if (response.IsOKResponse()) {
2797 m_erased_flash_ranges.Insert(range, true);
2798 } else {
2799 if (response.IsErrorResponse())
2801 "flash erase failed for 0x%" PRIx64, addr);
2802 else if (response.IsUnsupportedResponse())
2804 "GDB server does not support flashing");
2805 else
2807 "unexpected response to GDB server flash erase packet '%s': '%s'",
2808 packet.GetData(), response.GetStringRef().data());
2809 }
2810 } else {
2811 status = Status::FromErrorStringWithFormat("failed to send packet: '%s'",
2812 packet.GetData());
2813 }
2814 return status;
2815}
2816
2818 Status status;
2819 // If we haven't erased any blocks, then we must not have written anything
2820 // either, so there is no need to actually send a vFlashDone command
2822 return status;
2823 StringExtractorGDBRemote response;
2824 if (m_gdb_comm.SendPacketAndWaitForResponse("vFlashDone", response,
2827 if (response.IsOKResponse()) {
2829 } else {
2830 if (response.IsErrorResponse())
2831 status = Status::FromErrorStringWithFormat("flash done failed");
2832 else if (response.IsUnsupportedResponse())
2834 "GDB server does not support flashing");
2835 else
2837 "unexpected response to GDB server flash done packet: '%s'",
2838 response.GetStringRef().data());
2839 }
2840 } else {
2841 status =
2842 Status::FromErrorStringWithFormat("failed to send flash done packet");
2843 }
2844 return status;
2845}
2846
2847size_t ProcessGDBRemote::DoWriteMemory(addr_t addr, const void *buf,
2848 size_t size, Status &error) {
2850 // M and m packets take 2 bytes for 1 byte of memory
2851 size_t max_memory_size = m_max_memory_size / 2;
2852 if (size > max_memory_size) {
2853 // Keep memory read sizes down to a sane limit. This function will be
2854 // called multiple times in order to complete the task by
2855 // lldb_private::Process so it is ok to do this.
2856 size = max_memory_size;
2857 }
2858
2859 StreamGDBRemote packet;
2860
2861 MemoryRegionInfo region;
2862 Status region_status = GetMemoryRegionInfo(addr, region);
2863
2864 bool is_flash =
2865 region_status.Success() && region.GetFlash() == MemoryRegionInfo::eYes;
2866
2867 if (is_flash) {
2868 if (!m_allow_flash_writes) {
2869 error = Status::FromErrorString("Writing to flash memory is not allowed");
2870 return 0;
2871 }
2872 // Keep the write within a flash memory region
2873 if (addr + size > region.GetRange().GetRangeEnd())
2874 size = region.GetRange().GetRangeEnd() - addr;
2875 // Flash memory must be erased before it can be written
2876 error = FlashErase(addr, size);
2877 if (!error.Success())
2878 return 0;
2879 packet.Printf("vFlashWrite:%" PRIx64 ":", addr);
2880 packet.PutEscapedBytes(buf, size);
2881 } else {
2882 packet.Printf("M%" PRIx64 ",%" PRIx64 ":", addr, (uint64_t)size);
2883 packet.PutBytesAsRawHex8(buf, size, endian::InlHostByteOrder(),
2885 }
2886 StringExtractorGDBRemote response;
2887 if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetString(), response,
2890 if (response.IsOKResponse()) {
2891 error.Clear();
2892 return size;
2893 } else if (response.IsErrorResponse())
2895 "memory write failed for 0x%" PRIx64, addr);
2896 else if (response.IsUnsupportedResponse())
2898 "GDB server does not support writing memory");
2899 else
2901 "unexpected response to GDB server memory write packet '%s': '%s'",
2902 packet.GetData(), response.GetStringRef().data());
2903 } else {
2904 error = Status::FromErrorStringWithFormat("failed to send packet: '%s'",
2905 packet.GetData());
2906 }
2907 return 0;
2908}
2909
2911 uint32_t permissions,
2912 Status &error) {
2914 addr_t allocated_addr = LLDB_INVALID_ADDRESS;
2915
2917 allocated_addr = m_gdb_comm.AllocateMemory(size, permissions);
2918 if (allocated_addr != LLDB_INVALID_ADDRESS ||
2920 return allocated_addr;
2921 }
2922
2924 // Call mmap() to create memory in the inferior..
2925 unsigned prot = 0;
2926 if (permissions & lldb::ePermissionsReadable)
2927 prot |= eMmapProtRead;
2928 if (permissions & lldb::ePermissionsWritable)
2929 prot |= eMmapProtWrite;
2930 if (permissions & lldb::ePermissionsExecutable)
2931 prot |= eMmapProtExec;
2932
2933 if (InferiorCallMmap(this, allocated_addr, 0, size, prot,
2935 m_addr_to_mmap_size[allocated_addr] = size;
2936 else {
2937 allocated_addr = LLDB_INVALID_ADDRESS;
2938 LLDB_LOGF(log,
2939 "ProcessGDBRemote::%s no direct stub support for memory "
2940 "allocation, and InferiorCallMmap also failed - is stub "
2941 "missing register context save/restore capability?",
2942 __FUNCTION__);
2943 }
2944 }
2945
2946 if (allocated_addr == LLDB_INVALID_ADDRESS)
2948 "unable to allocate %" PRIu64 " bytes of memory with permissions %s",
2949 (uint64_t)size, GetPermissionsAsCString(permissions));
2950 else
2951 error.Clear();
2952 return allocated_addr;
2953}
2954
2956 MemoryRegionInfo &region_info) {
2957
2958 Status error(m_gdb_comm.GetMemoryRegionInfo(load_addr, region_info));
2959 return error;
2960}
2961
2964}
2965
2968}
2969
2971 Status error;
2973
2974 switch (supported) {
2975 case eLazyBoolCalculate:
2976 // We should never be deallocating memory without allocating memory first
2977 // so we should never get eLazyBoolCalculate
2979 "tried to deallocate memory without ever allocating memory");
2980 break;
2981
2982 case eLazyBoolYes:
2983 if (!m_gdb_comm.DeallocateMemory(addr))
2985 "unable to deallocate memory at 0x%" PRIx64, addr);
2986 break;
2987
2988 case eLazyBoolNo:
2989 // Call munmap() to deallocate memory in the inferior..
2990 {
2991 MMapMap::iterator pos = m_addr_to_mmap_size.find(addr);
2992 if (pos != m_addr_to_mmap_size.end() &&
2993 InferiorCallMunmap(this, addr, pos->second))
2994 m_addr_to_mmap_size.erase(pos);
2995 else
2997 "unable to deallocate memory at 0x%" PRIx64, addr);
2998 }
2999 break;
3000 }
3001
3002 return error;
3003}
3004
3005// Process STDIO
3006size_t ProcessGDBRemote::PutSTDIN(const char *src, size_t src_len,
3007 Status &error) {
3009 ConnectionStatus status;
3010 m_stdio_communication.WriteAll(src, src_len, status, nullptr);
3011 } else if (m_stdin_forward) {
3012 m_gdb_comm.SendStdinNotification(src, src_len);
3013 }
3014 return 0;
3015}
3016
3018 Status error;
3019 assert(bp_site != nullptr);
3020
3021 // Get logging info
3023 user_id_t site_id = bp_site->GetID();
3024
3025 // Get the breakpoint address
3026 const addr_t addr = bp_site->GetLoadAddress();
3027
3028 // Log that a breakpoint was requested
3029 LLDB_LOGF(log,
3030 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3031 ") address = 0x%" PRIx64,
3032 site_id, (uint64_t)addr);
3033
3034 // Breakpoint already exists and is enabled
3035 if (bp_site->IsEnabled()) {
3036 LLDB_LOGF(log,
3037 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3038 ") address = 0x%" PRIx64 " -- SUCCESS (already enabled)",
3039 site_id, (uint64_t)addr);
3040 return error;
3041 }
3042
3043 // Get the software breakpoint trap opcode size
3044 const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode(bp_site);
3045
3046 // SupportsGDBStoppointPacket() simply checks a boolean, indicating if this
3047 // breakpoint type is supported by the remote stub. These are set to true by
3048 // default, and later set to false only after we receive an unimplemented
3049 // response when sending a breakpoint packet. This means initially that
3050 // unless we were specifically instructed to use a hardware breakpoint, LLDB
3051 // will attempt to set a software breakpoint. HardwareRequired() also queries
3052 // a boolean variable which indicates if the user specifically asked for
3053 // hardware breakpoints. If true then we will skip over software
3054 // breakpoints.
3056 (!bp_site->HardwareRequired())) {
3057 // Try to send off a software breakpoint packet ($Z0)
3058 uint8_t error_no = m_gdb_comm.SendGDBStoppointTypePacket(
3059 eBreakpointSoftware, true, addr, bp_op_size, GetInterruptTimeout());
3060 if (error_no == 0) {
3061 // The breakpoint was placed successfully
3062 bp_site->SetEnabled(true);
3064 return error;
3065 }
3066
3067 // SendGDBStoppointTypePacket() will return an error if it was unable to
3068 // set this breakpoint. We need to differentiate between a error specific
3069 // to placing this breakpoint or if we have learned that this breakpoint
3070 // type is unsupported. To do this, we must test the support boolean for
3071 // this breakpoint type to see if it now indicates that this breakpoint
3072 // type is unsupported. If they are still supported then we should return
3073 // with the error code. If they are now unsupported, then we would like to
3074 // fall through and try another form of breakpoint.
3076 if (error_no != UINT8_MAX)
3078 "error: %d sending the breakpoint request", error_no);
3079 else
3080 error = Status::FromErrorString("error sending the breakpoint request");
3081 return error;
3082 }
3083
3084 // We reach here when software breakpoints have been found to be
3085 // unsupported. For future calls to set a breakpoint, we will not attempt
3086 // to set a breakpoint with a type that is known not to be supported.
3087 LLDB_LOGF(log, "Software breakpoints are unsupported");
3088
3089 // So we will fall through and try a hardware breakpoint
3090 }
3091
3092 // The process of setting a hardware breakpoint is much the same as above.
3093 // We check the supported boolean for this breakpoint type, and if it is
3094 // thought to be supported then we will try to set this breakpoint with a
3095 // hardware breakpoint.
3097 // Try to send off a hardware breakpoint packet ($Z1)
3098 uint8_t error_no = m_gdb_comm.SendGDBStoppointTypePacket(
3099 eBreakpointHardware, true, addr, bp_op_size, GetInterruptTimeout());
3100 if (error_no == 0) {
3101 // The breakpoint was placed successfully
3102 bp_site->SetEnabled(true);
3104 return error;
3105 }
3106
3107 // Check if the error was something other then an unsupported breakpoint
3108 // type
3110 // Unable to set this hardware breakpoint
3111 if (error_no != UINT8_MAX)
3113 "error: %d sending the hardware breakpoint request "
3114 "(hardware breakpoint resources might be exhausted or unavailable)",
3115 error_no);
3116 else
3118 "error sending the hardware breakpoint request "
3119 "(hardware breakpoint resources "
3120 "might be exhausted or unavailable)");
3121 return error;
3122 }
3123
3124 // We will reach here when the stub gives an unsupported response to a
3125 // hardware breakpoint
3126 LLDB_LOGF(log, "Hardware breakpoints are unsupported");
3127
3128 // Finally we will falling through to a #trap style breakpoint
3129 }
3130
3131 // Don't fall through when hardware breakpoints were specifically requested
3132 if (bp_site->HardwareRequired()) {
3133 error = Status::FromErrorString("hardware breakpoints are not supported");
3134 return error;
3135 }
3136
3137 // As a last resort we want to place a manual breakpoint. An instruction is
3138 // placed into the process memory using memory write packets.
3139 return EnableSoftwareBreakpoint(bp_site);
3140}
3141
3143 Status error;
3144 assert(bp_site != nullptr);
3145 addr_t addr = bp_site->GetLoadAddress();
3146 user_id_t site_id = bp_site->GetID();
3148 LLDB_LOGF(log,
3149 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3150 ") addr = 0x%8.8" PRIx64,
3151 site_id, (uint64_t)addr);
3152
3153 if (bp_site->IsEnabled()) {
3154 const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode(bp_site);
3155
3156 BreakpointSite::Type bp_type = bp_site->GetType();
3157 switch (bp_type) {
3160 break;
3161
3164 addr, bp_op_size,
3166 error = Status::FromErrorString("unknown error");
3167 break;
3168
3171 addr, bp_op_size,
3173 error = Status::FromErrorString("unknown error");
3174 } break;
3175 }
3176 if (error.Success())
3177 bp_site->SetEnabled(false);
3178 } else {
3179 LLDB_LOGF(log,
3180 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3181 ") addr = 0x%8.8" PRIx64 " -- SUCCESS (already disabled)",
3182 site_id, (uint64_t)addr);
3183 return error;
3184 }
3185
3186 if (error.Success())
3187 error = Status::FromErrorString("unknown error");
3188 return error;
3189}
3190
3191// Pre-requisite: wp != NULL.
3192static GDBStoppointType
3194 assert(wp_res_sp);
3195 bool read = wp_res_sp->WatchpointResourceRead();
3196 bool write = wp_res_sp->WatchpointResourceWrite();
3197
3198 assert((read || write) &&
3199 "WatchpointResource type is neither read nor write");
3200 if (read && write)
3201 return eWatchpointReadWrite;
3202 else if (read)
3203 return eWatchpointRead;
3204 else
3205 return eWatchpointWrite;
3206}
3207
3209 Status error;
3210 if (!wp_sp) {
3211 error = Status::FromErrorString("No watchpoint specified");
3212 return error;
3213 }
3214 user_id_t watchID = wp_sp->GetID();
3215 addr_t addr = wp_sp->GetLoadAddress();
3217 LLDB_LOGF(log, "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64 ")",
3218 watchID);
3219 if (wp_sp->IsEnabled()) {
3220 LLDB_LOGF(log,
3221 "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
3222 ") addr = 0x%8.8" PRIx64 ": watchpoint already enabled.",
3223 watchID, (uint64_t)addr);
3224 return error;
3225 }
3226
3227 bool read = wp_sp->WatchpointRead();
3228 bool write = wp_sp->WatchpointWrite() || wp_sp->WatchpointModify();
3229 size_t size = wp_sp->GetByteSize();
3230
3231 ArchSpec target_arch = GetTarget().GetArchitecture();
3232 WatchpointHardwareFeature supported_features =
3234
3235 std::vector<WatchpointResourceSP> resources =
3237 addr, size, read, write, supported_features, target_arch);
3238
3239 // LWP_TODO: Now that we know the WP Resources needed to implement this
3240 // Watchpoint, we need to look at currently allocated Resources in the
3241 // Process and if they match, or are within the same memory granule, or
3242 // overlapping memory ranges, then we need to combine them. e.g. one
3243 // Watchpoint watching 1 byte at 0x1002 and a second watchpoint watching 1
3244 // byte at 0x1003, they must use the same hardware watchpoint register
3245 // (Resource) to watch them.
3246
3247 // This may mean that an existing resource changes its type (read to
3248 // read+write) or address range it is watching, in which case the old
3249 // watchpoint needs to be disabled and the new Resource addr/size/type
3250 // watchpoint enabled.
3251
3252 // If we modify a shared Resource to accomodate this newly added Watchpoint,
3253 // and we are unable to set all of the Resources for it in the inferior, we
3254 // will return an error for this Watchpoint and the shared Resource should
3255 // be restored. e.g. this Watchpoint requires three Resources, one which
3256 // is shared with another Watchpoint. We extend the shared Resouce to
3257 // handle both Watchpoints and we try to set two new ones. But if we don't
3258 // have sufficient watchpoint register for all 3, we need to show an error
3259 // for creating this Watchpoint and we should reset the shared Resource to
3260 // its original configuration because it is no longer shared.
3261
3262 bool set_all_resources = true;
3263 std::vector<WatchpointResourceSP> succesfully_set_resources;
3264 for (const auto &wp_res_sp : resources) {
3265 addr_t addr = wp_res_sp->GetLoadAddress();
3266 size_t size = wp_res_sp->GetByteSize();
3267 GDBStoppointType type = GetGDBStoppointType(wp_res_sp);
3269 m_gdb_comm.SendGDBStoppointTypePacket(type, true, addr, size,
3271 set_all_resources = false;
3272 break;
3273 } else {
3274 succesfully_set_resources.push_back(wp_res_sp);
3275 }
3276 }
3277 if (set_all_resources) {
3278 wp_sp->SetEnabled(true, notify);
3279 for (const auto &wp_res_sp : resources) {
3280 // LWP_TODO: If we expanded/reused an existing Resource,
3281 // it's already in the WatchpointResourceList.
3282 wp_res_sp->AddConstituent(wp_sp);
3284 }
3285 return error;
3286 } else {
3287 // We failed to allocate one of the resources. Unset all
3288 // of the new resources we did successfully set in the
3289 // process.
3290 for (const auto &wp_res_sp : succesfully_set_resources) {
3291 addr_t addr = wp_res_sp->GetLoadAddress();
3292 size_t size = wp_res_sp->GetByteSize();
3293 GDBStoppointType type = GetGDBStoppointType(wp_res_sp);
3294 m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr, size,
3296 }
3298 "Setting one of the watchpoint resources failed");
3299 }
3300 return error;
3301}
3302
3304 Status error;
3305 if (!wp_sp) {
3306 error = Status::FromErrorString("Watchpoint argument was NULL.");
3307 return error;
3308 }
3309
3310 user_id_t watchID = wp_sp->GetID();
3311
3313
3314 addr_t addr = wp_sp->GetLoadAddress();
3315
3316 LLDB_LOGF(log,
3317 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3318 ") addr = 0x%8.8" PRIx64,
3319 watchID, (uint64_t)addr);
3320
3321 if (!wp_sp->IsEnabled()) {
3322 LLDB_LOGF(log,
3323 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3324 ") addr = 0x%8.8" PRIx64 " -- SUCCESS (already disabled)",
3325 watchID, (uint64_t)addr);
3326 // See also 'class WatchpointSentry' within StopInfo.cpp. This disabling
3327 // attempt might come from the user-supplied actions, we'll route it in
3328 // order for the watchpoint object to intelligently process this action.
3329 wp_sp->SetEnabled(false, notify);
3330 return error;
3331 }
3332
3333 if (wp_sp->IsHardware()) {
3334 bool disabled_all = true;
3335
3336 std::vector<WatchpointResourceSP> unused_resources;
3337 for (const auto &wp_res_sp : m_watchpoint_resource_list.Sites()) {
3338 if (wp_res_sp->ConstituentsContains(wp_sp)) {
3339 GDBStoppointType type = GetGDBStoppointType(wp_res_sp);
3340 addr_t addr = wp_res_sp->GetLoadAddress();
3341 size_t size = wp_res_sp->GetByteSize();
3342 if (m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr, size,
3344 disabled_all = false;
3345 } else {
3346 wp_res_sp->RemoveConstituent(wp_sp);
3347 if (wp_res_sp->GetNumberOfConstituents() == 0)
3348 unused_resources.push_back(wp_res_sp);
3349 }
3350 }
3351 }
3352 for (auto &wp_res_sp : unused_resources)
3353 m_watchpoint_resource_list.Remove(wp_res_sp->GetID());
3354
3355 wp_sp->SetEnabled(false, notify);
3356 if (!disabled_all)
3358 "Failure disabling one of the watchpoint locations");
3359 }
3360 return error;
3361}
3362
3366}
3367
3369 Status error;
3370 Log *log = GetLog(GDBRLog::Process);
3371 LLDB_LOGF(log, "ProcessGDBRemote::DoSignal (signal = %d)", signo);
3372
3374 error =
3375 Status::FromErrorStringWithFormat("failed to send signal %i", signo);
3376 return error;
3377}
3378
3379Status
3381 // Make sure we aren't already connected?
3382 if (m_gdb_comm.IsConnected())
3383 return Status();
3384
3385 PlatformSP platform_sp(GetTarget().GetPlatform());
3386 if (platform_sp && !platform_sp->IsHost())
3387 return Status::FromErrorString("Lost debug server connection");
3388
3389 auto error = LaunchAndConnectToDebugserver(process_info);
3390 if (error.Fail()) {
3391 const char *error_string = error.AsCString();
3392 if (error_string == nullptr)
3393 error_string = "unable to launch " DEBUGSERVER_BASENAME;
3394 }
3395 return error;
3396}
3397#if !defined(_WIN32)
3398#define USE_SOCKETPAIR_FOR_LOCAL_CONNECTION 1
3399#endif
3400
3401#ifdef USE_SOCKETPAIR_FOR_LOCAL_CONNECTION
3402static bool SetCloexecFlag(int fd) {
3403#if defined(FD_CLOEXEC)
3404 int flags = ::fcntl(fd, F_GETFD);
3405 if (flags == -1)
3406 return false;
3407 return (::fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == 0);
3408#else
3409 return false;
3410#endif
3411}
3412#endif
3413
3415 const ProcessInfo &process_info) {
3416 using namespace std::placeholders; // For _1, _2, etc.
3417
3418 Status error;
3420 // If we locate debugserver, keep that located version around
3421 static FileSpec g_debugserver_file_spec;
3422
3423 ProcessLaunchInfo debugserver_launch_info;
3424 // Make debugserver run in its own session so signals generated by special
3425 // terminal key sequences (^C) don't affect debugserver.
3426 debugserver_launch_info.SetLaunchInSeparateProcessGroup(true);
3427
3428 const std::weak_ptr<ProcessGDBRemote> this_wp =
3429 std::static_pointer_cast<ProcessGDBRemote>(shared_from_this());
3430 debugserver_launch_info.SetMonitorProcessCallback(
3431 std::bind(MonitorDebugserverProcess, this_wp, _1, _2, _3));
3432 debugserver_launch_info.SetUserID(process_info.GetUserID());
3433
3434#if defined(__APPLE__)
3435 // On macOS 11, we need to support x86_64 applications translated to
3436 // arm64. We check whether a binary is translated and spawn the correct
3437 // debugserver accordingly.
3438 int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID,
3439 static_cast<int>(process_info.GetProcessID()) };
3440 struct kinfo_proc processInfo;
3441 size_t bufsize = sizeof(processInfo);
3442 if (sysctl(mib, (unsigned)(sizeof(mib)/sizeof(int)), &processInfo,
3443 &bufsize, NULL, 0) == 0 && bufsize > 0) {
3444 if (processInfo.kp_proc.p_flag & P_TRANSLATED) {
3445 FileSpec rosetta_debugserver("/Library/Apple/usr/libexec/oah/debugserver");
3446 debugserver_launch_info.SetExecutableFile(rosetta_debugserver, false);
3447 }
3448 }
3449#endif
3450
3451 shared_fd_t communication_fd = SharedSocket::kInvalidFD;
3452#ifdef USE_SOCKETPAIR_FOR_LOCAL_CONNECTION
3453 // Use a socketpair on non-Windows systems for security and performance
3454 // reasons.
3455 int sockets[2]; /* the pair of socket descriptors */
3456 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) {
3458 return error;
3459 }
3460
3461 int our_socket = sockets[0];
3462 int gdb_socket = sockets[1];
3463 auto cleanup_our = llvm::make_scope_exit([&]() { close(our_socket); });
3464 auto cleanup_gdb = llvm::make_scope_exit([&]() { close(gdb_socket); });
3465
3466 // Don't let any child processes inherit our communication socket
3467 SetCloexecFlag(our_socket);
3468 communication_fd = gdb_socket;
3469#endif
3470
3472 nullptr, GetTarget().GetPlatform().get(), debugserver_launch_info,
3473 nullptr, nullptr, communication_fd);
3474
3475 if (error.Success())
3476 m_debugserver_pid = debugserver_launch_info.GetProcessID();
3477 else
3479
3481#ifdef USE_SOCKETPAIR_FOR_LOCAL_CONNECTION
3482 // Our process spawned correctly, we can now set our connection to use
3483 // our end of the socket pair
3484 cleanup_our.release();
3486 std::make_unique<ConnectionFileDescriptor>(our_socket, true));
3487#endif
3489 }
3490
3491 if (error.Fail()) {
3492 Log *log = GetLog(GDBRLog::Process);
3493
3494 LLDB_LOGF(log, "failed to start debugserver process: %s",
3495 error.AsCString());
3496 return error;
3497 }
3498
3499 if (m_gdb_comm.IsConnected()) {
3500 // Finish the connection process by doing the handshake without
3501 // connecting (send NULL URL)
3503 } else {
3504 error = Status::FromErrorString("connection failed");
3505 }
3506 }
3507 return error;
3508}
3509
3511 std::weak_ptr<ProcessGDBRemote> process_wp, lldb::pid_t debugserver_pid,
3512 int signo, // Zero for no signal
3513 int exit_status // Exit value of process if signal is zero
3514) {
3515 // "debugserver_pid" argument passed in is the process ID for debugserver
3516 // that we are tracking...
3517 Log *log = GetLog(GDBRLog::Process);
3518
3519 LLDB_LOGF(log,
3520 "ProcessGDBRemote::%s(process_wp, pid=%" PRIu64
3521 ", signo=%i (0x%x), exit_status=%i)",
3522 __FUNCTION__, debugserver_pid, signo, signo, exit_status);
3523
3524 std::shared_ptr<ProcessGDBRemote> process_sp = process_wp.lock();
3525 LLDB_LOGF(log, "ProcessGDBRemote::%s(process = %p)", __FUNCTION__,
3526 static_cast<void *>(process_sp.get()));
3527 if (!process_sp || process_sp->m_debugserver_pid != debugserver_pid)
3528 return;
3529
3530 // Sleep for a half a second to make sure our inferior process has time to
3531 // set its exit status before we set it incorrectly when both the debugserver
3532 // and the inferior process shut down.
3533 std::this_thread::sleep_for(std::chrono::milliseconds(500));
3534
3535 // If our process hasn't yet exited, debugserver might have died. If the
3536 // process did exit, then we are reaping it.
3537 const StateType state = process_sp->GetState();
3538
3539 if (state != eStateInvalid && state != eStateUnloaded &&
3540 state != eStateExited && state != eStateDetached) {
3541 StreamString stream;
3542 if (signo == 0)
3543 stream.Format(DEBUGSERVER_BASENAME " died with an exit status of {0:x8}",
3544 exit_status);
3545 else {
3546 llvm::StringRef signal_name =
3547 process_sp->GetUnixSignals()->GetSignalAsStringRef(signo);
3548 const char *format_str = DEBUGSERVER_BASENAME " died with signal {0}";
3549 if (!signal_name.empty())
3550 stream.Format(format_str, signal_name);
3551 else
3552 stream.Format(format_str, signo);
3553 }
3554 process_sp->SetExitStatus(-1, stream.GetString());
3555 }
3556 // Debugserver has exited we need to let our ProcessGDBRemote know that it no
3557 // longer has a debugserver instance
3558 process_sp->m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
3559}
3560
3566 }
3567}
3568
3570 static llvm::once_flag g_once_flag;
3571
3572 llvm::call_once(g_once_flag, []() {
3576 });
3577}
3578
3581 debugger, PluginProperties::GetSettingName())) {
3582 const bool is_global_setting = true;
3585 "Properties for the gdb-remote process plug-in.", is_global_setting);
3586 }
3587}
3588
3590 Log *log = GetLog(GDBRLog::Process);
3591
3592 LLDB_LOGF(log, "ProcessGDBRemote::%s ()", __FUNCTION__);
3593
3594 std::lock_guard<std::recursive_mutex> guard(m_async_thread_state_mutex);
3595 if (!m_async_thread.IsJoinable()) {
3596 // Create a thread that watches our internal state and controls which
3597 // events make it to clients (into the DCProcess event queue).
3598
3599 llvm::Expected<HostThread> async_thread =
3600 ThreadLauncher::LaunchThread("<lldb.process.gdb-remote.async>", [this] {
3602 });
3603 if (!async_thread) {
3604 LLDB_LOG_ERROR(GetLog(LLDBLog::Host), async_thread.takeError(),
3605 "failed to launch host thread: {0}");
3606 return false;
3607 }
3608 m_async_thread = *async_thread;
3609 } else
3610 LLDB_LOGF(log,
3611 "ProcessGDBRemote::%s () - Called when Async thread was "
3612 "already running.",
3613 __FUNCTION__);
3614
3615 return m_async_thread.IsJoinable();
3616}
3617
3619 Log *log = GetLog(GDBRLog::Process);
3620
3621 LLDB_LOGF(log, "ProcessGDBRemote::%s ()", __FUNCTION__);
3622
3623 std::lock_guard<std::recursive_mutex> guard(m_async_thread_state_mutex);
3624 if (m_async_thread.IsJoinable()) {
3626
3627 // This will shut down the async thread.
3628 m_gdb_comm.Disconnect(); // Disconnect from the debug server.
3629
3630 // Stop the stdio thread
3631 m_async_thread.Join(nullptr);
3633 } else
3634 LLDB_LOGF(
3635 log,
3636 "ProcessGDBRemote::%s () - Called when Async thread was not running.",
3637 __FUNCTION__);
3638}
3639
3641 Log *log = GetLog(GDBRLog::Process);
3642 LLDB_LOGF(log, "ProcessGDBRemote::%s(pid = %" PRIu64 ") thread starting...",
3643 __FUNCTION__, GetID());
3644
3645 EventSP event_sp;
3646
3647 // We need to ignore any packets that come in after we have
3648 // have decided the process has exited. There are some
3649 // situations, for instance when we try to interrupt a running
3650 // process and the interrupt fails, where another packet might
3651 // get delivered after we've decided to give up on the process.
3652 // But once we've decided we are done with the process we will
3653 // not be in a state to do anything useful with new packets.
3654 // So it is safer to simply ignore any remaining packets by
3655 // explicitly checking for eStateExited before reentering the
3656 // fetch loop.
3657
3658 bool done = false;
3659 while (!done && GetPrivateState() != eStateExited) {
3660 LLDB_LOGF(log,
3661 "ProcessGDBRemote::%s(pid = %" PRIu64
3662 ") listener.WaitForEvent (NULL, event_sp)...",
3663 __FUNCTION__, GetID());
3664
3665 if (m_async_listener_sp->GetEvent(event_sp, std::nullopt)) {
3666 const uint32_t event_type = event_sp->GetType();
3667 if (event_sp->BroadcasterIs(&m_async_broadcaster)) {
3668 LLDB_LOGF(log,
3669 "ProcessGDBRemote::%s(pid = %" PRIu64
3670 ") Got an event of type: %d...",
3671 __FUNCTION__, GetID(), event_type);
3672
3673 switch (event_type) {
3675 const EventDataBytes *continue_packet =
3677
3678 if (continue_packet) {
3679 const char *continue_cstr =
3680 (const char *)continue_packet->GetBytes();
3681 const size_t continue_cstr_len = continue_packet->GetByteSize();
3682 LLDB_LOGF(log,
3683 "ProcessGDBRemote::%s(pid = %" PRIu64
3684 ") got eBroadcastBitAsyncContinue: %s",
3685 __FUNCTION__, GetID(), continue_cstr);
3686
3687 if (::strstr(continue_cstr, "vAttach") == nullptr)
3689 StringExtractorGDBRemote response;
3690
3691 StateType stop_state =
3693 *this, *GetUnixSignals(),
3694 llvm::StringRef(continue_cstr, continue_cstr_len),
3695 GetInterruptTimeout(), response);
3696
3697 // We need to immediately clear the thread ID list so we are sure
3698 // to get a valid list of threads. The thread ID list might be
3699 // contained within the "response", or the stop reply packet that
3700 // caused the stop. So clear it now before we give the stop reply
3701 // packet to the process using the
3702 // SetLastStopPacket()...
3704
3705 switch (stop_state) {
3706 case eStateStopped:
3707 case eStateCrashed:
3708 case eStateSuspended:
3709 SetLastStopPacket(response);
3710 SetPrivateState(stop_state);
3711 break;
3712
3713 case eStateExited: {
3714 SetLastStopPacket(response);
3716 response.SetFilePos(1);
3717
3718 int exit_status = response.GetHexU8();
3719 std::string desc_string;
3720 if (response.GetBytesLeft() > 0 && response.GetChar('-') == ';') {
3721 llvm::StringRef desc_str;
3722 llvm::StringRef desc_token;
3723 while (response.GetNameColonValue(desc_token, desc_str)) {
3724 if (desc_token != "description")
3725 continue;
3726 StringExtractor extractor(desc_str);
3727 extractor.GetHexByteString(desc_string);
3728 }
3729 }
3730 SetExitStatus(exit_status, desc_string.c_str());
3731 done = true;
3732 break;
3733 }
3734 case eStateInvalid: {
3735 // Check to see if we were trying to attach and if we got back
3736 // the "E87" error code from debugserver -- this indicates that
3737 // the process is not debuggable. Return a slightly more
3738 // helpful error message about why the attach failed.
3739 if (::strstr(continue_cstr, "vAttach") != nullptr &&
3740 response.GetError() == 0x87) {
3741 SetExitStatus(-1, "cannot attach to process due to "
3742 "System Integrity Protection");
3743 } else if (::strstr(continue_cstr, "vAttach") != nullptr &&
3744 response.GetStatus().Fail()) {
3745 SetExitStatus(-1, response.GetStatus().AsCString());
3746 } else {
3747 SetExitStatus(-1, "lost connection");
3748 }
3749 done = true;
3750 break;
3751 }
3752
3753 default:
3754 SetPrivateState(stop_state);
3755 break;
3756 } // switch(stop_state)
3757 } // if (continue_packet)
3758 } // case eBroadcastBitAsyncContinue
3759 break;
3760
3762 LLDB_LOGF(log,
3763 "ProcessGDBRemote::%s(pid = %" PRIu64
3764 ") got eBroadcastBitAsyncThreadShouldExit...",
3765 __FUNCTION__, GetID());
3766 done = true;
3767 break;
3768
3769 default:
3770 LLDB_LOGF(log,
3771 "ProcessGDBRemote::%s(pid = %" PRIu64
3772 ") got unknown event 0x%8.8x",
3773 __FUNCTION__, GetID(), event_type);
3774 done = true;
3775 break;
3776 }
3777 }
3778 } else {
3779 LLDB_LOGF(log,
3780 "ProcessGDBRemote::%s(pid = %" PRIu64
3781 ") listener.WaitForEvent (NULL, event_sp) => false",
3782 __FUNCTION__, GetID());
3783 done = true;
3784 }
3785 }
3786
3787 LLDB_LOGF(log, "ProcessGDBRemote::%s(pid = %" PRIu64 ") thread exiting...",
3788 __FUNCTION__, GetID());
3789
3790 return {};
3791}
3792
3793// uint32_t
3794// ProcessGDBRemote::ListProcessesMatchingName (const char *name, StringList
3795// &matches, std::vector<lldb::pid_t> &pids)
3796//{
3797// // If we are planning to launch the debugserver remotely, then we need to
3798// fire up a debugserver
3799// // process and ask it for the list of processes. But if we are local, we
3800// can let the Host do it.
3801// if (m_local_debugserver)
3802// {
3803// return Host::ListProcessesMatchingName (name, matches, pids);
3804// }
3805// else
3806// {
3807// // FIXME: Implement talking to the remote debugserver.
3808// return 0;
3809// }
3810//
3811//}
3812//
3814 void *baton, StoppointCallbackContext *context, lldb::user_id_t break_id,
3815 lldb::user_id_t break_loc_id) {
3816 // I don't think I have to do anything here, just make sure I notice the new
3817 // thread when it starts to
3818 // run so I can stop it if that's what I want to do.
3819 Log *log = GetLog(LLDBLog::Step);
3820 LLDB_LOGF(log, "Hit New Thread Notification breakpoint.");
3821 return false;
3822}
3823
3825 Log *log = GetLog(GDBRLog::Process);
3826 LLDB_LOG(log, "Check if need to update ignored signals");
3827
3828 // QPassSignals package is not supported by the server, there is no way we
3829 // can ignore any signals on server side.
3831 return Status();
3832
3833 // No signals, nothing to send.
3834 if (m_unix_signals_sp == nullptr)
3835 return Status();
3836
3837 // Signals' version hasn't changed, no need to send anything.
3838 uint64_t new_signals_version = m_unix_signals_sp->GetVersion();
3839 if (new_signals_version == m_last_signals_version) {
3840 LLDB_LOG(log, "Signals' version hasn't changed. version={0}",
3842 return Status();
3843 }
3844
3845 auto signals_to_ignore =
3846 m_unix_signals_sp->GetFilteredSignals(false, false, false);
3847 Status error = m_gdb_comm.SendSignalsToIgnore(signals_to_ignore);
3848
3849 LLDB_LOG(log,
3850 "Signals' version changed. old version={0}, new version={1}, "
3851 "signals ignored={2}, update result={3}",
3852 m_last_signals_version, new_signals_version,
3853 signals_to_ignore.size(), error);
3854
3855 if (error.Success())
3856 m_last_signals_version = new_signals_version;
3857
3858 return error;
3859}
3860
3862 Log *log = GetLog(LLDBLog::Step);
3864 if (log && log->GetVerbose())
3865 LLDB_LOGF(log, "Enabled noticing new thread breakpoint.");
3866 m_thread_create_bp_sp->SetEnabled(true);
3867 } else {
3868 PlatformSP platform_sp(GetTarget().GetPlatform());
3869 if (platform_sp) {
3871 platform_sp->SetThreadCreationBreakpoint(GetTarget());
3873 if (log && log->GetVerbose())
3874 LLDB_LOGF(
3875 log, "Successfully created new thread notification breakpoint %i",
3876 m_thread_create_bp_sp->GetID());
3877 m_thread_create_bp_sp->SetCallback(
3879 } else {
3880 LLDB_LOGF(log, "Failed to create new thread notification breakpoint.");
3881 }
3882 }
3883 }
3884 return m_thread_create_bp_sp.get() != nullptr;
3885}
3886
3888 Log *log = GetLog(LLDBLog::Step);
3889 if (log && log->GetVerbose())
3890 LLDB_LOGF(log, "Disabling new thread notification breakpoint.");
3891
3893 m_thread_create_bp_sp->SetEnabled(false);
3894
3895 return true;
3896}
3897
3899 if (m_dyld_up.get() == nullptr)
3900 m_dyld_up.reset(DynamicLoader::FindPlugin(this, ""));
3901 return m_dyld_up.get();
3902}
3903
3905 int return_value;
3906 bool was_supported;
3907
3908 Status error;
3909
3910 return_value = m_gdb_comm.SendLaunchEventDataPacket(data, &was_supported);
3911 if (return_value != 0) {
3912 if (!was_supported)
3914 "Sending events is not supported for this process.");
3915 else
3916 error = Status::FromErrorStringWithFormat("Error sending event data: %d.",
3917 return_value);
3918 }
3919 return error;
3920}
3921
3923 DataBufferSP buf;
3925 llvm::Expected<std::string> response = m_gdb_comm.ReadExtFeature("auxv", "");
3926 if (response)
3927 buf = std::make_shared<DataBufferHeap>(response->c_str(),
3928 response->length());
3929 else
3930 LLDB_LOG_ERROR(GetLog(GDBRLog::Process), response.takeError(), "{0}");
3931 }
3933}
3934
3937 StructuredData::ObjectSP object_sp;
3938
3941 SystemRuntime *runtime = GetSystemRuntime();
3942 if (runtime) {
3943 runtime->AddThreadExtendedInfoPacketHints(args_dict);
3944 }
3945 args_dict->GetAsDictionary()->AddIntegerItem("thread", tid);
3946
3947 StreamString packet;
3948 packet << "jThreadExtendedInfo:";
3949 args_dict->Dump(packet, false);
3950
3951 // FIXME the final character of a JSON dictionary, '}', is the escape
3952 // character in gdb-remote binary mode. lldb currently doesn't escape
3953 // these characters in its packet output -- so we add the quoted version of
3954 // the } character here manually in case we talk to a debugserver which un-
3955 // escapes the characters at packet read time.
3956 packet << (char)(0x7d ^ 0x20);
3957
3958 StringExtractorGDBRemote response;
3959 response.SetResponseValidatorToJSON();
3960 if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetString(), response) ==
3963 response.GetResponseType();
3964 if (response_type == StringExtractorGDBRemote::eResponse) {
3965 if (!response.Empty()) {
3966 object_sp = StructuredData::ParseJSON(response.GetStringRef());
3967 }
3968 }
3969 }
3970 }
3971 return object_sp;
3972}
3973
3975 lldb::addr_t image_list_address, lldb::addr_t image_count) {
3976
3978 args_dict->GetAsDictionary()->AddIntegerItem("image_list_address",
3979 image_list_address);
3980 args_dict->GetAsDictionary()->AddIntegerItem("image_count", image_count);
3981
3982 return GetLoadedDynamicLibrariesInfos_sender(args_dict);
3983}
3984
3987
3988 args_dict->GetAsDictionary()->AddBooleanItem("fetch_all_solibs", true);
3989
3990 return GetLoadedDynamicLibrariesInfos_sender(args_dict);
3991}
3992
3994 const std::vector<lldb::addr_t> &load_addresses) {
3997
3998 for (auto addr : load_addresses)
3999 addresses->AddIntegerItem(addr);
4000
4001 args_dict->GetAsDictionary()->AddItem("solib_addresses", addresses);
4002
4003 return GetLoadedDynamicLibrariesInfos_sender(args_dict);
4004}
4005
4008 StructuredData::ObjectSP args_dict) {
4009 StructuredData::ObjectSP object_sp;
4010
4012 // Scope for the scoped timeout object
4014 std::chrono::seconds(10));
4015
4016 StreamString packet;
4017 packet << "jGetLoadedDynamicLibrariesInfos:";
4018 args_dict->Dump(packet, false);
4019
4020 // FIXME the final character of a JSON dictionary, '}', is the escape
4021 // character in gdb-remote binary mode. lldb currently doesn't escape
4022 // these characters in its packet output -- so we add the quoted version of
4023 // the } character here manually in case we talk to a debugserver which un-
4024 // escapes the characters at packet read time.
4025 packet << (char)(0x7d ^ 0x20);
4026
4027 StringExtractorGDBRemote response;
4028 response.SetResponseValidatorToJSON();
4029 if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetString(), response) ==
4032 response.GetResponseType();
4033 if (response_type == StringExtractorGDBRemote::eResponse) {
4034 if (!response.Empty()) {
4035 object_sp = StructuredData::ParseJSON(response.GetStringRef());
4036 }
4037 }
4038 }
4039 }
4040 return object_sp;
4041}
4042
4044 StructuredData::ObjectSP object_sp;
4046
4048 StringExtractorGDBRemote response;
4049 response.SetResponseValidatorToJSON();
4050 if (m_gdb_comm.SendPacketAndWaitForResponse("jGetDyldProcessState",
4051 response) ==
4054 response.GetResponseType();
4055 if (response_type == StringExtractorGDBRemote::eResponse) {
4056 if (!response.Empty()) {
4057 object_sp = StructuredData::ParseJSON(response.GetStringRef());
4058 }
4059 }
4060 }
4061 }
4062 return object_sp;
4063}
4064
4066 StructuredData::ObjectSP object_sp;
4068
4070 StreamString packet;
4071 packet << "jGetSharedCacheInfo:";
4072 args_dict->Dump(packet, false);
4073
4074 // FIXME the final character of a JSON dictionary, '}', is the escape
4075 // character in gdb-remote binary mode. lldb currently doesn't escape
4076 // these characters in its packet output -- so we add the quoted version of
4077 // the } character here manually in case we talk to a debugserver which un-
4078 // escapes the characters at packet read time.
4079 packet << (char)(0x7d ^ 0x20);
4080
4081 StringExtractorGDBRemote response;
4082 response.SetResponseValidatorToJSON();
4083 if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetString(), response) ==
4086 response.GetResponseType();
4087 if (response_type == StringExtractorGDBRemote::eResponse) {
4088 if (!response.Empty()) {
4089 object_sp = StructuredData::ParseJSON(response.GetStringRef());
4090 }
4091 }
4092 }
4093 }
4094 return object_sp;
4095}
4096
4098 llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp) {
4099 return m_gdb_comm.ConfigureRemoteStructuredData(type_name, config_sp);
4100}
4101
4102// Establish the largest memory read/write payloads we should use. If the
4103// remote stub has a max packet size, stay under that size.
4104//
4105// If the remote stub's max packet size is crazy large, use a reasonable
4106// largeish default.
4107//
4108// If the remote stub doesn't advertise a max packet size, use a conservative
4109// default.
4110
4112 const uint64_t reasonable_largeish_default = 128 * 1024;
4113 const uint64_t conservative_default = 512;
4114
4115 if (m_max_memory_size == 0) {
4116 uint64_t stub_max_size = m_gdb_comm.GetRemoteMaxPacketSize();
4117 if (stub_max_size != UINT64_MAX && stub_max_size != 0) {
4118 // Save the stub's claimed maximum packet size
4119 m_remote_stub_max_memory_size = stub_max_size;
4120
4121 // Even if the stub says it can support ginormous packets, don't exceed
4122 // our reasonable largeish default packet size.
4123 if (stub_max_size > reasonable_largeish_default) {
4124 stub_max_size = reasonable_largeish_default;
4125 }
4126
4127 // Memory packet have other overheads too like Maddr,size:#NN Instead of
4128 // calculating the bytes taken by size and addr every time, we take a
4129 // maximum guess here.
4130 if (stub_max_size > 70)
4131 stub_max_size -= 32 + 32 + 6;
4132 else {
4133 // In unlikely scenario that max packet size is less then 70, we will
4134 // hope that data being written is small enough to fit.
4136 if (log)
4137 log->Warning("Packet size is too small. "
4138 "LLDB may face problems while writing memory");
4139 }
4140
4141 m_max_memory_size = stub_max_size;
4142 } else {
4143 m_max_memory_size = conservative_default;
4144 }
4145 }
4146}
4147
4149 uint64_t user_specified_max) {
4150 if (user_specified_max != 0) {
4152
4154 if (m_remote_stub_max_memory_size < user_specified_max) {
4156 // packet size too
4157 // big, go as big
4158 // as the remote stub says we can go.
4159 } else {
4160 m_max_memory_size = user_specified_max; // user's packet size is good
4161 }
4162 } else {
4164 user_specified_max; // user's packet size is probably fine
4165 }
4166 }
4167}
4168
4169bool ProcessGDBRemote::GetModuleSpec(const FileSpec &module_file_spec,
4170 const ArchSpec &arch,
4171 ModuleSpec &module_spec) {
4173
4174 const ModuleCacheKey key(module_file_spec.GetPath(),
4175 arch.GetTriple().getTriple());
4176 auto cached = m_cached_module_specs.find(key);
4177 if (cached != m_cached_module_specs.end()) {
4178 module_spec = cached->second;
4179 return bool(module_spec);
4180 }
4181
4182 if (!m_gdb_comm.GetModuleInfo(module_file_spec, arch, module_spec)) {
4183 LLDB_LOGF(log, "ProcessGDBRemote::%s - failed to get module info for %s:%s",
4184 __FUNCTION__, module_file_spec.GetPath().c_str(),
4185 arch.GetTriple().getTriple().c_str());
4186 return false;
4187 }
4188
4189 if (log) {
4190 StreamString stream;
4191 module_spec.Dump(stream);
4192 LLDB_LOGF(log, "ProcessGDBRemote::%s - got module info for (%s:%s) : %s",
4193 __FUNCTION__, module_file_spec.GetPath().c_str(),
4194 arch.GetTriple().getTriple().c_str(), stream.GetData());
4195 }
4196
4197 m_cached_module_specs[key] = module_spec;
4198 return true;
4199}
4200
4202 llvm::ArrayRef<FileSpec> module_file_specs, const llvm::Triple &triple) {
4203 auto module_specs = m_gdb_comm.GetModulesInfo(module_file_specs, triple);
4204 if (module_specs) {
4205 for (const FileSpec &spec : module_file_specs)
4207 triple.getTriple())] = ModuleSpec();
4208 for (const ModuleSpec &spec : *module_specs)
4209 m_cached_module_specs[ModuleCacheKey(spec.GetFileSpec().GetPath(),
4210 triple.getTriple())] = spec;
4211 }
4212}
4213
4215 return m_gdb_comm.GetOSVersion();
4216}
4217
4220}
4221
4222namespace {
4223
4224typedef std::vector<std::string> stringVec;
4225
4226typedef std::vector<struct GdbServerRegisterInfo> GDBServerRegisterVec;
4227struct RegisterSetInfo {
4228 ConstString name;
4229};
4230
4231typedef std::map<uint32_t, RegisterSetInfo> RegisterSetMap;
4232
4233struct GdbServerTargetInfo {
4234 std::string arch;
4235 std::string osabi;
4236 stringVec includes;
4237 RegisterSetMap reg_set_map;
4238};
4239
4240static FieldEnum::Enumerators ParseEnumEvalues(const XMLNode &enum_node) {
4241 Log *log(GetLog(GDBRLog::Process));
4242 // We will use the last instance of each value. Also we preserve the order
4243 // of declaration in the XML, as it may not be numerical.
4244 // For example, hardware may intially release with two states that softwware
4245 // can read from a register field:
4246 // 0 = startup, 1 = running
4247 // If in a future hardware release, the designers added a pre-startup state:
4248 // 0 = startup, 1 = running, 2 = pre-startup
4249 // Now it makes more sense to list them in this logical order as opposed to
4250 // numerical order:
4251 // 2 = pre-startup, 1 = startup, 0 = startup
4252 // This only matters for "register info" but let's trust what the server
4253 // chose regardless.
4254 std::map<uint64_t, FieldEnum::Enumerator> enumerators;
4255
4257 "evalue", [&enumerators, &log](const XMLNode &enumerator_node) {
4258 std::optional<llvm::StringRef> name;
4259 std::optional<uint64_t> value;
4260
4261 enumerator_node.ForEachAttribute(
4262 [&name, &value, &log](const llvm::StringRef &attr_name,
4263 const llvm::StringRef &attr_value) {
4264 if (attr_name == "name") {
4265 if (attr_value.size())
4266 name = attr_value;
4267 else
4268 LLDB_LOG(log, "ProcessGDBRemote::ParseEnumEvalues "
4269 "Ignoring empty name in evalue");
4270 } else if (attr_name == "value") {
4271 uint64_t parsed_value = 0;
4272 if (llvm::to_integer(attr_value, parsed_value))
4273 value = parsed_value;
4274 else
4275 LLDB_LOG(log,
4276 "ProcessGDBRemote::ParseEnumEvalues "
4277 "Invalid value \"{0}\" in "
4278 "evalue",
4279 attr_value.data());
4280 } else
4281 LLDB_LOG(log,
4282 "ProcessGDBRemote::ParseEnumEvalues Ignoring "
4283 "unknown attribute "
4284 "\"{0}\" in evalue",
4285 attr_name.data());
4286
4287 // Keep walking attributes.
4288 return true;
4289 });
4290
4291 if (value && name)
4292 enumerators.insert_or_assign(
4293 *value, FieldEnum::Enumerator(*value, name->str()));
4294
4295 // Find all evalue elements.
4296 return true;
4297 });
4298
4299 FieldEnum::Enumerators final_enumerators;
4300 for (auto [_, enumerator] : enumerators)
4301 final_enumerators.push_back(enumerator);
4302
4303 return final_enumerators;
4304}
4305
4306static void
4307ParseEnums(XMLNode feature_node,
4308 llvm::StringMap<std::unique_ptr<FieldEnum>> &registers_enum_types) {
4309 Log *log(GetLog(GDBRLog::Process));
4310
4311 // The top level element is "<enum...".
4312 feature_node.ForEachChildElementWithName(
4313 "enum", [log, &registers_enum_types](const XMLNode &enum_node) {
4314 std::string id;
4315
4316 enum_node.ForEachAttribute([&id](const llvm::StringRef &attr_name,
4317 const llvm::StringRef &attr_value) {
4318 if (attr_name == "id")
4319 id = attr_value;
4320
4321 // There is also a "size" attribute that is supposed to be the size in
4322 // bytes of the register this applies to. However:
4323 // * LLDB doesn't need this information.
4324 // * It is difficult to verify because you have to wait until the
4325 // enum is applied to a field.
4326 //
4327 // So we will emit this attribute in XML for GDB's sake, but will not
4328 // bother ingesting it.
4329
4330 // Walk all attributes.
4331 return true;
4332 });
4333
4334 if (!id.empty()) {
4335 FieldEnum::Enumerators enumerators = ParseEnumEvalues(enum_node);
4336 if (!enumerators.empty()) {
4337 LLDB_LOG(log,
4338 "ProcessGDBRemote::ParseEnums Found enum type \"{0}\"",
4339 id);
4340 registers_enum_types.insert_or_assign(
4341 id, std::make_unique<FieldEnum>(id, enumerators));
4342 }
4343 }
4344
4345 // Find all <enum> elements.
4346 return true;
4347 });
4348}
4349
4350static std::vector<RegisterFlags::Field> ParseFlagsFields(
4351 XMLNode flags_node, unsigned size,
4352 const llvm::StringMap<std::unique_ptr<FieldEnum>> &registers_enum_types) {
4353 Log *log(GetLog(GDBRLog::Process));
4354 const unsigned max_start_bit = size * 8 - 1;
4355
4356 // Process the fields of this set of flags.
4357 std::vector<RegisterFlags::Field> fields;
4358 flags_node.ForEachChildElementWithName("field", [&fields, max_start_bit, &log,
4359 &registers_enum_types](
4360 const XMLNode
4361 &field_node) {
4362 std::optional<llvm::StringRef> name;
4363 std::optional<unsigned> start;
4364 std::optional<unsigned> end;
4365 std::optional<llvm::StringRef> type;
4366
4367 field_node.ForEachAttribute([&name, &start, &end, &type, max_start_bit,
4368 &log](const llvm::StringRef &attr_name,
4369 const llvm::StringRef &attr_value) {
4370 // Note that XML in general requires that each of these attributes only
4371 // appears once, so we don't have to handle that here.
4372 if (attr_name == "name") {
4373 LLDB_LOG(
4374 log,
4375 "ProcessGDBRemote::ParseFlagsFields Found field node name \"{0}\"",
4376 attr_value.data());
4377 name = attr_value;
4378 } else if (attr_name == "start") {
4379 unsigned parsed_start = 0;
4380 if (llvm::to_integer(attr_value, parsed_start)) {
4381 if (parsed_start > max_start_bit) {
4382 LLDB_LOG(log,
4383 "ProcessGDBRemote::ParseFlagsFields Invalid start {0} in "
4384 "field node, "
4385 "cannot be > {1}",
4386 parsed_start, max_start_bit);
4387 } else
4388 start = parsed_start;
4389 } else {
4390 LLDB_LOG(
4391 log,
4392 "ProcessGDBRemote::ParseFlagsFields Invalid start \"{0}\" in "
4393 "field node",
4394 attr_value.data());
4395 }
4396 } else if (attr_name == "end") {
4397 unsigned parsed_end = 0;
4398 if (llvm::to_integer(attr_value, parsed_end))
4399 if (parsed_end > max_start_bit) {
4400 LLDB_LOG(log,
4401 "ProcessGDBRemote::ParseFlagsFields Invalid end {0} in "
4402 "field node, "
4403 "cannot be > {1}",
4404 parsed_end, max_start_bit);
4405 } else
4406 end = parsed_end;
4407 else {
4408 LLDB_LOG(log,
4409 "ProcessGDBRemote::ParseFlagsFields Invalid end \"{0}\" in "
4410 "field node",
4411 attr_value.data());
4412 }
4413 } else if (attr_name == "type") {
4414 type = attr_value;
4415 } else {
4416 LLDB_LOG(
4417 log,
4418 "ProcessGDBRemote::ParseFlagsFields Ignoring unknown attribute "
4419 "\"{0}\" in field node",
4420 attr_name.data());
4421 }
4422
4423 return true; // Walk all attributes of the field.
4424 });
4425
4426 if (name && start && end) {
4427 if (*start > *end)
4428 LLDB_LOG(
4429 log,
4430 "ProcessGDBRemote::ParseFlagsFields Start {0} > end {1} in field "
4431 "\"{2}\", ignoring",
4432 *start, *end, name->data());
4433 else {
4434 if (RegisterFlags::Field::GetSizeInBits(*start, *end) > 64)
4435 LLDB_LOG(log,
4436 "ProcessGDBRemote::ParseFlagsFields Ignoring field \"{2}\" "
4437 "that has "
4438 "size > 64 bits, this is not supported",
4439 name->data());
4440 else {
4441 // A field's type may be set to the name of an enum type.
4442 const FieldEnum *enum_type = nullptr;
4443 if (type && !type->empty()) {
4444 auto found = registers_enum_types.find(*type);
4445 if (found != registers_enum_types.end()) {
4446 enum_type = found->second.get();
4447
4448 // No enumerator can exceed the range of the field itself.
4449 uint64_t max_value =
4451 for (const auto &enumerator : enum_type->GetEnumerators()) {
4452 if (enumerator.m_value > max_value) {
4453 enum_type = nullptr;
4454 LLDB_LOG(
4455 log,
4456 "ProcessGDBRemote::ParseFlagsFields In enum \"{0}\" "
4457 "evalue \"{1}\" with value {2} exceeds the maximum value "
4458 "of field \"{3}\" ({4}), ignoring enum",
4459 type->data(), enumerator.m_name, enumerator.m_value,
4460 name->data(), max_value);
4461 break;
4462 }
4463 }
4464 } else {
4465 LLDB_LOG(log,
4466 "ProcessGDBRemote::ParseFlagsFields Could not find type "
4467 "\"{0}\" "
4468 "for field \"{1}\", ignoring",
4469 type->data(), name->data());
4470 }
4471 }
4472
4473 fields.push_back(
4474 RegisterFlags::Field(name->str(), *start, *end, enum_type));
4475 }
4476 }
4477 }
4478
4479 return true; // Iterate all "field" nodes.
4480 });
4481 return fields;
4482}
4483
4484void ParseFlags(
4485 XMLNode feature_node,
4486 llvm::StringMap<std::unique_ptr<RegisterFlags>> &registers_flags_types,
4487 const llvm::StringMap<std::unique_ptr<FieldEnum>> &registers_enum_types) {
4488 Log *log(GetLog(GDBRLog::Process));
4489
4490 feature_node.ForEachChildElementWithName(
4491 "flags",
4492 [&log, &registers_flags_types,
4493 &registers_enum_types](const XMLNode &flags_node) -> bool {
4494 LLDB_LOG(log, "ProcessGDBRemote::ParseFlags Found flags node \"{0}\"",
4495 flags_node.GetAttributeValue("id").c_str());
4496
4497 std::optional<llvm::StringRef> id;
4498 std::optional<unsigned> size;
4499 flags_node.ForEachAttribute(
4500 [&id, &size, &log](const llvm::StringRef &name,
4501 const llvm::StringRef &value) {
4502 if (name == "id") {
4503 id = value;
4504 } else if (name == "size") {
4505 unsigned parsed_size = 0;
4506 if (llvm::to_integer(value, parsed_size))
4507 size = parsed_size;
4508 else {
4509 LLDB_LOG(log,
4510 "ProcessGDBRemote::ParseFlags Invalid size \"{0}\" "
4511 "in flags node",
4512 value.data());
4513 }
4514 } else {
4515 LLDB_LOG(log,
4516 "ProcessGDBRemote::ParseFlags Ignoring unknown "
4517 "attribute \"{0}\" in flags node",
4518 name.data());
4519 }
4520 return true; // Walk all attributes.
4521 });
4522
4523 if (id && size) {
4524 // Process the fields of this set of flags.
4525 std::vector<RegisterFlags::Field> fields =
4526 ParseFlagsFields(flags_node, *size, registers_enum_types);
4527 if (fields.size()) {
4528 // Sort so that the fields with the MSBs are first.
4529 std::sort(fields.rbegin(), fields.rend());
4530 std::vector<RegisterFlags::Field>::const_iterator overlap =
4531 std::adjacent_find(fields.begin(), fields.end(),
4532 [](const RegisterFlags::Field &lhs,
4533 const RegisterFlags::Field &rhs) {
4534 return lhs.Overlaps(rhs);
4535 });
4536
4537 // If no fields overlap, use them.
4538 if (overlap == fields.end()) {
4539 if (registers_flags_types.contains(*id)) {
4540 // In theory you could define some flag set, use it with a
4541 // register then redefine it. We do not know if anyone does
4542 // that, or what they would expect to happen in that case.
4543 //
4544 // LLDB chooses to take the first definition and ignore the rest
4545 // as waiting until everything has been processed is more
4546 // expensive and difficult. This means that pointers to flag
4547 // sets in the register info remain valid if later the flag set
4548 // is redefined. If we allowed redefinitions, LLDB would crash
4549 // when you tried to print a register that used the original
4550 // definition.
4551 LLDB_LOG(
4552 log,
4553 "ProcessGDBRemote::ParseFlags Definition of flags "
4554 "\"{0}\" shadows "
4555 "previous definition, using original definition instead.",
4556 id->data());
4557 } else {
4558 registers_flags_types.insert_or_assign(
4559 *id, std::make_unique<RegisterFlags>(id->str(), *size,
4560 std::move(fields)));
4561 }
4562 } else {
4563 // If any fields overlap, ignore the whole set of flags.
4564 std::vector<RegisterFlags::Field>::const_iterator next =
4565 std::next(overlap);
4566 LLDB_LOG(
4567 log,
4568 "ProcessGDBRemote::ParseFlags Ignoring flags because fields "
4569 "{0} (start: {1} end: {2}) and {3} (start: {4} end: {5}) "
4570 "overlap.",
4571 overlap->GetName().c_str(), overlap->GetStart(),
4572 overlap->GetEnd(), next->GetName().c_str(), next->GetStart(),
4573 next->GetEnd());
4574 }
4575 } else {
4576 LLDB_LOG(
4577 log,
4578 "ProcessGDBRemote::ParseFlags Ignoring definition of flags "
4579 "\"{0}\" because it contains no fields.",
4580 id->data());
4581 }
4582 }
4583
4584 return true; // Keep iterating through all "flags" elements.
4585 });
4586}
4587
4588bool ParseRegisters(
4589 XMLNode feature_node, GdbServerTargetInfo &target_info,
4590 std::vector<DynamicRegisterInfo::Register> &registers,
4591 llvm::StringMap<std::unique_ptr<RegisterFlags>> &registers_flags_types,
4592 llvm::StringMap<std::unique_ptr<FieldEnum>> &registers_enum_types) {
4593 if (!feature_node)
4594 return false;
4595
4596 Log *log(GetLog(GDBRLog::Process));
4597
4598 // Enums first because they are referenced by fields in the flags.
4599 ParseEnums(feature_node, registers_enum_types);
4600 for (const auto &enum_type : registers_enum_types)
4601 enum_type.second->DumpToLog(log);
4602
4603 ParseFlags(feature_node, registers_flags_types, registers_enum_types);
4604 for (const auto &flags : registers_flags_types)
4605 flags.second->DumpToLog(log);
4606
4607 feature_node.ForEachChildElementWithName(
4608 "reg",
4609 [&target_info, &registers, &registers_flags_types,
4610 log](const XMLNode &reg_node) -> bool {
4611 std::string gdb_group;
4612 std::string gdb_type;
4614 bool encoding_set = false;
4615 bool format_set = false;
4616
4617 // FIXME: we're silently ignoring invalid data here
4618 reg_node.ForEachAttribute([&target_info, &gdb_group, &gdb_type,
4619 &encoding_set, &format_set, &reg_info,
4620 log](const llvm::StringRef &name,
4621 const llvm::StringRef &value) -> bool {
4622 if (name == "name") {
4623 reg_info.name.SetString(value);
4624 } else if (name == "bitsize") {
4625 if (llvm::to_integer(value, reg_info.byte_size))
4626 reg_info.byte_size =
4627 llvm::divideCeil(reg_info.byte_size, CHAR_BIT);
4628 } else if (name == "type") {
4629 gdb_type = value.str();
4630 } else if (name == "group") {
4631 gdb_group = value.str();
4632 } else if (name == "regnum") {
4633 llvm::to_integer(value, reg_info.regnum_remote);
4634 } else if (name == "offset") {
4635 llvm::to_integer(value, reg_info.byte_offset);
4636 } else if (name == "altname") {
4637 reg_info.alt_name.SetString(value);
4638 } else if (name == "encoding") {
4639 encoding_set = true;
4641 } else if (name == "format") {
4642 format_set = true;
4643 if (!OptionArgParser::ToFormat(value.data(), reg_info.format,
4644 nullptr)
4645 .Success())
4646 reg_info.format =
4647 llvm::StringSwitch<lldb::Format>(value)
4648 .Case("vector-sint8", eFormatVectorOfSInt8)
4649 .Case("vector-uint8", eFormatVectorOfUInt8)
4650 .Case("vector-sint16", eFormatVectorOfSInt16)
4651 .Case("vector-uint16", eFormatVectorOfUInt16)
4652 .Case("vector-sint32", eFormatVectorOfSInt32)
4653 .Case("vector-uint32", eFormatVectorOfUInt32)
4654 .Case("vector-float32", eFormatVectorOfFloat32)
4655 .Case("vector-uint64", eFormatVectorOfUInt64)
4656 .Case("vector-uint128", eFormatVectorOfUInt128)
4657 .Default(eFormatInvalid);
4658 } else if (name == "group_id") {
4659 uint32_t set_id = UINT32_MAX;
4660 llvm::to_integer(value, set_id);
4661 RegisterSetMap::const_iterator pos =
4662 target_info.reg_set_map.find(set_id);
4663 if (pos != target_info.reg_set_map.end())
4664 reg_info.set_name = pos->second.name;
4665 } else if (name == "gcc_regnum" || name == "ehframe_regnum") {
4666 llvm::to_integer(value, reg_info.regnum_ehframe);
4667 } else if (name == "dwarf_regnum") {
4668 llvm::to_integer(value, reg_info.regnum_dwarf);
4669 } else if (name == "generic") {
4671 } else if (name == "value_regnums") {
4673 0);
4674 } else if (name == "invalidate_regnums") {
4676 value, reg_info.invalidate_regs, 0);
4677 } else {
4678 LLDB_LOGF(log,
4679 "ProcessGDBRemote::ParseRegisters unhandled reg "
4680 "attribute %s = %s",
4681 name.data(), value.data());
4682 }
4683 return true; // Keep iterating through all attributes
4684 });
4685
4686 if (!gdb_type.empty()) {
4687 // gdb_type could reference some flags type defined in XML.
4688 llvm::StringMap<std::unique_ptr<RegisterFlags>>::iterator it =
4689 registers_flags_types.find(gdb_type);
4690 if (it != registers_flags_types.end()) {
4691 auto flags_type = it->second.get();
4692 if (reg_info.byte_size == flags_type->GetSize())
4693 reg_info.flags_type = flags_type;
4694 else
4695 LLDB_LOGF(log,
4696 "ProcessGDBRemote::ParseRegisters Size of register "
4697 "flags %s (%d bytes) for "
4698 "register %s does not match the register size (%d "
4699 "bytes). Ignoring this set of flags.",
4700 flags_type->GetID().c_str(), flags_type->GetSize(),
4701 reg_info.name.AsCString(), reg_info.byte_size);
4702 }
4703
4704 // There's a slim chance that the gdb_type name is both a flags type
4705 // and a simple type. Just in case, look for that too (setting both
4706 // does no harm).
4707 if (!gdb_type.empty() && !(encoding_set || format_set)) {
4708 if (llvm::StringRef(gdb_type).starts_with("int")) {
4709 reg_info.format = eFormatHex;
4710 reg_info.encoding = eEncodingUint;
4711 } else if (gdb_type == "data_ptr" || gdb_type == "code_ptr") {
4712 reg_info.format = eFormatAddressInfo;
4713 reg_info.encoding = eEncodingUint;
4714 } else if (gdb_type == "float") {
4715 reg_info.format = eFormatFloat;
4716 reg_info.encoding = eEncodingIEEE754;
4717 } else if (gdb_type == "aarch64v" ||
4718 llvm::StringRef(gdb_type).starts_with("vec") ||
4719 gdb_type == "i387_ext" || gdb_type == "uint128" ||
4720 reg_info.byte_size > 16) {
4721 // lldb doesn't handle 128-bit uints correctly (for ymm*h), so
4722 // treat them as vector (similarly to xmm/ymm).
4723 // We can fall back to handling anything else <= 128 bit as an
4724 // unsigned integer, more than that, call it a vector of bytes.
4725 // This can happen if we don't recognise the type for AArc64 SVE
4726 // registers.
4727 reg_info.format = eFormatVectorOfUInt8;
4728 reg_info.encoding = eEncodingVector;
4729 } else {
4730 LLDB_LOGF(
4731 log,
4732 "ProcessGDBRemote::ParseRegisters Could not determine lldb"
4733 "format and encoding for gdb type %s",
4734 gdb_type.c_str());
4735 }
4736 }
4737 }
4738
4739 // Only update the register set name if we didn't get a "reg_set"
4740 // attribute. "set_name" will be empty if we didn't have a "reg_set"
4741 // attribute.
4742 if (!reg_info.set_name) {
4743 if (!gdb_group.empty()) {
4744 reg_info.set_name.SetCString(gdb_group.c_str());
4745 } else {
4746 // If no register group name provided anywhere,
4747 // we'll create a 'general' register set
4748 reg_info.set_name.SetCString("general");
4749 }
4750 }
4751
4752 if (reg_info.byte_size == 0) {
4753 LLDB_LOGF(log,
4754 "ProcessGDBRemote::%s Skipping zero bitsize register %s",
4755 __FUNCTION__, reg_info.name.AsCString());
4756 } else
4757 registers.push_back(reg_info);
4758
4759 return true; // Keep iterating through all "reg" elements
4760 });
4761 return true;
4762}
4763
4764} // namespace
4765
4766// This method fetches a register description feature xml file from
4767// the remote stub and adds registers/register groupsets/architecture
4768// information to the current process. It will call itself recursively
4769// for nested register definition files. It returns true if it was able
4770// to fetch and parse an xml file.
4772 ArchSpec &arch_to_use, std::string xml_filename,
4773 std::vector<DynamicRegisterInfo::Register> &registers) {
4774 // request the target xml file
4775 llvm::Expected<std::string> raw = m_gdb_comm.ReadExtFeature("features", xml_filename);
4776 if (errorToBool(raw.takeError()))
4777 return false;
4778
4779 XMLDocument xml_document;
4780
4781 if (xml_document.ParseMemory(raw->c_str(), raw->size(),
4782 xml_filename.c_str())) {
4783 GdbServerTargetInfo target_info;
4784 std::vector<XMLNode> feature_nodes;
4785
4786 // The top level feature XML file will start with a <target> tag.
4787 XMLNode target_node = xml_document.GetRootElement("target");
4788 if (target_node) {
4789 target_node.ForEachChildElement([&target_info, &feature_nodes](
4790 const XMLNode &node) -> bool {
4791 llvm::StringRef name = node.GetName();
4792 if (name == "architecture") {
4793 node.GetElementText(target_info.arch);
4794 } else if (name == "osabi") {
4795 node.GetElementText(target_info.osabi);
4796 } else if (name == "xi:include" || name == "include") {
4797 std::string href = node.GetAttributeValue("href");
4798 if (!href.empty())
4799 target_info.includes.push_back(href);
4800 } else if (name == "feature") {
4801 feature_nodes.push_back(node);
4802 } else if (name == "groups") {
4804 "group", [&target_info](const XMLNode &node) -> bool {
4805 uint32_t set_id = UINT32_MAX;
4806 RegisterSetInfo set_info;
4807
4808 node.ForEachAttribute(
4809 [&set_id, &set_info](const llvm::StringRef &name,
4810 const llvm::StringRef &value) -> bool {
4811 // FIXME: we're silently ignoring invalid data here
4812 if (name == "id")
4813 llvm::to_integer(value, set_id);
4814 if (name == "name")
4815 set_info.name = ConstString(value);
4816 return true; // Keep iterating through all attributes
4817 });
4818
4819 if (set_id != UINT32_MAX)
4820 target_info.reg_set_map[set_id] = set_info;
4821 return true; // Keep iterating through all "group" elements
4822 });
4823 }
4824 return true; // Keep iterating through all children of the target_node
4825 });
4826 } else {
4827 // In an included XML feature file, we're already "inside" the <target>
4828 // tag of the initial XML file; this included file will likely only have
4829 // a <feature> tag. Need to check for any more included files in this
4830 // <feature> element.
4831 XMLNode feature_node = xml_document.GetRootElement("feature");
4832 if (feature_node) {
4833 feature_nodes.push_back(feature_node);
4834 feature_node.ForEachChildElement([&target_info](
4835 const XMLNode &node) -> bool {
4836 llvm::StringRef name = node.GetName();
4837 if (name == "xi:include" || name == "include") {
4838 std::string href = node.GetAttributeValue("href");
4839 if (!href.empty())
4840 target_info.includes.push_back(href);
4841 }
4842 return true;
4843 });
4844 }
4845 }
4846
4847 // gdbserver does not implement the LLDB packets used to determine host
4848 // or process architecture. If that is the case, attempt to use
4849 // the <architecture/> field from target.xml, e.g.:
4850 //
4851 // <architecture>i386:x86-64</architecture> (seen from VMWare ESXi)
4852 // <architecture>arm</architecture> (seen from Segger JLink on unspecified
4853 // arm board)
4854 if (!arch_to_use.IsValid() && !target_info.arch.empty()) {
4855 // We don't have any information about vendor or OS.
4856 arch_to_use.SetTriple(llvm::StringSwitch<std::string>(target_info.arch)
4857 .Case("i386:x86-64", "x86_64")
4858 .Case("riscv:rv64", "riscv64")
4859 .Case("riscv:rv32", "riscv32")
4860 .Default(target_info.arch) +
4861 "--");
4862
4863 if (arch_to_use.IsValid())
4864 GetTarget().MergeArchitecture(arch_to_use);
4865 }
4866
4867 if (arch_to_use.IsValid()) {
4868 for (auto &feature_node : feature_nodes) {
4869 ParseRegisters(feature_node, target_info, registers,
4871 }
4872
4873 for (const auto &include : target_info.includes) {
4874 GetGDBServerRegisterInfoXMLAndProcess(arch_to_use, include,
4875 registers);
4876 }
4877 }
4878 } else {
4879 return false;
4880 }
4881 return true;
4882}
4883
4885 std::vector<DynamicRegisterInfo::Register> &registers,
4886 const ArchSpec &arch_to_use) {
4887 std::map<uint32_t, uint32_t> remote_to_local_map;
4888 uint32_t remote_regnum = 0;
4889 for (auto it : llvm::enumerate(registers)) {
4890 DynamicRegisterInfo::Register &remote_reg_info = it.value();
4891
4892 // Assign successive remote regnums if missing.
4893 if (remote_reg_info.regnum_remote == LLDB_INVALID_REGNUM)
4894 remote_reg_info.regnum_remote = remote_regnum;
4895
4896 // Create a mapping from remote to local regnos.
4897 remote_to_local_map[remote_reg_info.regnum_remote] = it.index();
4898
4899 remote_regnum = remote_reg_info.regnum_remote + 1;
4900 }
4901
4902 for (DynamicRegisterInfo::Register &remote_reg_info : registers) {
4903 auto proc_to_lldb = [&remote_to_local_map](uint32_t process_regnum) {
4904 auto lldb_regit = remote_to_local_map.find(process_regnum);
4905 return lldb_regit != remote_to_local_map.end() ? lldb_regit->second
4907 };
4908
4909 llvm::transform(remote_reg_info.value_regs,
4910 remote_reg_info.value_regs.begin(), proc_to_lldb);
4911 llvm::transform(remote_reg_info.invalidate_regs,
4912 remote_reg_info.invalidate_regs.begin(), proc_to_lldb);
4913 }
4914
4915 // Don't use Process::GetABI, this code gets called from DidAttach, and
4916 // in that context we haven't set the Target's architecture yet, so the
4917 // ABI is also potentially incorrect.
4918 if (ABISP abi_sp = ABI::FindPlugin(shared_from_this(), arch_to_use))
4919 abi_sp->AugmentRegisterInfo(registers);
4920
4921 m_register_info_sp->SetRegisterInfo(std::move(registers), arch_to_use);
4922}
4923
4924// query the target of gdb-remote for extended target information returns
4925// true on success (got register definitions), false on failure (did not).
4927 // Make sure LLDB has an XML parser it can use first
4929 return false;
4930
4931 // check that we have extended feature read support
4933 return false;
4934
4935 // These hold register type information for the whole of target.xml.
4936 // target.xml may include further documents that
4937 // GetGDBServerRegisterInfoXMLAndProcess will recurse to fetch and process.
4938 // That's why we clear the cache here, and not in
4939 // GetGDBServerRegisterInfoXMLAndProcess. To prevent it being cleared on every
4940 // include read.
4942 m_registers_enum_types.clear();
4943 std::vector<DynamicRegisterInfo::Register> registers;
4944 if (GetGDBServerRegisterInfoXMLAndProcess(arch_to_use, "target.xml",
4945 registers) &&
4946 // Target XML is not required to include register information.
4947 !registers.empty())
4948 AddRemoteRegisters(registers, arch_to_use);
4949
4950 return m_register_info_sp->GetNumRegisters() > 0;
4951}
4952
4953llvm::Expected<LoadedModuleInfoList> ProcessGDBRemote::GetLoadedModuleList() {
4954 // Make sure LLDB has an XML parser it can use first
4956 return llvm::createStringError(llvm::inconvertibleErrorCode(),
4957 "XML parsing not available");
4958
4959 Log *log = GetLog(LLDBLog::Process);
4960 LLDB_LOGF(log, "ProcessGDBRemote::%s", __FUNCTION__);
4961
4964 bool can_use_svr4 = GetGlobalPluginProperties().GetUseSVR4();
4965
4966 // check that we have extended feature read support
4967 if (can_use_svr4 && comm.GetQXferLibrariesSVR4ReadSupported()) {
4968 // request the loaded library list
4969 llvm::Expected<std::string> raw = comm.ReadExtFeature("libraries-svr4", "");
4970 if (!raw)
4971 return raw.takeError();
4972
4973 // parse the xml file in memory
4974 LLDB_LOGF(log, "parsing: %s", raw->c_str());
4975 XMLDocument doc;
4976
4977 if (!doc.ParseMemory(raw->c_str(), raw->size(), "noname.xml"))
4978 return llvm::createStringError(llvm::inconvertibleErrorCode(),
4979 "Error reading noname.xml");
4980
4981 XMLNode root_element = doc.GetRootElement("library-list-svr4");
4982 if (!root_element)
4983 return llvm::createStringError(
4984 llvm::inconvertibleErrorCode(),
4985 "Error finding library-list-svr4 xml element");
4986
4987 // main link map structure
4988 std::string main_lm = root_element.GetAttributeValue("main-lm");
4989 // FIXME: we're silently ignoring invalid data here
4990 if (!main_lm.empty())
4991 llvm::to_integer(main_lm, list.m_link_map);
4992
4993 root_element.ForEachChildElementWithName(
4994 "library", [log, &list](const XMLNode &library) -> bool {
4996
4997 // FIXME: we're silently ignoring invalid data here
4998 library.ForEachAttribute(
4999 [&module](const llvm::StringRef &name,
5000 const llvm::StringRef &value) -> bool {
5001 uint64_t uint_value = LLDB_INVALID_ADDRESS;
5002 if (name == "name")
5003 module.set_name(value.str());
5004 else if (name == "lm") {
5005 // the address of the link_map struct.
5006 llvm::to_integer(value, uint_value);
5007 module.set_link_map(uint_value);
5008 } else if (name == "l_addr") {
5009 // the displacement as read from the field 'l_addr' of the
5010 // link_map struct.
5011 llvm::to_integer(value, uint_value);
5012 module.set_base(uint_value);
5013 // base address is always a displacement, not an absolute
5014 // value.
5015 module.set_base_is_offset(true);
5016 } else if (name == "l_ld") {
5017 // the memory address of the libraries PT_DYNAMIC section.
5018 llvm::to_integer(value, uint_value);
5019 module.set_dynamic(uint_value);
5020 }
5021
5022 return true; // Keep iterating over all properties of "library"
5023 });
5024
5025 if (log) {
5026 std::string name;
5027 lldb::addr_t lm = 0, base = 0, ld = 0;
5028 bool base_is_offset;
5029
5030 module.get_name(name);
5031 module.get_link_map(lm);
5032 module.get_base(base);
5033 module.get_base_is_offset(base_is_offset);
5034 module.get_dynamic(ld);
5035
5036 LLDB_LOGF(log,
5037 "found (link_map:0x%08" PRIx64 ", base:0x%08" PRIx64
5038 "[%s], ld:0x%08" PRIx64 ", name:'%s')",
5039 lm, base, (base_is_offset ? "offset" : "absolute"), ld,
5040 name.c_str());
5041 }
5042
5043 list.add(module);
5044 return true; // Keep iterating over all "library" elements in the root
5045 // node
5046 });
5047
5048 if (log)
5049 LLDB_LOGF(log, "found %" PRId32 " modules in total",
5050 (int)list.m_list.size());
5051 return list;
5052 } else if (comm.GetQXferLibrariesReadSupported()) {
5053 // request the loaded library list
5054 llvm::Expected<std::string> raw = comm.ReadExtFeature("libraries", "");
5055
5056 if (!raw)
5057 return raw.takeError();
5058
5059 LLDB_LOGF(log, "parsing: %s", raw->c_str());
5060 XMLDocument doc;
5061
5062 if (!doc.ParseMemory(raw->c_str(), raw->size(), "noname.xml"))
5063 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5064 "Error reading noname.xml");
5065
5066 XMLNode root_element = doc.GetRootElement("library-list");
5067 if (!root_element)
5068 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5069 "Error finding library-list xml element");
5070
5071 // FIXME: we're silently ignoring invalid data here
5072 root_element.ForEachChildElementWithName(
5073 "library", [log, &list](const XMLNode &library) -> bool {
5075
5076 std::string name = library.GetAttributeValue("name");
5077 module.set_name(name);
5078
5079 // The base address of a given library will be the address of its
5080 // first section. Most remotes send only one section for Windows
5081 // targets for example.
5082 const XMLNode &section =
5083 library.FindFirstChildElementWithName("section");
5084 std::string address = section.GetAttributeValue("address");
5085 uint64_t address_value = LLDB_INVALID_ADDRESS;
5086 llvm::to_integer(address, address_value);
5087 module.set_base(address_value);
5088 // These addresses are absolute values.
5089 module.set_base_is_offset(false);
5090
5091 if (log) {
5092 std::string name;
5093 lldb::addr_t base = 0;
5094 bool base_is_offset;
5095 module.get_name(name);
5096 module.get_base(base);
5097 module.get_base_is_offset(base_is_offset);
5098
5099 LLDB_LOGF(log, "found (base:0x%08" PRIx64 "[%s], name:'%s')", base,
5100 (base_is_offset ? "offset" : "absolute"), name.c_str());
5101 }
5102
5103 list.add(module);
5104 return true; // Keep iterating over all "library" elements in the root
5105 // node
5106 });
5107
5108 if (log)
5109 LLDB_LOGF(log, "found %" PRId32 " modules in total",
5110 (int)list.m_list.size());
5111 return list;
5112 } else {
5113 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5114 "Remote libraries not supported");
5115 }
5116}
5117
5119 lldb::addr_t link_map,
5120 lldb::addr_t base_addr,
5121 bool value_is_offset) {
5122 DynamicLoader *loader = GetDynamicLoader();
5123 if (!loader)
5124 return nullptr;
5125
5126 return loader->LoadModuleAtAddress(file, link_map, base_addr,
5127 value_is_offset);
5128}
5129
5132
5133 // request a list of loaded libraries from GDBServer
5134 llvm::Expected<LoadedModuleInfoList> module_list = GetLoadedModuleList();
5135 if (!module_list)
5136 return module_list.takeError();
5137
5138 // get a list of all the modules
5139 ModuleList new_modules;
5140
5141 for (LoadedModuleInfoList::LoadedModuleInfo &modInfo : module_list->m_list) {
5142 std::string mod_name;
5143 lldb::addr_t mod_base;
5144 lldb::addr_t link_map;
5145 bool mod_base_is_offset;
5146
5147 bool valid = true;
5148 valid &= modInfo.get_name(mod_name);
5149 valid &= modInfo.get_base(mod_base);
5150 valid &= modInfo.get_base_is_offset(mod_base_is_offset);
5151 if (!valid)
5152 continue;
5153
5154 if (!modInfo.get_link_map(link_map))
5155 link_map = LLDB_INVALID_ADDRESS;
5156
5157 FileSpec file(mod_name);
5159 lldb::ModuleSP module_sp =
5160 LoadModuleAtAddress(file, link_map, mod_base, mod_base_is_offset);
5161
5162 if (module_sp.get())
5163 new_modules.Append(module_sp);
5164 }
5165
5166 if (new_modules.GetSize() > 0) {
5167 ModuleList removed_modules;
5168 Target &target = GetTarget();
5169 ModuleList &loaded_modules = m_process->GetTarget().GetImages();
5170
5171 for (size_t i = 0; i < loaded_modules.GetSize(); ++i) {
5172 const lldb::ModuleSP loaded_module = loaded_modules.GetModuleAtIndex(i);
5173
5174 bool found = false;
5175 for (size_t j = 0; j < new_modules.GetSize(); ++j) {
5176 if (new_modules.GetModuleAtIndex(j).get() == loaded_module.get())
5177 found = true;
5178 }
5179
5180 // The main executable will never be included in libraries-svr4, don't
5181 // remove it
5182 if (!found &&
5183 loaded_module.get() != target.GetExecutableModulePointer()) {
5184 removed_modules.Append(loaded_module);
5185 }
5186 }
5187
5188 loaded_modules.Remove(removed_modules);
5189 m_process->GetTarget().ModulesDidUnload(removed_modules, false);
5190
5191 new_modules.ForEach([&target](const lldb::ModuleSP module_sp) -> bool {
5192 lldb_private::ObjectFile *obj = module_sp->GetObjectFile();
5193 if (!obj)
5194 return true;
5195
5197 return true;
5198
5199 lldb::ModuleSP module_copy_sp = module_sp;
5200 target.SetExecutableModule(module_copy_sp, eLoadDependentsNo);
5201 return false;
5202 });
5203
5204 loaded_modules.AppendIfNeeded(new_modules);
5205 m_process->GetTarget().ModulesDidLoad(new_modules);
5206 }
5207
5208 return llvm::ErrorSuccess();
5209}
5210
5212 bool &is_loaded,
5213 lldb::addr_t &load_addr) {
5214 is_loaded = false;
5215 load_addr = LLDB_INVALID_ADDRESS;
5216
5217 std::string file_path = file.GetPath(false);
5218 if (file_path.empty())
5219 return Status::FromErrorString("Empty file name specified");
5220
5221 StreamString packet;
5222 packet.PutCString("qFileLoadAddress:");
5223 packet.PutStringAsRawHex8(file_path);
5224
5225 StringExtractorGDBRemote response;
5226 if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetString(), response) !=
5228 return Status::FromErrorString("Sending qFileLoadAddress packet failed");
5229
5230 if (response.IsErrorResponse()) {
5231 if (response.GetError() == 1) {
5232 // The file is not loaded into the inferior
5233 is_loaded = false;
5234 load_addr = LLDB_INVALID_ADDRESS;
5235 return Status();
5236 }
5237
5239 "Fetching file load address from remote server returned an error");
5240 }
5241
5242 if (response.IsNormalResponse()) {
5243 is_loaded = true;
5244 load_addr = response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
5245 return Status();
5246 }
5247
5249 "Unknown error happened during sending the load address packet");
5250}
5251
5253 // We must call the lldb_private::Process::ModulesDidLoad () first before we
5254 // do anything
5255 Process::ModulesDidLoad(module_list);
5256
5257 // After loading shared libraries, we can ask our remote GDB server if it
5258 // needs any symbols.
5260}
5261
5262void ProcessGDBRemote::HandleAsyncStdout(llvm::StringRef out) {
5263 AppendSTDOUT(out.data(), out.size());
5264}
5265
5266static const char *end_delimiter = "--end--;";
5267static const int end_delimiter_len = 8;
5268
5269void ProcessGDBRemote::HandleAsyncMisc(llvm::StringRef data) {
5270 std::string input = data.str(); // '1' to move beyond 'A'
5271 if (m_partial_profile_data.length() > 0) {
5272 m_partial_profile_data.append(input);
5273 input = m_partial_profile_data;
5274 m_partial_profile_data.clear();
5275 }
5276
5277 size_t found, pos = 0, len = input.length();
5278 while ((found = input.find(end_delimiter, pos)) != std::string::npos) {
5279 StringExtractorGDBRemote profileDataExtractor(
5280 input.substr(pos, found).c_str());
5281 std::string profile_data =
5282 HarmonizeThreadIdsForProfileData(profileDataExtractor);
5283 BroadcastAsyncProfileData(profile_data);
5284
5285 pos = found + end_delimiter_len;
5286 }
5287
5288 if (pos < len) {
5289 // Last incomplete chunk.
5290 m_partial_profile_data = input.substr(pos);
5291 }
5292}
5293
5295 StringExtractorGDBRemote &profileDataExtractor) {
5296 std::map<uint64_t, uint32_t> new_thread_id_to_used_usec_map;
5297 std::string output;
5298 llvm::raw_string_ostream output_stream(output);
5299 llvm::StringRef name, value;
5300
5301 // Going to assuming thread_used_usec comes first, else bail out.
5302 while (profileDataExtractor.GetNameColonValue(name, value)) {
5303 if (name.compare("thread_used_id") == 0) {
5304 StringExtractor threadIDHexExtractor(value);
5305 uint64_t thread_id = threadIDHexExtractor.GetHexMaxU64(false, 0);
5306
5307 bool has_used_usec = false;
5308 uint32_t curr_used_usec = 0;
5309 llvm::StringRef usec_name, usec_value;
5310 uint32_t input_file_pos = profileDataExtractor.GetFilePos();
5311 if (profileDataExtractor.GetNameColonValue(usec_name, usec_value)) {
5312 if (usec_name == "thread_used_usec") {
5313 has_used_usec = true;
5314 usec_value.getAsInteger(0, curr_used_usec);
5315 } else {
5316 // We didn't find what we want, it is probably an older version. Bail
5317 // out.
5318 profileDataExtractor.SetFilePos(input_file_pos);
5319 }
5320 }
5321
5322 if (has_used_usec) {
5323 uint32_t prev_used_usec = 0;
5324 std::map<uint64_t, uint32_t>::iterator iterator =
5325 m_thread_id_to_used_usec_map.find(thread_id);
5326 if (iterator != m_thread_id_to_used_usec_map.end())
5327 prev_used_usec = iterator->second;
5328
5329 uint32_t real_used_usec = curr_used_usec - prev_used_usec;
5330 // A good first time record is one that runs for at least 0.25 sec
5331 bool good_first_time =
5332 (prev_used_usec == 0) && (real_used_usec > 250000);
5333 bool good_subsequent_time =
5334 (prev_used_usec > 0) &&
5335 ((real_used_usec > 0) || (HasAssignedIndexIDToThread(thread_id)));
5336
5337 if (good_first_time || good_subsequent_time) {
5338 // We try to avoid doing too many index id reservation, resulting in
5339 // fast increase of index ids.
5340
5341 output_stream << name << ":";
5342 int32_t index_id = AssignIndexIDToThread(thread_id);
5343 output_stream << index_id << ";";
5344
5345 output_stream << usec_name << ":" << usec_value << ";";
5346 } else {
5347 // Skip past 'thread_used_name'.
5348 llvm::StringRef local_name, local_value;
5349 profileDataExtractor.GetNameColonValue(local_name, local_value);
5350 }
5351
5352 // Store current time as previous time so that they can be compared
5353 // later.
5354 new_thread_id_to_used_usec_map[thread_id] = curr_used_usec;
5355 } else {
5356 // Bail out and use old string.
5357 output_stream << name << ":" << value << ";";
5358 }
5359 } else {
5360 output_stream << name << ":" << value << ";";
5361 }
5362 }
5363 output_stream << end_delimiter;
5364 m_thread_id_to_used_usec_map = new_thread_id_to_used_usec_map;
5365
5366 return output;
5367}
5368
5370 if (GetStopID() != 0)
5371 return;
5372
5373 if (GetID() == LLDB_INVALID_PROCESS_ID) {
5375 if (pid != LLDB_INVALID_PROCESS_ID)
5376 SetID(pid);
5377 }
5379}
5380
5381llvm::Expected<bool> ProcessGDBRemote::SaveCore(llvm::StringRef outfile) {
5383 return false;
5384
5385 StreamString packet;
5386 packet.PutCString("qSaveCore;path-hint:");
5387 packet.PutStringAsRawHex8(outfile);
5388
5389 StringExtractorGDBRemote response;
5390 if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetString(), response) ==
5392 // TODO: grab error message from the packet? StringExtractor seems to
5393 // be missing a method for that
5394 if (response.IsErrorResponse())
5395 return llvm::createStringError(
5396 llvm::inconvertibleErrorCode(),
5397 llvm::formatv("qSaveCore returned an error"));
5398
5399 std::string path;
5400
5401 // process the response
5402 for (auto x : llvm::split(response.GetStringRef(), ';')) {
5403 if (x.consume_front("core-path:"))
5405 }
5406
5407 // verify that we've gotten what we need
5408 if (path.empty())
5409 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5410 "qSaveCore returned no core path");
5411
5412 // now transfer the core file
5413 FileSpec remote_core{llvm::StringRef(path)};
5414 Platform &platform = *GetTarget().GetPlatform();
5415 Status error = platform.GetFile(remote_core, FileSpec(outfile));
5416
5417 if (platform.IsRemote()) {
5418 // NB: we unlink the file on error too
5419 platform.Unlink(remote_core);
5420 if (error.Fail())
5421 return error.ToError();
5422 }
5423
5424 return true;
5425 }
5426
5427 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5428 "Unable to send qSaveCore");
5429}
5430
5431static const char *const s_async_json_packet_prefix = "JSON-async:";
5432
5434ParseStructuredDataPacket(llvm::StringRef packet) {
5435 Log *log = GetLog(GDBRLog::Process);
5436
5437 if (!packet.consume_front(s_async_json_packet_prefix)) {
5438 if (log) {
5439 LLDB_LOGF(
5440 log,
5441 "GDBRemoteCommunicationClientBase::%s() received $J packet "
5442 "but was not a StructuredData packet: packet starts with "
5443 "%s",
5444 __FUNCTION__,
5445 packet.slice(0, strlen(s_async_json_packet_prefix)).str().c_str());
5446 }
5447 return StructuredData::ObjectSP();
5448 }
5449
5450 // This is an asynchronous JSON packet, destined for a StructuredDataPlugin.
5452 if (log) {
5453 if (json_sp) {
5454 StreamString json_str;
5455 json_sp->Dump(json_str, true);
5456 json_str.Flush();
5457 LLDB_LOGF(log,
5458 "ProcessGDBRemote::%s() "
5459 "received Async StructuredData packet: %s",
5460 __FUNCTION__, json_str.GetData());
5461 } else {
5462 LLDB_LOGF(log,
5463 "ProcessGDBRemote::%s"
5464 "() received StructuredData packet:"
5465 " parse failure",
5466 __FUNCTION__);
5467 }
5468 }
5469 return json_sp;
5470}
5471
5473 auto structured_data_sp = ParseStructuredDataPacket(data);
5474 if (structured_data_sp)
5475 RouteAsyncStructuredData(structured_data_sp);
5476}
5477
5479public:
5481 : CommandObjectParsed(interpreter, "process plugin packet speed-test",
5482 "Tests packet speeds of various sizes to determine "
5483 "the performance characteristics of the GDB remote "
5484 "connection. ",
5485 nullptr),
5486 m_option_group(),
5487 m_num_packets(LLDB_OPT_SET_1, false, "count", 'c', 0, eArgTypeCount,
5488 "The number of packets to send of each varying size "
5489 "(default is 1000).",
5490 1000),
5491 m_max_send(LLDB_OPT_SET_1, false, "max-send", 's', 0, eArgTypeCount,
5492 "The maximum number of bytes to send in a packet. Sizes "
5493 "increase in powers of 2 while the size is less than or "
5494 "equal to this option value. (default 1024).",
5495 1024),
5496 m_max_recv(LLDB_OPT_SET_1, false, "max-receive", 'r', 0, eArgTypeCount,
5497 "The maximum number of bytes to receive in a packet. Sizes "
5498 "increase in powers of 2 while the size is less than or "
5499 "equal to this option value. (default 1024).",
5500 1024),
5501 m_json(LLDB_OPT_SET_1, false, "json", 'j',
5502 "Print the output as JSON data for easy parsing.", false, true) {
5503 m_option_group.Append(&m_num_packets, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
5504 m_option_group.Append(&m_max_send, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
5505 m_option_group.Append(&m_max_recv, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
5506 m_option_group.Append(&m_json, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
5507 m_option_group.Finalize();
5508 }
5509
5511
5512 Options *GetOptions() override { return &m_option_group; }
5513
5514 void DoExecute(Args &command, CommandReturnObject &result) override {
5515 const size_t argc = command.GetArgumentCount();
5516 if (argc == 0) {
5517 ProcessGDBRemote *process =
5518 (ProcessGDBRemote *)m_interpreter.GetExecutionContext()
5519 .GetProcessPtr();
5520 if (process) {
5521 StreamSP output_stream_sp = result.GetImmediateOutputStream();
5522 if (!output_stream_sp)
5523 output_stream_sp =
5524 StreamSP(m_interpreter.GetDebugger().GetAsyncOutputStream());
5525 result.SetImmediateOutputStream(output_stream_sp);
5526
5527 const uint32_t num_packets =
5528 (uint32_t)m_num_packets.GetOptionValue().GetCurrentValue();
5529 const uint64_t max_send = m_max_send.GetOptionValue().GetCurrentValue();
5530 const uint64_t max_recv = m_max_recv.GetOptionValue().GetCurrentValue();
5531 const bool json = m_json.GetOptionValue().GetCurrentValue();
5532 const uint64_t k_recv_amount =
5533 4 * 1024 * 1024; // Receive amount in bytes
5534 process->GetGDBRemote().TestPacketSpeed(
5535 num_packets, max_send, max_recv, k_recv_amount, json,
5536 output_stream_sp ? *output_stream_sp : result.GetOutputStream());
5538 return;
5539 }
5540 } else {
5541 result.AppendErrorWithFormat("'%s' takes no arguments",
5542 m_cmd_name.c_str());
5543 }
5545 }
5546
5547protected:
5553};
5554
5556private:
5557public:
5559 : CommandObjectParsed(interpreter, "process plugin packet history",
5560 "Dumps the packet history buffer. ", nullptr) {}
5561
5563
5564 void DoExecute(Args &command, CommandReturnObject &result) override {
5565 ProcessGDBRemote *process =
5566 (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
5567 if (process) {
5568 process->DumpPluginHistory(result.GetOutputStream());
5570 return;
5571 }
5573 }
5574};
5575
5577private:
5578public:
5581 interpreter, "process plugin packet xfer-size",
5582 "Maximum size that lldb will try to read/write one one chunk.",
5583 nullptr) {
5584 AddSimpleArgumentList(eArgTypeUnsignedInteger);
5585 }
5586
5588
5589 void DoExecute(Args &command, CommandReturnObject &result) override {
5590 const size_t argc = command.GetArgumentCount();
5591 if (argc == 0) {
5592 result.AppendErrorWithFormat("'%s' takes an argument to specify the max "
5593 "amount to be transferred when "
5594 "reading/writing",
5595 m_cmd_name.c_str());
5596 return;
5597 }
5598
5599 ProcessGDBRemote *process =
5600 (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
5601 if (process) {
5602 const char *packet_size = command.GetArgumentAtIndex(0);
5603 errno = 0;
5604 uint64_t user_specified_max = strtoul(packet_size, nullptr, 10);
5605 if (errno == 0 && user_specified_max != 0) {
5606 process->SetUserSpecifiedMaxMemoryTransferSize(user_specified_max);
5608 return;
5609 }
5610 }
5612 }
5613};
5614
5616private:
5617public:
5619 : CommandObjectParsed(interpreter, "process plugin packet send",
5620 "Send a custom packet through the GDB remote "
5621 "protocol and print the answer. "
5622 "The packet header and footer will automatically "
5623 "be added to the packet prior to sending and "
5624 "stripped from the result.",
5625 nullptr) {
5626 AddSimpleArgumentList(eArgTypeNone, eArgRepeatStar);
5627 }
5628
5630
5631 void DoExecute(Args &command, CommandReturnObject &result) override {
5632 const size_t argc = command.GetArgumentCount();
5633 if (argc == 0) {
5634 result.AppendErrorWithFormat(
5635 "'%s' takes a one or more packet content arguments",
5636 m_cmd_name.c_str());
5637 return;
5638 }
5639
5640 ProcessGDBRemote *process =
5641 (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
5642 if (process) {
5643 for (size_t i = 0; i < argc; ++i) {
5644 const char *packet_cstr = command.GetArgumentAtIndex(0);
5645 StringExtractorGDBRemote response;
5647 packet_cstr, response, process->GetInterruptTimeout());
5649 Stream &output_strm = result.GetOutputStream();
5650 output_strm.Printf(" packet: %s\n", packet_cstr);
5651 std::string response_str = std::string(response.GetStringRef());
5652
5653 if (strstr(packet_cstr, "qGetProfileData") != nullptr) {
5654 response_str = process->HarmonizeThreadIdsForProfileData(response);
5655 }
5656
5657 if (response_str.empty())
5658 output_strm.PutCString("response: \nerror: UNIMPLEMENTED\n");
5659 else
5660 output_strm.Printf("response: %s\n", response.GetStringRef().data());
5661 }
5662 }
5663 }
5664};
5665
5667private:
5668public:
5670 : CommandObjectRaw(interpreter, "process plugin packet monitor",
5671 "Send a qRcmd packet through the GDB remote protocol "
5672 "and print the response."
5673 "The argument passed to this command will be hex "
5674 "encoded into a valid 'qRcmd' packet, sent and the "
5675 "response will be printed.") {}
5676
5678
5679 void DoExecute(llvm::StringRef command,
5680 CommandReturnObject &result) override {
5681 if (command.empty()) {
5682 result.AppendErrorWithFormat("'%s' takes a command string argument",
5683 m_cmd_name.c_str());
5684 return;
5685 }
5686
5687 ProcessGDBRemote *process =
5688 (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
5689 if (process) {
5690 StreamString packet;
5691 packet.PutCString("qRcmd,");
5692 packet.PutBytesAsRawHex8(command.data(), command.size());
5693
5694 StringExtractorGDBRemote response;
5695 Stream &output_strm = result.GetOutputStream();
5697 packet.GetString(), response, process->GetInterruptTimeout(),
5698 [&output_strm](llvm::StringRef output) { output_strm << output; });
5700 output_strm.Printf(" packet: %s\n", packet.GetData());
5701 const std::string &response_str = std::string(response.GetStringRef());
5702
5703 if (response_str.empty())
5704 output_strm.PutCString("response: \nerror: UNIMPLEMENTED\n");
5705 else
5706 output_strm.Printf("response: %s\n", response.GetStringRef().data());
5707 }
5708 }
5709};
5710
5712private:
5713public:
5715 : CommandObjectMultiword(interpreter, "process plugin packet",
5716 "Commands that deal with GDB remote packets.",
5717 nullptr) {
5718 LoadSubCommand(
5719 "history",
5722 LoadSubCommand(
5723 "send", CommandObjectSP(
5724 new CommandObjectProcessGDBRemotePacketSend(interpreter)));
5725 LoadSubCommand(
5726 "monitor",
5729 LoadSubCommand(
5730 "xfer-size",
5733 LoadSubCommand("speed-test",
5735 interpreter)));
5736 }
5737
5739};
5740
5742public:
5745 interpreter, "process plugin",
5746 "Commands for operating on a ProcessGDBRemote process.",
5747 "process plugin <subcommand> [<subcommand-options>]") {
5748 LoadSubCommand(
5749 "packet",
5751 }
5752
5754};
5755
5757 if (!m_command_sp)
5758 m_command_sp = std::make_shared<CommandObjectMultiwordProcessGDBRemote>(
5759 GetTarget().GetDebugger().GetCommandInterpreter());
5760 return m_command_sp.get();
5761}
5762
5764 GetBreakpointSiteList().ForEach([this, enable](BreakpointSite *bp_site) {
5765 if (bp_site->IsEnabled() &&
5766 (bp_site->GetType() == BreakpointSite::eSoftware ||
5767 bp_site->GetType() == BreakpointSite::eExternal)) {
5768 m_gdb_comm.SendGDBStoppointTypePacket(
5769 eBreakpointSoftware, enable, bp_site->GetLoadAddress(),
5770 GetSoftwareBreakpointTrapOpcode(bp_site), GetInterruptTimeout());
5771 }
5772 });
5773}
5774
5777 GetBreakpointSiteList().ForEach([this, enable](BreakpointSite *bp_site) {
5778 if (bp_site->IsEnabled() &&
5779 bp_site->GetType() == BreakpointSite::eHardware) {
5780 m_gdb_comm.SendGDBStoppointTypePacket(
5781 eBreakpointHardware, enable, bp_site->GetLoadAddress(),
5782 GetSoftwareBreakpointTrapOpcode(bp_site), GetInterruptTimeout());
5783 }
5784 });
5785 }
5786
5787 for (const auto &wp_res_sp : m_watchpoint_resource_list.Sites()) {
5788 addr_t addr = wp_res_sp->GetLoadAddress();
5789 size_t size = wp_res_sp->GetByteSize();
5790 GDBStoppointType type = GetGDBStoppointType(wp_res_sp);
5791 m_gdb_comm.SendGDBStoppointTypePacket(type, enable, addr, size,
5793 }
5794}
5795
5797 Log *log = GetLog(GDBRLog::Process);
5798
5800 // Any valid TID will suffice, thread-relevant actions will set a proper TID
5801 // anyway.
5802 lldb::tid_t parent_tid = m_thread_ids.front();
5803
5804 lldb::pid_t follow_pid, detach_pid;
5805 lldb::tid_t follow_tid, detach_tid;
5806
5807 switch (GetFollowForkMode()) {
5808 case eFollowParent:
5809 follow_pid = parent_pid;
5810 follow_tid = parent_tid;
5811 detach_pid = child_pid;
5812 detach_tid = child_tid;
5813 break;
5814 case eFollowChild:
5815 follow_pid = child_pid;
5816 follow_tid = child_tid;
5817 detach_pid = parent_pid;
5818 detach_tid = parent_tid;
5819 break;
5820 }
5821
5822 // Switch to the process that is going to be detached.
5823 if (!m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
5824 LLDB_LOG(log, "ProcessGDBRemote::DidFork() unable to set pid/tid");
5825 return;
5826 }
5827
5828 // Disable all software breakpoints in the forked process.
5831
5832 // Remove hardware breakpoints / watchpoints from parent process if we're
5833 // following child.
5836
5837 // Switch to the process that is going to be followed
5838 if (!m_gdb_comm.SetCurrentThread(follow_tid, follow_pid) ||
5839 !m_gdb_comm.SetCurrentThreadForRun(follow_tid, follow_pid)) {
5840 LLDB_LOG(log, "ProcessGDBRemote::DidFork() unable to reset pid/tid");
5841 return;
5842 }
5843
5844 LLDB_LOG(log, "Detaching process {0}", detach_pid);
5845 Status error = m_gdb_comm.Detach(false, detach_pid);
5846 if (error.Fail()) {
5847 LLDB_LOG(log, "ProcessGDBRemote::DidFork() detach packet send failed: {0}",
5848 error.AsCString() ? error.AsCString() : "<unknown error>");
5849 return;
5850 }
5851
5852 // Hardware breakpoints/watchpoints are not inherited implicitly,
5853 // so we need to readd them if we're following child.
5856 // Update our PID
5857 SetID(child_pid);
5858 }
5859}
5860
5862 Log *log = GetLog(GDBRLog::Process);
5863
5864 LLDB_LOG(
5865 log,
5866 "ProcessGDBRemote::DidFork() called for child_pid: {0}, child_tid {1}",
5867 child_pid, child_tid);
5869
5870 // Disable all software breakpoints for the duration of vfork.
5873
5874 lldb::pid_t detach_pid;
5875 lldb::tid_t detach_tid;
5876
5877 switch (GetFollowForkMode()) {
5878 case eFollowParent:
5879 detach_pid = child_pid;
5880 detach_tid = child_tid;
5881 break;
5882 case eFollowChild:
5883 detach_pid = m_gdb_comm.GetCurrentProcessID();
5884 // Any valid TID will suffice, thread-relevant actions will set a proper TID
5885 // anyway.
5886 detach_tid = m_thread_ids.front();
5887
5888 // Switch to the parent process before detaching it.
5889 if (!m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
5890 LLDB_LOG(log, "ProcessGDBRemote::DidFork() unable to set pid/tid");
5891 return;
5892 }
5893
5894 // Remove hardware breakpoints / watchpoints from the parent process.
5896
5897 // Switch to the child process.
5898 if (!m_gdb_comm.SetCurrentThread(child_tid, child_pid) ||
5899 !m_gdb_comm.SetCurrentThreadForRun(child_tid, child_pid)) {
5900 LLDB_LOG(log, "ProcessGDBRemote::DidFork() unable to reset pid/tid");
5901 return;
5902 }
5903 break;
5904 }
5905
5906 LLDB_LOG(log, "Detaching process {0}", detach_pid);
5907 Status error = m_gdb_comm.Detach(false, detach_pid);
5908 if (error.Fail()) {
5909 LLDB_LOG(log,
5910 "ProcessGDBRemote::DidFork() detach packet send failed: {0}",
5911 error.AsCString() ? error.AsCString() : "<unknown error>");
5912 return;
5913 }
5914
5916 // Update our PID
5917 SetID(child_pid);
5918 }
5919}
5920
5922 assert(m_vfork_in_progress_count > 0);
5924
5925 // Reenable all software breakpoints that were enabled before vfork.
5928}
5929
5931 // If we are following children, vfork is finished by exec (rather than
5932 // vforkdone that is submitted for parent).
5936 }
5938}
static llvm::raw_ostream & error(Stream &strm)
#define DEBUGSERVER_BASENAME
static PluginProperties & GetGlobalPluginProperties()
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
Definition: Log.h:369
#define LLDB_LOGF(log,...)
Definition: Log.h:376
#define LLDB_LOG_ERROR(log, error,...)
Definition: Log.h:392
#define LLDB_LOGV(log,...)
Definition: Log.h:383
#define LLDB_PLUGIN_DEFINE(PluginName)
Definition: PluginManager.h:32
static PluginProperties & GetGlobalPluginProperties()
static const char *const s_async_json_packet_prefix
static size_t SplitCommaSeparatedRegisterNumberString(const llvm::StringRef &comma_separated_register_numbers, std::vector< uint32_t > &regnums, int base)
static const char * end_delimiter
static GDBStoppointType GetGDBStoppointType(const WatchpointResourceSP &wp_res_sp)
static bool SetCloexecFlag(int fd)
static StructuredData::ObjectSP ParseStructuredDataPacket(llvm::StringRef packet)
static const int end_delimiter_len
CommandObjectMultiwordProcessGDBRemote(CommandInterpreter &interpreter)
~CommandObjectMultiwordProcessGDBRemote() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectProcessGDBRemotePacketHistory() override=default
CommandObjectProcessGDBRemotePacketHistory(CommandInterpreter &interpreter)
~CommandObjectProcessGDBRemotePacketMonitor() override=default
void DoExecute(llvm::StringRef command, CommandReturnObject &result) override
CommandObjectProcessGDBRemotePacketMonitor(CommandInterpreter &interpreter)
CommandObjectProcessGDBRemotePacketSend(CommandInterpreter &interpreter)
~CommandObjectProcessGDBRemotePacketSend() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectProcessGDBRemotePacketXferSize() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectProcessGDBRemotePacketXferSize(CommandInterpreter &interpreter)
~CommandObjectProcessGDBRemotePacket() override=default
CommandObjectProcessGDBRemotePacket(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectProcessGDBRemoteSpeedTest() override=default
CommandObjectProcessGDBRemoteSpeedTest(CommandInterpreter &interpreter)
static constexpr lldb::pid_t AllProcesses
std::optional< std::pair< lldb::pid_t, lldb::tid_t > > GetPidTid(lldb::pid_t default_pid)
ResponseType GetResponseType() const
void SetFilePos(uint32_t idx)
uint64_t GetHexMaxU64(bool little_endian, uint64_t fail_value)
size_t GetBytesLeft()
bool GetNameColonValue(llvm::StringRef &name, llvm::StringRef &value)
uint64_t GetU64(uint64_t fail_value, int base=0)
size_t GetHexByteString(std::string &str)
uint8_t GetHexU8(uint8_t fail_value=0, bool set_eof_on_fail=true)
char GetChar(char fail_value='\0')
size_t GetHexBytes(llvm::MutableArrayRef< uint8_t > dest, uint8_t fail_fill_value)
uint64_t GetFilePos() const
llvm::StringRef GetStringRef() const
static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch)
Definition: ABI.cpp:27
A class which holds the metadata from a remote stub/corefile note about how many bits are used for ad...
void SetHighmemAddressableBits(uint32_t highmem_addressing_bits)
void SetAddressableBits(uint32_t addressing_bits)
When a single value is available for the number of bits.
void SetLowmemAddressableBits(uint32_t lowmem_addressing_bits)
An architecture specification class.
Definition: ArchSpec.h:31
bool IsValid() const
Tests if this ArchSpec is valid.
Definition: ArchSpec.h:359
void Clear()
Clears the object state.
Definition: ArchSpec.cpp:560
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition: ArchSpec.h:461
bool SetTriple(const llvm::Triple &triple)
Architecture triple setter.
Definition: ArchSpec.cpp:765
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
Definition: ArchSpec.h:513
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
Definition: ArchSpec.cpp:701
Core GetCore() const
Definition: ArchSpec.h:440
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
Definition: ArchSpec.cpp:570
A command line argument class.
Definition: Args.h:33
static lldb::Encoding StringToEncoding(llvm::StringRef s, lldb::Encoding fail_value=lldb::eEncodingInvalid)
Definition: Args.cpp:431
static uint32_t StringToGenericRegister(llvm::StringRef s)
Definition: Args.cpp:441
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
Definition: Args.h:120
void ReplaceArgumentAtIndex(size_t idx, llvm::StringRef arg_str, char quote_char='\0')
Replaces the argument value at index idx to arg_str if idx is a valid argument index.
Definition: Args.cpp:347
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
Definition: Args.cpp:273
Class that manages the actual breakpoint that will be inserted into the running program.
BreakpointSite::Type GetType() const
void SetType(BreakpointSite::Type type)
bool IsEnabled() const
Tells whether the current breakpoint site is enabled or not.
void SetEnabled(bool enabled)
Sets whether the current breakpoint site is enabled or not.
void SetEventName(uint32_t event_mask, const char *name)
Set the name for an event bit.
Definition: Broadcaster.h:243
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
Definition: Broadcaster.h:168
void SetStatus(lldb::ReturnStatus status)
void SetImmediateOutputStream(const lldb::StreamSP &stream_sp)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
bool IsConnected() const
Check if the connection is valid.
virtual void SetConnection(std::unique_ptr< Connection > connection)
Sets the connection that it to be used by this class.
size_t WriteAll(const void *src, size_t src_len, lldb::ConnectionStatus &status, Status *error_ptr)
Repeatedly attempt writing until either src_len bytes are written or a permanent failure occurs.
virtual lldb::ConnectionStatus Disconnect(Status *error_ptr=nullptr)
Disconnect the communications connection if one is currently connected.
A uniqued constant string class.
Definition: ConstString.h:40
void SetCString(const char *cstr)
Set the C string value.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
Definition: ConstString.h:188
void SetString(llvm::StringRef s)
A subclass of DataBuffer that stores a data buffer on the heap.
An data extractor class.
Definition: DataExtractor.h:48
A class to manage flag bits.
Definition: Debugger.h:80
static void ReportError(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report error events.
Definition: Debugger.cpp:1628
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
Definition: Debugger.cpp:1719
A plug-in interface definition class for dynamic loaders.
Definition: DynamicLoader.h:54
static lldb::ModuleSP LoadBinaryWithUUIDAndAddress(Process *process, llvm::StringRef name, UUID uuid, lldb::addr_t value, bool value_is_offset, bool force_symbol_search, bool notify, bool set_address_in_target, bool allow_memory_image_last_resort)
Find/load a binary into lldb given a UUID and the address where it is loaded in memory,...
virtual lldb::ModuleSP LoadModuleAtAddress(const lldb_private::FileSpec &file, lldb::addr_t link_map_addr, lldb::addr_t base_addr, bool base_addr_is_offset)
Locates or creates a module given by file and updates/loads the resulting module at the virtual base ...
static DynamicLoader * FindPlugin(Process *process, llvm::StringRef plugin_name)
Find a dynamic loader plugin for a given process.
const void * GetBytes() const
Definition: Event.cpp:140
static const EventDataBytes * GetEventDataFromEvent(const Event *event_ptr)
Definition: Event.cpp:161
size_t GetByteSize() const
Definition: Event.cpp:144
std::vector< Enumerator > Enumerators
Definition: RegisterFlags.h:39
const Enumerators & GetEnumerators() const
Definition: RegisterFlags.h:46
void DumpToLog(Log *log) const
Action GetAction() const
Definition: FileAction.h:38
const FileSpec & GetFileSpec() const
Definition: FileAction.cpp:32
A file utility class.
Definition: FileSpec.h:56
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
Definition: FileSpec.cpp:367
void Resolve(llvm::SmallVectorImpl< char > &path)
Resolve path to make it canonical.
static const char * DEV_NULL
Definition: FileSystem.h:32
bool Exists(const FileSpec &file_spec) const
Returns whether the given file exists.
int Open(const char *path, int flags, int mode=0600)
Wraps ::open in a platform-independent way.
static FileSystem & Instance()
@ eOpenOptionWriteOnly
Definition: File.h:52
@ eOpenOptionCanCreate
Definition: File.h:56
ValueType Get() const
Get accessor for all flags.
Definition: Flags.h:40
Status Join(lldb::thread_result_t *result)
Definition: HostThread.cpp:20
static void Kill(lldb::pid_t pid, int signo)
static lldb::ListenerSP MakeListener(const char *name)
Definition: Listener.cpp:376
void add(const LoadedModuleInfo &mod)
std::vector< LoadedModuleInfo > m_list
void PutCString(const char *cstr)
Definition: Log.cpp:145
void void void void void Warning(const char *fmt,...) __attribute__((format(printf
Definition: Log.cpp:211
bool GetVerbose() const
Definition: Log.cpp:326
void AddL1CacheData(lldb::addr_t addr, const void *src, size_t src_len)
Definition: Memory.cpp:41
lldb::offset_t GetBlocksize() const
OptionalBool GetFlash() const
A collection class for Module objects.
Definition: ModuleList.h:103
void ForEach(std::function< bool(const lldb::ModuleSP &module_sp)> const &callback) const
Applies 'callback' to each module in this ModuleList.
bool AppendIfNeeded(const lldb::ModuleSP &new_module, bool notify=true)
Append a module to the module list, if it is not already there.
Definition: ModuleList.cpp:280
bool Remove(const lldb::ModuleSP &module_sp, bool notify=true)
Remove a module from the module list.
Definition: ModuleList.cpp:334
lldb::ModuleSP GetModuleAtIndex(size_t idx) const
Get the module shared pointer for the module at index idx.
Definition: ModuleList.cpp:429
void Append(const lldb::ModuleSP &module_sp, bool notify=true)
Append a module to the module list.
Definition: ModuleList.cpp:247
size_t GetSize() const
Gets the size of the module list.
Definition: ModuleList.cpp:638
void Dump(Stream &strm) const
Definition: ModuleSpec.h:162
A class that describes an executable image and its associated object and symbol files.
Definition: Module.h:89
virtual ObjectFile * GetObjectFile()
Get the object file representation for the current architecture.
Definition: Module.cpp:1199
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
Definition: Module.h:453
A plug-in interface definition class for object file parsers.
Definition: ObjectFile.h:44
@ eTypeExecutable
A normal executable.
Definition: ObjectFile.h:53
@ eTypeDebugInfo
An object file that contains only debug information.
Definition: ObjectFile.h:55
@ eTypeStubLibrary
A library that can be linked against but not used for execution.
Definition: ObjectFile.h:63
@ eTypeObjectFile
An intermediate object file.
Definition: ObjectFile.h:59
@ eTypeDynamicLinker
The platform's dynamic linker executable.
Definition: ObjectFile.h:57
@ eTypeCoreFile
A core file that has a checkpoint of a program's execution state.
Definition: ObjectFile.h:51
@ eTypeSharedLibrary
A shared library that can be used during execution.
Definition: ObjectFile.h:61
@ eTypeJIT
JIT code that has symbols, sections and possibly debug info.
Definition: ObjectFile.h:65
A command line option parsing protocol class.
Definition: Options.h:58
A plug-in interface definition class for debug platform that includes many platform abilities such as...
Definition: Platform.h:76
virtual Status Unlink(const FileSpec &file_spec)
Definition: Platform.cpp:1225
bool IsRemote() const
Definition: Platform.h:506
virtual Status GetFile(const FileSpec &source, const FileSpec &destination)
Definition: Platform.cpp:1206
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool CreateSettingForProcessPlugin(Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, llvm::StringRef description, bool is_global_property)
static lldb::OptionValuePropertiesSP GetSettingForProcessPlugin(Debugger &debugger, llvm::StringRef setting_name)
static bool UnregisterPlugin(ABICreateInstance create_callback)
bool GetIgnoreExisting() const
Definition: Process.h:146
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
Definition: ProcessInfo.cpp:65
lldb::pid_t GetProcessID() const
Definition: ProcessInfo.h:68
FileSpec & GetExecutableFile()
Definition: ProcessInfo.h:43
uint32_t GetUserID() const
Definition: ProcessInfo.h:50
Environment & GetEnvironment()
Definition: ProcessInfo.h:88
void SetUserID(uint32_t uid)
Definition: ProcessInfo.h:58
const char * GetLaunchEventData() const
const FileAction * GetFileActionForFD(int fd) const
void SetMonitorProcessCallback(Host::MonitorChildProcessCallback callback)
void SetLaunchInSeparateProcessGroup(bool separate)
const FileSpec & GetWorkingDirectory() const
Args GetExtraStartupCommands() const
Definition: Process.cpp:203
FollowForkMode GetFollowForkMode() const
Definition: Process.cpp:365
std::chrono::seconds GetInterruptTimeout() const
Definition: Process.cpp:328
A plug-in interface definition class for debugging a process.
Definition: Process.h:343
StopPointSiteList< lldb_private::BreakpointSite > & GetBreakpointSiteList()
Definition: Process.cpp:1583
virtual Status DisableSoftwareBreakpoint(BreakpointSite *bp_site)
Definition: Process.cpp:1856
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
Definition: Process.h:542
ThreadList & GetThreadList()
Definition: Process.h:2182
void SetAddressableBitMasks(AddressableBits bit_masks)
Definition: Process.cpp:6762
lldb::StateType GetPrivateState()
Definition: Process.cpp:1425
void SetUnixSignals(lldb::UnixSignalsSP &&signals_sp)
Definition: Process.cpp:3601
virtual void ModulesDidLoad(ModuleList &module_list)
Definition: Process.cpp:6014
void ResumePrivateStateThread()
Definition: Process.cpp:3828
void MapSupportedStructuredDataPlugins(const StructuredData::Array &supported_type_names)
Loads any plugins associated with asynchronous structured data and maps the relevant supported type n...
Definition: Process.cpp:6245
virtual SystemRuntime * GetSystemRuntime()
Get the system runtime plug-in for this process.
Definition: Process.cpp:2854
std::map< uint64_t, uint32_t > m_thread_id_to_index_id_map
Definition: Process.h:3059
lldb::DynamicLoaderUP m_dyld_up
Definition: Process.h:3093
virtual Status WriteObjectFile(std::vector< ObjectFile::LoadableData > entries)
Definition: Process.cpp:2405
StopPointSiteList< lldb_private::WatchpointResource > m_watchpoint_resource_list
Watchpoint resources currently in use.
Definition: Process.h:3085
void AppendSTDOUT(const char *s, size_t len)
Definition: Process.cpp:4513
bool HasAssignedIndexIDToThread(uint64_t sb_thread_id)
Definition: Process.cpp:1289
lldb::ByteOrder GetByteOrder() const
Definition: Process.cpp:3611
void UpdateThreadListIfNeeded()
Definition: Process.cpp:1152
bool IsValid() const
Return whether this object is valid (i.e.
Definition: Process.h:577
virtual void DidExec()
Called after a process re-execs itself.
Definition: Process.cpp:5948
void BroadcastAsyncProfileData(const std::string &one_profile_data)
Definition: Process.cpp:4527
lldb::UnixSignalsSP m_unix_signals_sp
Definition: Process.h:3103
lldb::tid_t m_interrupt_tid
Definition: Process.h:3133
virtual Status EnableSoftwareBreakpoint(BreakpointSite *bp_site)
Definition: Process.cpp:1776
bool RouteAsyncStructuredData(const StructuredData::ObjectSP object_sp)
Route the incoming structured data dictionary to the right plugin.
Definition: Process.cpp:6315
virtual bool IsAlive()
Check if a process is still alive.
Definition: Process.cpp:1100
ThreadList m_thread_list_real
The threads for this process as are known to the protocol we are debugging with.
Definition: Process.h:3065
ThreadSafeValue< lldb::StateType > m_public_state
Definition: Process.h:3038
void SetID(lldb::pid_t new_pid)
Sets the stored pid.
Definition: Process.h:547
uint32_t AssignIndexIDToThread(uint64_t thread_id)
Definition: Process.cpp:1294
virtual bool SetExitStatus(int exit_status, llvm::StringRef exit_string)
Set accessor for the process exit status (return code).
Definition: Process.cpp:1064
MemoryCache m_memory_cache
Definition: Process.h:3116
uint32_t GetAddressByteSize() const
Definition: Process.cpp:3615
uint32_t GetStopID() const
Definition: Process.h:1451
void SetPrivateState(lldb::StateType state)
Definition: Process.cpp:1427
void SetSTDIOFileDescriptor(int file_descriptor)
Definition: Process.cpp:4763
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
Definition: Process.cpp:528
ThreadList m_thread_list
The threads for this process as the user will see them.
Definition: Process.h:3067
const lldb::UnixSignalsSP & GetUnixSignals()
Definition: Process.cpp:3606
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
Locate the memory region that contains load_addr.
Definition: Process.cpp:6188
size_t GetSoftwareBreakpointTrapOpcode(BreakpointSite *bp_site)
Definition: Process.cpp:1769
ThreadedCommunication m_stdio_communication
Definition: Process.h:3107
Target & GetTarget()
Get the target object pointer for this module.
Definition: Process.h:1246
bool SetPropertyAtIndex(uint32_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
virtual lldb::OptionValuePropertiesSP GetValueProperties() const
A pseudo terminal helper class.
llvm::Error OpenFirstAvailablePrimary(int oflag)
Open the first available pseudo terminal.
int GetPrimaryFileDescriptor() const
The primary file descriptor accessor.
int ReleasePrimaryFileDescriptor()
Release the primary file descriptor.
std::string GetSecondaryName() const
Get the name of the secondary pseudo terminal.
@ invalid_fd
Invalid file descriptor value.
const Entry * GetEntryAtIndex(size_t i) const
Definition: RangeMap.h:297
bool IsEmpty() const
Definition: RangeMap.h:293
size_t GetSize() const
Definition: RangeMap.h:295
void Insert(const Entry &entry, bool combine)
Definition: RangeMap.h:185
uint64_t GetMaxValue() const
The maximum unsigned value that could be contained in this field.
unsigned GetSizeInBits() const
Get size of the field in bits. Will always be at least 1.
virtual StructuredData::DictionarySP GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, const char *setting_name, lldb_private::Status &error)
virtual StructuredData::ObjectSP LoadPluginModule(const FileSpec &file_spec, lldb_private::Status &error)
static const shared_fd_t kInvalidFD
Definition: Socket.h:50
An error handling class.
Definition: Status.h:115
static Status FromErrno()
Set the current error to errno.
Definition: Status.cpp:276
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
Definition: Status.cpp:106
static Status FromErrorString(const char *str)
Definition: Status.h:138
bool Fail() const
Test for error condition.
Definition: Status.cpp:270
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
Definition: Status.cpp:195
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
Definition: Status.h:148
bool Success() const
Test for success condition.
Definition: Status.cpp:280
static lldb::StopInfoSP CreateStopReasonWithMachException(Thread &thread, uint32_t exc_type, uint32_t exc_data_count, uint64_t exc_code, uint64_t exc_sub_code, uint64_t exc_sub_sub_code, bool pc_already_adjusted=true, bool adjust_pc_if_needed=false)
static lldb::StopInfoSP CreateStopReasonToTrace(Thread &thread)
Definition: StopInfo.cpp:1478
static lldb::StopInfoSP CreateStopReasonVFork(Thread &thread, lldb::pid_t child_pid, lldb::tid_t child_tid)
Definition: StopInfo.cpp:1510
static lldb::StopInfoSP CreateStopReasonWithInterrupt(Thread &thread, int signo, const char *description)
Definition: StopInfo.cpp:1473
static lldb::StopInfoSP CreateStopReasonWithSignal(Thread &thread, int signo, const char *description=nullptr, std::optional< int > code=std::nullopt)
Definition: StopInfo.cpp:1466
static lldb::StopInfoSP CreateStopReasonFork(Thread &thread, lldb::pid_t child_pid, lldb::tid_t child_tid)
Definition: StopInfo.cpp:1503
static lldb::StopInfoSP CreateStopReasonVForkDone(Thread &thread)
Definition: StopInfo.cpp:1516
static lldb::StopInfoSP CreateStopReasonWithWatchpointID(Thread &thread, lldb::break_id_t watch_id, bool silently_continue=false)
Definition: StopInfo.cpp:1459
static lldb::StopInfoSP CreateStopReasonWithException(Thread &thread, const char *description)
Definition: StopInfo.cpp:1489
static lldb::StopInfoSP CreateStopReasonWithBreakpointSiteID(Thread &thread, lldb::break_id_t break_id)
static lldb::StopInfoSP CreateStopReasonProcessorTrace(Thread &thread, const char *description)
Definition: StopInfo.cpp:1494
static lldb::StopInfoSP CreateStopReasonWithExec(Thread &thread)
Definition: StopInfo.cpp:1499
StopPointSite::SiteID Add(const StopPointSiteSP &site_sp)
Add a site to the list.
void ForEach(std::function< void(StopPointSite *)> const &callback)
bool Remove(typename StopPointSite::SiteID site_id)
Removes the site given by site_id from this list.
StopPointSiteSP FindByAddress(lldb::addr_t addr)
Returns a shared pointer to the site at address addr.
std::vector< StopPointSiteSP > Sites()
General Outline: When we hit a breakpoint we need to package up whatever information is needed to eva...
lldb::break_id_t GetID() const
Definition: StoppointSite.h:45
virtual lldb::addr_t GetLoadAddress() const
Definition: StoppointSite.h:27
int PutEscapedBytes(const void *s, size_t src_len)
Output a block of data to the stream performing GDB-remote escaping.
Definition: GDBRemote.cpp:28
const char * GetData() const
Definition: StreamString.h:45
void Flush() override
Flush the stream.
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
void Format(const char *format, Args &&... args)
Definition: Stream.h:353
size_t PutStringAsRawHex8(llvm::StringRef s)
Definition: Stream.cpp:410
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition: Stream.cpp:134
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition: Stream.cpp:65
size_t PutChar(char ch)
Definition: Stream.cpp:131
size_t PutBytesAsRawHex8(const void *src, size_t src_len, lldb::ByteOrder src_byte_order=lldb::eByteOrderInvalid, lldb::ByteOrder dst_byte_order=lldb::eByteOrderInvalid)
Definition: Stream.cpp:383
ObjectSP GetItemAtIndex(size_t idx) const
bool ForEach(std::function< bool(Object *object)> const &foreach_callback) const
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
void ForEach(std::function< bool(llvm::StringRef key, Object *object)> const &callback) const
llvm::StringRef GetStringValue(const char *fail_value=nullptr)
uint64_t GetUnsignedIntegerValue(uint64_t fail_value=0)
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
static ObjectSP ParseJSON(llvm::StringRef json_text)
std::shared_ptr< Array > ArraySP
A plug-in interface definition class for system runtimes.
Definition: SystemRuntime.h:43
virtual void AddThreadExtendedInfoPacketHints(lldb_private::StructuredData::ObjectSP dict)
Add key-value pairs to the StructuredData dictionary object with information debugserver may need whe...
void ModulesDidLoad(ModuleList &module_list)
Definition: Target.cpp:1814
Module * GetExecutableModulePointer()
Definition: Target.cpp:1518
Debugger & GetDebugger()
Definition: Target.h:1080
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
Definition: Target.cpp:1662
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
Definition: Target.cpp:1504
void ModulesDidUnload(ModuleList &module_list, bool delete_locations)
Definition: Target.cpp:1850
lldb::PlatformSP GetPlatform()
Definition: Target.h:1463
const ModuleList & GetImages() const
Get accessor for the images for this process.
Definition: Target.h:997
const ArchSpec & GetArchitecture() const
Definition: Target.h:1039
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
Definition: Target.cpp:1553
bool MergeArchitecture(const ArchSpec &arch_spec)
Definition: Target.cpp:1751
void AddThreadSortedByIndexID(const lldb::ThreadSP &thread_sp)
void AddThread(const lldb::ThreadSP &thread_sp)
static llvm::Expected< HostThread > LaunchThread(llvm::StringRef name, std::function< lldb::thread_result_t()> thread_function, size_t min_stack_byte_size=0)
lldb::ThreadSP FindThreadByProtocolID(lldb::tid_t tid, bool can_update=true)
Definition: ThreadList.cpp:120
uint32_t GetSize(bool can_update=true)
Definition: ThreadList.cpp:82
bool SetSelectedThreadByID(lldb::tid_t tid, bool notify=false)
Definition: ThreadList.cpp:695
lldb::ThreadSP GetThreadAtIndex(uint32_t idx, bool can_update=true)
Definition: ThreadList.cpp:90
std::recursive_mutex & GetMutex() const override
Definition: ThreadList.cpp:787
lldb::ThreadSP GetBackingThread(const lldb::ThreadSP &real_thread)
Definition: ThreadList.cpp:194
lldb::ThreadSP RemoveThreadByProtocolID(lldb::tid_t tid, bool can_update=true)
Definition: ThreadList.cpp:157
virtual lldb::user_id_t GetProtocolID() const
Definition: Thread.h:1113
void SetStopInfo(const lldb::StopInfoSP &stop_info_sp)
Definition: Thread.cpp:463
lldb::ProcessSP GetProcess() const
Definition: Thread.h:157
bool IsValid() const
Definition: UUID.h:69
static lldb::UnixSignalsSP Create(const ArchSpec &arch)
Definition: UnixSignals.cpp:29
static std::vector< lldb::WatchpointResourceSP > AtomizeWatchpointRequest(lldb::addr_t addr, size_t size, bool read, bool write, WatchpointHardwareFeature supported_features, ArchSpec &arch)
Convert a user's watchpoint request into an array of memory regions, each region watched by one hardw...
static bool XMLEnabled()
Definition: XML.cpp:83
XMLNode GetRootElement(const char *required_name=nullptr)
Definition: XML.cpp:65
bool ParseMemory(const char *xml, size_t xml_length, const char *url="untitled.xml")
Definition: XML.cpp:54
void ForEachChildElement(NodeCallback const &callback) const
Definition: XML.cpp:169
llvm::StringRef GetName() const
Definition: XML.cpp:268
bool GetElementText(std::string &text) const
Definition: XML.cpp:278
std::string GetAttributeValue(const char *name, const char *fail_value=nullptr) const
Definition: XML.cpp:135
void ForEachChildElementWithName(const char *name, NodeCallback const &callback) const
Definition: XML.cpp:177
XMLNode FindFirstChildElementWithName(const char *name) const
Definition: XML.cpp:328
void ForEachAttribute(AttributeCallback const &callback) const
Definition: XML.cpp:186
bool SendAsyncSignal(int signo, std::chrono::seconds interrupt_timeout)
PacketResult SendPacketAndWaitForResponse(llvm::StringRef payload, StringExtractorGDBRemote &response, std::chrono::seconds interrupt_timeout=std::chrono::seconds(0))
bool Interrupt(std::chrono::seconds interrupt_timeout)
PacketResult SendPacketAndReceiveResponseWithOutputSupport(llvm::StringRef payload, StringExtractorGDBRemote &response, std::chrono::seconds interrupt_timeout, llvm::function_ref< void(llvm::StringRef)> output_callback)
lldb::StateType SendContinuePacketAndWaitForResponse(ContinueDelegate &delegate, const UnixSignals &signals, llvm::StringRef payload, std::chrono::seconds interrupt_timeout, StringExtractorGDBRemote &response)
lldb_private::StructuredData::Array * GetSupportedStructuredDataPlugins()
Return the array of async JSON packet types supported by the remote.
int SendLaunchEventDataPacket(const char *data, bool *was_supported=nullptr)
std::optional< std::vector< ModuleSpec > > GetModulesInfo(llvm::ArrayRef< FileSpec > module_file_specs, const llvm::Triple &triple)
llvm::Expected< std::string > ReadExtFeature(llvm::StringRef object, llvm::StringRef annex)
std::optional< QOffsets > GetQOffsets()
Use qOffsets to query the offset used when relocating the target executable.
llvm::Error SendTraceStop(const TraceStopRequest &request, std::chrono::seconds interrupt_timeout)
void TestPacketSpeed(const uint32_t num_packets, uint32_t max_send, uint32_t max_recv, uint64_t recv_amount, bool json, Stream &strm)
bool SetCurrentThreadForRun(uint64_t tid, lldb::pid_t pid=LLDB_INVALID_PROCESS_ID)
uint8_t SendGDBStoppointTypePacket(GDBStoppointType type, bool insert, lldb::addr_t addr, uint32_t length, std::chrono::seconds interrupt_timeout)
llvm::Expected< std::string > SendTraceGetState(llvm::StringRef type, std::chrono::seconds interrupt_timeout)
llvm::Error LaunchProcess(const Args &args)
Launch the process using the provided arguments.
Status ConfigureRemoteStructuredData(llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp)
Configure a StructuredData feature on the remote end.
bool SetCurrentThread(uint64_t tid, lldb::pid_t pid=LLDB_INVALID_PROCESS_ID)
int SetDetachOnError(bool enable)
Sets the DetachOnError flag to enable for the process controlled by the stub.
llvm::Expected< std::vector< uint8_t > > SendTraceGetBinaryData(const TraceGetBinaryDataRequest &request, std::chrono::seconds interrupt_timeout)
int SetSTDIN(const FileSpec &file_spec)
Sets the path to use for stdin/out/err for a process that will be launched with the 'A' packet.
Status WriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type, const std::vector< uint8_t > &tags)
size_t GetCurrentThreadIDs(std::vector< lldb::tid_t > &thread_ids, bool &sequence_mutex_unavailable)
Status Detach(bool keep_stopped, lldb::pid_t pid=LLDB_INVALID_PROCESS_ID)
int SetDisableASLR(bool enable)
Sets the disable ASLR flag to enable for a process that will be launched with the 'A' packet.
Status GetMemoryRegionInfo(lldb::addr_t addr, MemoryRegionInfo &range_info)
int SendStdinNotification(const char *data, size_t data_len)
Sends a GDB remote protocol 'I' packet that delivers stdin data to the remote process.
llvm::Expected< TraceSupportedResponse > SendTraceSupported(std::chrono::seconds interrupt_timeout)
llvm::Error SendTraceStart(const llvm::json::Value &request, std::chrono::seconds interrupt_timeout)
bool GetModuleInfo(const FileSpec &module_file_spec, const ArchSpec &arch_spec, ModuleSpec &module_spec)
lldb::DataBufferSP ReadMemoryTags(lldb::addr_t addr, size_t len, int32_t type)
int SetWorkingDir(const FileSpec &working_dir)
Sets the working directory to path for a process that will be launched with the 'A' packet for non pl...
bool GetProcessStandaloneBinary(UUID &uuid, lldb::addr_t &value, bool &value_is_offset)
std::chrono::seconds SetPacketTimeout(std::chrono::seconds packet_timeout)
Status StartDebugserverProcess(const char *url, Platform *platform, ProcessLaunchInfo &launch_info, uint16_t *port, const Args *inferior_args, shared_fd_t pass_comm_fd)
Status FlashErase(lldb::addr_t addr, size_t size)
Status DisableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true) override
Status DoConnectRemote(llvm::StringRef remote_url) override
Attach to a remote system via a URL.
void HandleAsyncStructuredDataPacket(llvm::StringRef data) override
Process asynchronously-received structured data.
Status LaunchAndConnectToDebugserver(const ProcessInfo &process_info)
lldb::StateType SetThreadStopInfo(StringExtractor &stop_packet)
static void MonitorDebugserverProcess(std::weak_ptr< ProcessGDBRemote > process_wp, lldb::pid_t pid, int signo, int exit_status)
StructuredData::ObjectSP GetSharedCacheInfo() override
Status DisableBreakpointSite(BreakpointSite *bp_site) override
Status EnableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true) override
Status DoSignal(int signal) override
Sends a process a UNIX signal signal.
Status DoDeallocateMemory(lldb::addr_t ptr) override
Actually deallocate memory in the process.
bool ParsePythonTargetDefinition(const FileSpec &target_definition_fspec)
bool StopNoticingNewThreads() override
Call this to turn off the stop & notice new threads mode.
static bool NewThreadNotifyBreakpointHit(void *baton, StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id)
void DumpPluginHistory(Stream &s) override
The underlying plugin might store the low-level communication history for this session.
Status DoDetach(bool keep_stopped) override
Detaches from a running or stopped process.
lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions, Status &error) override
Actually allocate memory in the process.
std::optional< bool > DoGetWatchpointReportedAfter() override
Provide an override value in the subclass for lldb's CPU-based logic for whether watchpoint exception...
std::optional< uint32_t > GetWatchpointSlotCount() override
Get the number of watchpoints supported by this target.
llvm::Expected< std::vector< uint8_t > > DoReadMemoryTags(lldb::addr_t addr, size_t len, int32_t type) override
Does the final operation to read memory tags.
llvm::DenseMap< ModuleCacheKey, ModuleSpec, ModuleCacheInfo > m_cached_module_specs
Status DoWillAttachToProcessWithID(lldb::pid_t pid) override
Called before attaching to a process.
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &region_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
size_t UpdateThreadIDsFromStopReplyThreadsValue(llvm::StringRef value)
Status GetFileLoadAddress(const FileSpec &file, bool &is_loaded, lldb::addr_t &load_addr) override
Try to find the load address of a file.
bool GetThreadStopInfoFromJSON(ThreadGDBRemote *thread, const StructuredData::ObjectSP &thread_infos_sp)
void DidLaunch() override
Called after launching a process.
void SetUserSpecifiedMaxMemoryTransferSize(uint64_t user_specified_max)
void AddRemoteRegisters(std::vector< DynamicRegisterInfo::Register > &registers, const ArchSpec &arch_to_use)
void HandleAsyncStdout(llvm::StringRef out) override
std::map< uint32_t, std::string > ExpeditedRegisterMap
llvm::Error TraceStop(const TraceStopRequest &request) override
Stop tracing a live process or its threads.
StructuredData::ObjectSP GetExtendedInfoForThread(lldb::tid_t tid)
lldb::ThreadSP HandleThreadAsyncInterrupt(uint8_t signo, const std::string &description) override
Handle thread specific async interrupt and return the original thread that requested the async interr...
llvm::Expected< LoadedModuleInfoList > GetLoadedModuleList() override
Query remote GDBServer for a detailed loaded library list.
Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a process ID.
llvm::StringMap< std::unique_ptr< FieldEnum > > m_registers_enum_types
Status EstablishConnectionIfNeeded(const ProcessInfo &process_info)
void DidFork(lldb::pid_t child_pid, lldb::tid_t child_tid) override
Called after a reported fork.
StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos() override
Status DoHalt(bool &caused_stop) override
Halts a running process.
llvm::Expected< TraceSupportedResponse > TraceSupported() override
Get the processor tracing type supported for this process.
llvm::Error TraceStart(const llvm::json::Value &request) override
Start tracing a process or its threads.
void ParseExpeditedRegisters(ExpeditedRegisterMap &expedited_register_map, lldb::ThreadSP thread_sp)
void WillPublicStop() override
Called when the process is about to broadcast a public stop.
bool StartNoticingNewThreads() override
Call this to set the lldb in the mode where it breaks on new thread creations, and then auto-restarts...
DynamicLoader * GetDynamicLoader() override
Get the dynamic loader plug-in for this process.
ArchSpec GetSystemArchitecture() override
Get the system architecture for this process.
Status ConfigureStructuredData(llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp) override
Configure asynchronous structured data feature.
void DidVFork(lldb::pid_t child_pid, lldb::tid_t child_tid) override
Called after a reported vfork.
void DidExec() override
Called after a process re-execs itself.
size_t PutSTDIN(const char *buf, size_t buf_size, Status &error) override
Puts data into this process's STDIN.
Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a partial process name.
StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos_sender(StructuredData::ObjectSP args)
bool CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override
Check if a plug-in instance can debug the file in module.
void SetThreadPc(const lldb::ThreadSP &thread_sp, uint64_t index)
Status ConnectToDebugserver(llvm::StringRef host_port)
void SetUnixSignals(const lldb::UnixSignalsSP &signals_sp)
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, Status &error) override
Actually do the reading of memory from a process.
std::optional< StringExtractorGDBRemote > m_last_stop_packet
CommandObject * GetPluginCommandObject() override
Return a multi-word command object that can be used to expose plug-in specific commands.
size_t DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size, Status &error) override
Actually do the writing of memory to a process.
Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override
Launch a new process.
void DidVForkDone() override
Called after reported vfork completion.
std::string HarmonizeThreadIdsForProfileData(StringExtractorGDBRemote &inputStringExtractor)
bool GetGDBServerRegisterInfoXMLAndProcess(ArchSpec &arch_to_use, std::string xml_filename, std::vector< DynamicRegisterInfo::Register > &registers)
Status DoWillAttachToProcessWithName(const char *process_name, bool wait_for_launch) override
Called before attaching to a process.
Status DoResume() override
Resumes all of a process's threads as configured using the Thread run control functions.
std::pair< std::string, std::string > ModuleCacheKey
bool SupportsMemoryTagging() override
Check whether the process supports memory tagging.
size_t UpdateThreadPCsFromStopReplyThreadsValue(llvm::StringRef value)
llvm::VersionTuple GetHostOSVersion() override
Sometimes the connection to a process can detect the host OS version that the process is running on.
std::map< uint64_t, uint32_t > m_thread_id_to_used_usec_map
Status DoWriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type, const std::vector< uint8_t > &tags) override
Does the final operation to write memory tags.
llvm::Expected< std::vector< uint8_t > > TraceGetBinaryData(const TraceGetBinaryDataRequest &request) override
Get binary data given a trace technology and a data identifier.
Status EnableBreakpointSite(BreakpointSite *bp_site) override
void ModulesDidLoad(ModuleList &module_list) override
ProcessGDBRemote(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
Status WillResume() override
Called before resuming to a process.
lldb::ModuleSP LoadModuleAtAddress(const FileSpec &file, lldb::addr_t link_map, lldb::addr_t base_addr, bool value_is_offset)
void SetLastStopPacket(const StringExtractorGDBRemote &response)
Status WriteObjectFile(std::vector< ObjectFile::LoadableData > entries) override
llvm::Error LoadModules() override
Sometimes processes know how to retrieve and load shared libraries.
void HandleAsyncMisc(llvm::StringRef data) override
lldb::addr_t GetImageInfoAddress() override
Get the image information address for the current process.
bool DoUpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list) override
Update the thread list following process plug-in's specific logic.
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
void PrefetchModuleSpecs(llvm::ArrayRef< FileSpec > module_file_specs, const llvm::Triple &triple) override
StructuredData::ObjectSP GetDynamicLoaderProcessState() override
bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch, ModuleSpec &module_spec) override
Try to fetch the module specification for a module with the given file name and architecture.
llvm::StringMap< std::unique_ptr< RegisterFlags > > m_registers_flags_types
Status DoWillLaunch(Module *module) override
Called before launching to a process.
void DidAttach(ArchSpec &process_arch) override
Called after attaching a process.
llvm::Expected< bool > SaveCore(llvm::StringRef outfile) override
Save core dump into the specified file.
llvm::Expected< std::string > TraceGetState(llvm::StringRef type) override
Get the current tracing state of the process and its threads.
bool IsAlive() override
Check if a process is still alive.
void SetQueueLibdispatchQueueAddress(lldb::addr_t dispatch_queue_t) override
void SetQueueInfo(std::string &&queue_name, lldb::QueueKind queue_kind, uint64_t queue_serial, lldb::addr_t dispatch_queue_t, lldb_private::LazyBool associated_with_libdispatch_queue)
void SetThreadDispatchQAddr(lldb::addr_t thread_dispatch_qaddr)
lldb::RegisterContextSP GetRegisterContext() override
void SetAssociatedWithLibdispatchQueue(lldb_private::LazyBool associated_with_libdispatch_queue) override
bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef< uint8_t > data)
#define LLDB_INVALID_SITE_ID
Definition: lldb-defines.h:53
#define LLDB_OPT_SET_1
Definition: lldb-defines.h:111
#define UINT64_MAX
Definition: lldb-defines.h:23
#define LLDB_INVALID_WATCH_ID
Definition: lldb-defines.h:43
#define LLDB_INVALID_SIGNAL_NUMBER
Definition: lldb-defines.h:92
#define LLDB_INVALID_THREAD_ID
Definition: lldb-defines.h:90
#define LLDB_OPT_SET_ALL
Definition: lldb-defines.h:110
#define UNUSED_IF_ASSERT_DISABLED(x)
Definition: lldb-defines.h:140
#define LLDB_INVALID_ADDRESS
Definition: lldb-defines.h:82
#define UINT32_MAX
Definition: lldb-defines.h:19
#define LLDB_INVALID_REGNUM
Definition: lldb-defines.h:87
#define LLDB_INVALID_PROCESS_ID
Definition: lldb-defines.h:89
#define LLDB_REGNUM_GENERIC_PC
Definition: lldb-defines.h:56
lldb::ByteOrder InlHostByteOrder()
Definition: Endian.h:25
std::vector< DynamicRegisterInfo::Register > GetFallbackRegisters(const ArchSpec &arch_to_use)
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition: Log.h:332
bool InferiorCallMunmap(Process *proc, lldb::addr_t addr, lldb::addr_t length)
@ eMmapFlagsPrivate
Definition: Platform.h:45
@ eMmapFlagsAnon
Definition: Platform.h:45
bool InferiorCallMmap(Process *proc, lldb::addr_t &allocated_addr, lldb::addr_t addr, lldb::addr_t length, unsigned prot, unsigned flags, lldb::addr_t fd, lldb::addr_t offset)
NativeSocket shared_fd_t
Definition: Socket.h:42
const char * StateAsCString(lldb::StateType state)
Converts a StateType to a C string.
Definition: State.cpp:14
const char * GetPermissionsAsCString(uint32_t permissions)
Definition: State.cpp:44
Definition: SBAddress.h:15
void DumpProcessGDBRemotePacketHistory(void *p, const char *path)
std::shared_ptr< lldb_private::ABI > ABISP
Definition: lldb-forward.h:317
std::shared_ptr< lldb_private::BreakpointSite > BreakpointSiteSP
Definition: lldb-forward.h:323
std::shared_ptr< lldb_private::Thread > ThreadSP
Definition: lldb-forward.h:450
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
Definition: lldb-forward.h:333
void * thread_result_t
Definition: lldb-types.h:62
ConnectionStatus
Connection Status Types.
@ eConnectionStatusSuccess
Success.
std::shared_ptr< lldb_private::UnixSignals > UnixSignalsSP
Definition: lldb-forward.h:480
@ eFormatVectorOfUInt64
@ eFormatAddressInfo
Describe what an address points to (func + offset.
@ eFormatVectorOfUInt128
@ eFormatVectorOfUInt8
@ eFormatVectorOfFloat32
@ eFormatVectorOfSInt32
@ eFormatVectorOfSInt8
@ eFormatVectorOfUInt16
@ eFormatVectorOfSInt16
@ eFormatVectorOfUInt32
std::shared_ptr< lldb_private::Platform > PlatformSP
Definition: lldb-forward.h:388
StateType
Process and Thread States.
@ eStateUnloaded
Process is object is valid, but not currently loaded.
@ eStateConnected
Process is connected to remote debug services, but not launched or attached to anything yet.
@ eStateDetached
Process has been detached and can't be examined.
@ eStateStopped
Process or thread is stopped and can be examined.
@ eStateSuspended
Process or thread is in a suspended state as far as the debugger is concerned while other processes o...
@ eStateRunning
Process or thread is running and can't be examined.
@ eStateAttaching
Process is currently trying to attach.
@ eStateExited
Process has exited and can't be examined.
@ eStateStepping
Process or thread is in the process of stepping and can not be examined.
@ eStateCrashed
Process or thread has crashed and can be examined.
std::shared_ptr< lldb_private::Stream > StreamSP
Definition: lldb-forward.h:432
std::shared_ptr< lldb_private::Process > ProcessSP
Definition: lldb-forward.h:389
Encoding
Register encoding definitions.
@ eEncodingIEEE754
float
@ eEncodingVector
vector registers
@ eEncodingUint
unsigned integer
@ eEncodingInvalid
std::shared_ptr< lldb_private::Event > EventSP
Definition: lldb-forward.h:345
@ eReturnStatusFailed
@ eReturnStatusSuccessFinishResult
uint64_t pid_t
Definition: lldb-types.h:83
QueueKind
Queue type.
@ eQueueKindConcurrent
@ eArgTypeUnsignedInteger
@ eByteOrderInvalid
std::shared_ptr< lldb_private::Watchpoint > WatchpointSP
Definition: lldb-forward.h:489
std::shared_ptr< lldb_private::Listener > ListenerSP
Definition: lldb-forward.h:368
int32_t watch_id_t
Definition: lldb-types.h:87
std::shared_ptr< lldb_private::WatchpointResource > WatchpointResourceSP
Definition: lldb-forward.h:490
uint64_t user_id_t
Definition: lldb-types.h:82
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
Definition: lldb-forward.h:336
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
Definition: lldb-forward.h:431
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
Definition: lldb-forward.h:337
uint64_t addr_t
Definition: lldb-types.h:80
std::shared_ptr< lldb_private::Target > TargetSP
Definition: lldb-forward.h:448
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
Definition: lldb-forward.h:394
uint64_t tid_t
Definition: lldb-types.h:84
std::shared_ptr< lldb_private::Module > ModuleSP
Definition: lldb-forward.h:373
@ eRegisterKindGeneric
insn ptr reg, stack ptr reg, etc not specific to any particular target
@ eRegisterKindProcessPlugin
num used by the process plugin - e.g.
static Status ToFormat(const char *s, lldb::Format &format, size_t *byte_size_ptr)
bool Contains(BaseType r) const
Definition: RangeMap.h:93
BaseType GetRangeBase() const
Definition: RangeMap.h:45
SizeType GetByteSize() const
Definition: RangeMap.h:87
void SetRangeBase(BaseType b)
Set the start value for the range, and keep the same size.
Definition: RangeMap.h:48
BaseType GetRangeEnd() const
Definition: RangeMap.h:78
void SetByteSize(SizeType s)
Definition: RangeMap.h:89
jLLDBTraceGetBinaryData gdb-remote packet
jLLDBTraceStop gdb-remote packet
lldb::user_id_t GetID() const
Get accessor for the user ID.
Definition: UserID.h:47
#define O_NOCTTY
#define SIGTRAP