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