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