9#include "lldb/Host/Config.h"
14#include <netinet/in.h>
16#include <sys/socket.h>
21#include <sys/sysctl.h>
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"
98#define DEBUGSERVER_BASENAME "debugserver"
100#define DEBUGSERVER_BASENAME "lldb-server.exe"
102#define DEBUGSERVER_BASENAME "lldb-server"
122 llvm::consumeError(file.takeError());
126 ((
Process *)p)->DumpPluginHistory(stream);
132#define LLDB_PROPERTIES_processgdbremote
133#include "ProcessGDBRemoteProperties.inc"
136#define LLDB_PROPERTIES_processgdbremote
137#include "ProcessGDBRemotePropertiesEnum.inc"
142 static llvm::StringRef GetSettingName() {
146 PluginProperties() : Properties() {
147 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
148 m_collection_sp->Initialize(g_processgdbremote_properties);
151 ~PluginProperties()
override =
default;
153 uint64_t GetPacketTimeout() {
154 const uint32_t idx = ePropertyPacketTimeout;
155 return GetPropertyAtIndexAs<uint64_t>(
156 idx, g_processgdbremote_properties[idx].default_uint_value);
159 bool SetPacketTimeout(uint64_t timeout) {
160 const uint32_t idx = ePropertyPacketTimeout;
161 return SetPropertyAtIndex(idx, timeout);
164 FileSpec GetTargetDefinitionFile()
const {
165 const uint32_t idx = ePropertyTargetDefinitionFile;
166 return GetPropertyAtIndexAs<FileSpec>(idx, {});
169 bool GetUseSVR4()
const {
170 const uint32_t idx = ePropertyUseSVR4;
171 return GetPropertyAtIndexAs<bool>(
172 idx, g_processgdbremote_properties[idx].default_uint_value != 0);
175 bool GetUseGPacketForReading()
const {
176 const uint32_t idx = ePropertyUseGPacketForReading;
177 return GetPropertyAtIndexAs<bool>(idx,
true);
181std::chrono::seconds ResumeTimeout() {
return std::chrono::seconds(5); }
186 static PluginProperties g_settings;
194#if defined(__APPLE__)
195#define LOW_PORT (IPPORT_RESERVED)
196#define HIGH_PORT (IPPORT_HIFIRSTAUTO)
198#define LOW_PORT (1024u)
199#define HIGH_PORT (49151u)
203 return "GDB Remote protocol based debugging plug-in.";
212 const FileSpec *crash_file_path,
bool can_connect) {
232 bool plugin_specified_by_name) {
233 if (plugin_specified_by_name)
237 Module *exe_module = target_sp->GetExecutableModulePointer();
241 switch (exe_objfile->
GetType()) {
265 :
Process(target_sp, listener_sp),
269 Listener::MakeListener(
"lldb.process.gdb-remote.async-listener")),
279 "async thread should exit");
281 "async thread continue");
283 "async thread did exit");
287 const uint32_t async_event_mask =
293 "ProcessGDBRemote::%s failed to listen for "
294 "m_async_broadcaster events",
298 const uint64_t timeout_seconds =
300 if (timeout_seconds > 0)
301 m_gdb_comm.SetPacketTimeout(std::chrono::seconds(timeout_seconds));
325std::shared_ptr<ThreadGDBRemote>
327 return std::make_shared<ThreadGDBRemote>(*
this, tid);
331 const FileSpec &target_definition_fspec) {
337 if (module_object_sp) {
340 "gdb-server-target-definition",
error));
342 if (target_definition_sp) {
344 target_definition_sp->GetValueForKey(
"host-info"));
346 if (
auto host_info_dict = target_object->GetAsDictionary()) {
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());
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())
369 *target_definition_sp,
GetTarget().GetArchitecture()) > 0) {
378 const llvm::StringRef &comma_separated_register_numbers,
379 std::vector<uint32_t> ®nums,
int base) {
381 for (llvm::StringRef x : llvm::split(comma_separated_register_numbers,
',')) {
383 if (llvm::to_integer(x, reg, base))
384 regnums.push_back(reg);
386 return regnums.size();
398 const auto host_packet_timeout =
m_gdb_comm.GetHostDefaultPacketTimeout();
399 if (host_packet_timeout > std::chrono::seconds(0)) {
417 if (target_definition_fspec) {
423 target_definition_fspec.
GetPath() +
434 if (remote_process_arch.
IsValid())
435 arch_to_use = remote_process_arch;
437 arch_to_use = remote_host_arch;
440 arch_to_use = target_arch;
443 if (!register_info_err) {
450 "Failed to read register information from target XML: {0}");
451 LLDB_LOG(log,
"Now trying to use qRegisterInfo instead.");
454 std::vector<DynamicRegisterInfo::Register> registers;
455 uint32_t reg_num = 0;
459 const int packet_len =
460 ::snprintf(packet,
sizeof(packet),
"qRegisterInfo%x", reg_num);
461 assert(packet_len < (
int)
sizeof(packet));
464 if (
m_gdb_comm.SendPacketAndWaitForResponse(packet, response) ==
468 llvm::StringRef name;
469 llvm::StringRef value;
473 if (name ==
"name") {
475 }
else if (name ==
"alt-name") {
477 }
else if (name ==
"bitsize") {
478 if (!value.getAsInteger(0, reg_info.
byte_size))
480 }
else if (name ==
"offset") {
482 }
else if (name ==
"encoding") {
486 }
else if (name ==
"format") {
490 llvm::StringSwitch<Format>(value)
532 }
else if (name ==
"set") {
534 }
else if (name ==
"gcc" || name ==
"ehframe") {
536 }
else if (name ==
"dwarf") {
538 }
else if (name ==
"generic") {
540 }
else if (name ==
"container-regs") {
542 }
else if (name ==
"invalidate-regs") {
548 registers.push_back(reg_info);
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.",
573 if (registers.empty())
588 bool wait_for_launch) {
620 if (
m_gdb_comm.GetProcessArchitecture().IsValid()) {
623 if (
m_gdb_comm.GetHostArchitecture().IsValid()) {
634 "Process %" PRIu64
" was reported after connecting to "
635 "'%s', but state was not stopped: %s",
639 "Process %" PRIu64
" was reported after connecting to '%s', "
640 "but no stop reply packet was received",
641 pid, remote_url.str().c_str());
645 "ProcessGDBRemote::%s pid %" PRIu64
646 ": normalizing target architecture initial triple: %s "
647 "(GetTarget().GetArchitecture().IsValid() %s, "
648 "m_gdb_comm.GetHostArchitecture().IsValid(): %s)",
649 __FUNCTION__,
GetID(),
650 GetTarget().GetArchitecture().GetTriple().getTriple().c_str(),
652 m_gdb_comm.GetHostArchitecture().IsValid() ?
"true" :
"false");
658 if (
m_gdb_comm.GetProcessArchitecture().IsValid())
665 "ProcessGDBRemote::%s pid %" PRIu64
666 ": normalized target architecture triple: %s",
667 __FUNCTION__,
GetID(),
668 GetTarget().GetArchitecture().GetTriple().getTriple().c_str());
685 LLDB_LOGF(log,
"ProcessGDBRemote::%s() entered", __FUNCTION__);
687 uint32_t launch_flags = launch_info.
GetFlags().
Get();
711 if (stdin_file_spec || stdout_file_spec || stderr_file_spec)
713 "ProcessGDBRemote::%s provided with STDIO paths via "
714 "launch_info: stdin=%s, stdout=%s, stderr=%s",
716 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
717 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
718 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
721 "ProcessGDBRemote::%s no STDIO paths given via launch_info",
725 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
726 if (stdin_file_spec || disable_stdio) {
741 if (
error.Success()) {
743 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
748 if (!stdin_file_spec)
750 FileSpec::Style::native);
751 if (!stdout_file_spec)
753 FileSpec::Style::native);
754 if (!stderr_file_spec)
756 FileSpec::Style::native);
757 }
else if (platform_sp && platform_sp->IsHost()) {
762 if ((!stdin_file_spec || !stdout_file_spec || !stderr_file_spec) &&
766 if (!stdin_file_spec)
767 stdin_file_spec = secondary_name;
769 if (!stdout_file_spec)
770 stdout_file_spec = secondary_name;
772 if (!stderr_file_spec)
773 stderr_file_spec = secondary_name;
777 "ProcessGDBRemote::%s adjusted STDIO paths for local platform "
778 "(IsHost() is true) using secondary: stdin=%s, stdout=%s, "
781 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
782 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
783 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
787 "ProcessGDBRemote::%s final STDIO paths after all "
788 "adjustments: stdin=%s, stdout=%s, stderr=%s",
790 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
791 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
792 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
796 if (stdout_file_spec)
798 if (stderr_file_spec)
801 m_gdb_comm.SetDisableASLR(launch_flags & eLaunchFlagDisableASLR);
802 m_gdb_comm.SetDetachOnError(launch_flags & eLaunchFlagDetachOnError);
805 GetTarget().GetArchitecture().GetArchitectureName());
808 if (launch_event_data !=
nullptr && *launch_event_data !=
'\0')
809 m_gdb_comm.SendLaunchEventDataPacket(launch_event_data);
821 std::chrono::seconds(10));
828 if (llvm::Error err =
m_gdb_comm.LaunchProcess(args)) {
831 llvm::fmt_consume(std::move(err)));
838 LLDB_LOGF(log,
"failed to connect to debugserver: %s",
860 if (!disable_stdio) {
866 LLDB_LOGF(log,
"failed to connect to debugserver: %s",
error.AsCString());
876 if (!connect_url.empty()) {
877 LLDB_LOGF(log,
"ProcessGDBRemote::%s Connecting to %s", __FUNCTION__,
878 connect_url.str().c_str());
879 std::unique_ptr<ConnectionFileDescriptor> conn_up(
882 const uint32_t max_retry_count = 50;
883 uint32_t retry_count = 0;
892 if (retry_count >= max_retry_count)
895 std::this_thread::sleep_for(std::chrono::milliseconds(100));
919 m_gdb_comm.GetListThreadsInStopReplySupported();
926 auto handle_cmds = [&] (
const Args &args) ->
void {
930 entry.c_str(), response);
936 handle_cmds(platform_sp->GetExtraStartupCommands());
953 if (remote_process_arch.
IsValid()) {
954 process_arch = remote_process_arch;
955 LLDB_LOG(log,
"gdb-remote had process architecture, using {0} {1}",
959 process_arch =
m_gdb_comm.GetHostArchitecture();
961 "gdb-remote did not have process architecture, using gdb-remote "
962 "host architecture {0} {1}",
973 LLDB_LOG(log,
"analyzing target arch, currently {0} {1}",
985 if ((process_arch.
GetMachine() == llvm::Triple::arm ||
986 process_arch.
GetMachine() == llvm::Triple::thumb) &&
987 process_arch.
GetTriple().getVendor() == llvm::Triple::Apple) {
990 "remote process is ARM/Apple, "
991 "setting target arch to {0} {1}",
996 const llvm::Triple &remote_triple = process_arch.
GetTriple();
997 llvm::Triple new_target_triple = target_arch.
GetTriple();
998 if (new_target_triple.getVendorName().size() == 0) {
999 new_target_triple.setVendor(remote_triple.getVendor());
1001 if (new_target_triple.getOSName().size() == 0) {
1002 new_target_triple.setOS(remote_triple.getOS());
1004 if (new_target_triple.getEnvironmentName().size() == 0)
1005 new_target_triple.setEnvironment(remote_triple.getEnvironment());
1008 ArchSpec new_target_arch = target_arch;
1009 new_target_arch.
SetTriple(new_target_triple);
1015 "final target arch after adjustments for remote architecture: "
1034 m_gdb_comm.GetSupportedStructuredDataPlugins())
1043 if (platform_sp && platform_sp->IsConnected())
1055 UUID standalone_uuid;
1057 bool standalone_value_is_offset;
1058 if (
m_gdb_comm.GetProcessStandaloneBinary(standalone_uuid, standalone_value,
1059 standalone_value_is_offset)) {
1062 if (standalone_uuid.
IsValid()) {
1063 const bool force_symbol_search =
true;
1064 const bool notify =
true;
1065 const bool set_address_in_target =
true;
1066 const bool allow_memory_image_last_resort =
false;
1068 this,
"", standalone_uuid, standalone_value,
1069 standalone_value_is_offset, force_symbol_search, notify,
1070 set_address_in_target, allow_memory_image_last_resort);
1082 std::vector<addr_t> bin_addrs =
m_gdb_comm.GetProcessStandaloneBinaries();
1083 if (bin_addrs.size()) {
1085 const bool value_is_slide =
false;
1086 for (
addr_t addr : bin_addrs) {
1087 const bool notify =
true;
1094 .LoadPlatformBinaryAndSetup(
this, addr, notify))
1097 const bool force_symbol_search =
true;
1098 const bool set_address_in_target =
true;
1099 const bool allow_memory_image_last_resort =
false;
1102 this, llvm::StringRef(), uuid, addr, value_is_slide,
1103 force_symbol_search, notify, set_address_in_target,
1104 allow_memory_image_last_resort);
1114 std::optional<QOffsets> offsets =
m_gdb_comm.GetQOffsets();
1119 size_t(llvm::count(offsets->offsets, offsets->offsets[0])) ==
1120 offsets->offsets.size();
1124 bool changed =
false;
1125 module_sp->SetLoadAddress(
GetTarget(), offsets->offsets[0],
1130 m_process->GetTarget().ModulesDidLoad(list);
1144 LLDB_LOGF(log,
"ProcessGDBRemote::%s()", __FUNCTION__);
1150 if (
error.Success()) {
1154 const int packet_len =
1155 ::snprintf(packet,
sizeof(packet),
"vAttach;%" PRIx64, attach_pid);
1158 std::make_shared<EventDataBytes>(llvm::StringRef(packet, packet_len));
1173 if (process_name && process_name[0]) {
1175 if (
error.Success()) {
1181 if (!
m_gdb_comm.GetVAttachOrWaitSupported()) {
1196 auto data_sp = std::make_shared<EventDataBytes>(packet.
GetString());
1217llvm::Expected<std::string>
1222llvm::Expected<std::vector<uint8_t>>
1234 process_arch.
Clear();
1249 return m_gdb_comm.GetReverseStepSupported() ||
1256 LLDB_LOGF(log,
"ProcessGDBRemote::Resume(%s)",
1261 if (listener_sp->StartListeningForEvents(
1263 listener_sp->StartListeningForEvents(
1270 bool continue_packet_error =
false;
1284 std::string pid_prefix;
1286 pid_prefix = llvm::formatv(
"p{0:x-}.",
GetID());
1288 if (num_continue_c_tids == num_threads ||
1293 continue_packet.
Format(
"vCont;c:{0}-1", pid_prefix);
1301 for (tid_collection::const_iterator
1304 t_pos != t_end; ++t_pos)
1305 continue_packet.
Format(
";c:{0}{1:x-}", pid_prefix, *t_pos);
1307 continue_packet_error =
true;
1312 for (tid_sig_collection::const_iterator
1315 s_pos != s_end; ++s_pos)
1316 continue_packet.
Format(
";C{0:x-2}:{1}{2:x-}", s_pos->second,
1317 pid_prefix, s_pos->first);
1319 continue_packet_error =
true;
1324 for (tid_collection::const_iterator
1327 t_pos != t_end; ++t_pos)
1328 continue_packet.
Format(
";s:{0}{1:x-}", pid_prefix, *t_pos);
1330 continue_packet_error =
true;
1335 for (tid_sig_collection::const_iterator
1338 s_pos != s_end; ++s_pos)
1339 continue_packet.
Format(
";S{0:x-2}:{1}{2:x-}", s_pos->second,
1340 pid_prefix, s_pos->first);
1342 continue_packet_error =
true;
1345 if (continue_packet_error)
1346 continue_packet.
Clear();
1349 continue_packet_error =
true;
1355 if (num_continue_c_tids > 0) {
1356 if (num_continue_c_tids == num_threads) {
1360 continue_packet_error =
false;
1361 }
else if (num_continue_c_tids == 1 && num_continue_C_tids == 0 &&
1362 num_continue_s_tids == 0 && num_continue_S_tids == 0) {
1366 continue_packet_error =
false;
1370 if (continue_packet_error && num_continue_C_tids > 0) {
1371 if ((num_continue_C_tids + num_continue_c_tids) == num_threads &&
1372 num_continue_C_tids > 0 && num_continue_s_tids == 0 &&
1373 num_continue_S_tids == 0) {
1376 if (num_continue_C_tids > 1) {
1381 if (num_continue_C_tids > 1) {
1382 continue_packet_error =
false;
1385 continue_packet_error =
true;
1388 if (!continue_packet_error)
1392 continue_packet_error =
false;
1395 if (!continue_packet_error) {
1397 continue_packet.
Printf(
"C%2.2x", continue_signo);
1402 if (continue_packet_error && num_continue_s_tids > 0) {
1403 if (num_continue_s_tids == num_threads) {
1409 continue_packet_error =
false;
1410 }
else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1411 num_continue_s_tids == 1 && num_continue_S_tids == 0) {
1415 continue_packet_error =
false;
1419 if (!continue_packet_error && num_continue_S_tids > 0) {
1420 if (num_continue_S_tids == num_threads) {
1423 continue_packet_error =
false;
1424 if (num_continue_S_tids > 1) {
1425 for (
size_t i = 1; i < num_threads; ++i) {
1427 continue_packet_error =
true;
1430 if (!continue_packet_error) {
1433 continue_packet.
Printf(
"S%2.2x", step_signo);
1435 }
else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1436 num_continue_s_tids == 0 && num_continue_S_tids == 1) {
1440 continue_packet_error =
false;
1446 if (num_continue_s_tids > 0 || num_continue_S_tids > 0) {
1448 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: target does not "
1449 "support reverse-stepping");
1451 "target does not support reverse-stepping");
1454 if (num_continue_S_tids > 0) {
1457 "ProcessGDBRemote::DoResume: Signals not supported in reverse");
1459 "can't deliver signals while running in reverse");
1462 if (num_continue_s_tids > 1) {
1463 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: can't step multiple "
1464 "threads in reverse");
1466 "can't step multiple threads while reverse-stepping");
1472 if (!
m_gdb_comm.GetReverseContinueSupported()) {
1473 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: target does not "
1474 "support reverse-continue");
1476 "target does not support reverse execution of processes");
1479 if (num_continue_C_tids > 0) {
1482 "ProcessGDBRemote::DoResume: Signals not supported in reverse");
1484 "can't deliver signals while running in reverse");
1492 continue_packet_error =
false;
1495 if (continue_packet_error) {
1497 "can't make continue packet for this resume");
1502 "Trying to resume but the async thread is dead.");
1503 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: Trying to resume but the "
1504 "async thread is dead.");
1509 std::make_shared<EventDataBytes>(continue_packet.
GetString());
1512 if (!listener_sp->GetEvent(event_sp, ResumeTimeout())) {
1514 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: Resume timed out.");
1517 "Broadcast continue, but the async thread was "
1518 "killed before we got an ack back.");
1520 "ProcessGDBRemote::DoResume: Broadcast continue, but the "
1521 "async thread was killed before we got an ack back.");
1537 llvm::StringRef value) {
1543 auto pid_tid = thread_ids.
GetPidTid(pid);
1544 if (pid_tid && pid_tid->first == pid) {
1550 }
while (thread_ids.
GetChar() ==
',');
1556 llvm::StringRef value) {
1558 for (llvm::StringRef x : llvm::split(value,
',')) {
1560 if (llvm::to_integer(x,
pc, 16))
1572 if (thread_infos && thread_infos->
GetSize() > 0) {
1596 const std::string &stop_info_str = std::string(stop_info.
GetStringRef());
1599 const size_t thread_pcs_pos = stop_info_str.find(
";thread-pcs:");
1600 if (thread_pcs_pos != std::string::npos) {
1601 const size_t start = thread_pcs_pos + strlen(
";thread-pcs:");
1602 const size_t end = stop_info_str.find(
';', start);
1603 if (end != std::string::npos) {
1604 std::string value = stop_info_str.substr(start, end - start);
1609 const size_t threads_pos = stop_info_str.find(
";threads:");
1610 if (threads_pos != std::string::npos) {
1611 const size_t start = threads_pos + strlen(
";threads:");
1612 const size_t end = stop_info_str.find(
';', start);
1613 if (end != std::string::npos) {
1614 std::string value = stop_info_str.substr(start, end - start);
1622 bool sequence_mutex_unavailable =
false;
1624 if (sequence_mutex_unavailable) {
1639 if (num_thread_ids == 0) {
1645 ThreadList old_thread_list_copy(old_thread_list);
1646 if (num_thread_ids > 0) {
1647 for (
size_t i = 0; i < num_thread_ids; ++i) {
1653 LLDB_LOGV(log,
"Making new thread: {0} for thread ID: {1:x}.",
1654 thread_sp.get(), thread_sp->GetID());
1656 LLDB_LOGV(log,
"Found old thread: {0} for thread ID: {1:x}.",
1657 thread_sp.get(), thread_sp->GetID());
1667 size_t old_num_thread_ids = old_thread_list_copy.
GetSize(
false);
1668 for (
size_t i = 0; i < old_num_thread_ids; i++) {
1670 if (old_thread_sp) {
1671 lldb::tid_t old_thread_id = old_thread_sp->GetProtocolID();
1686 uint32_t pc_regnum = reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1699 if (thread_infos_sp) {
1703 const size_t n = thread_infos->
GetSize();
1704 for (
size_t i = 0; i < n; ++i) {
1710 if (tid == thread->GetID())
1739 if (
GetGDBRemote().GetThreadStopInfo(thread->GetProtocolID(), stop_packet))
1749 for (
const auto &pair : expedited_register_map) {
1753 reg_value_extractor.
GetHexBytes(buffer_sp->GetData(),
'\xcc');
1754 uint32_t lldb_regnum = gdb_reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1762 uint8_t signo,
const std::string &thread_name,
const std::string &reason,
1763 const std::string &description, uint32_t exc_type,
1764 const std::vector<addr_t> &exc_data,
addr_t thread_dispatch_qaddr,
1765 bool queue_vars_valid,
1767 LazyBool associated_with_dispatch_queue,
addr_t dispatch_queue_t,
1768 std::string &queue_name,
QueueKind queue_kind, uint64_t queue_serial) {
1792 reg_ctx_sp->InvalidateIfNeeded(
true);
1800 if (reg_ctx_sp->ReconfigureRegisterInfo()) {
1803 reg_ctx_sp->InvalidateAllRegisters();
1810 thread_sp->SetName(thread_name.empty() ?
nullptr : thread_name.c_str());
1815 if (queue_vars_valid)
1816 gdb_thread->
SetQueueInfo(std::move(queue_name), queue_kind, queue_serial,
1817 dispatch_queue_t, associated_with_dispatch_queue);
1828 StopInfoSP current_stop_info_sp = thread_sp->GetPrivateStopInfo(
false);
1830 current_stop_info_sp) {
1831 thread_sp->SetStopInfo(current_stop_info_sp);
1835 if (!thread_sp->StopInfoIsUpToDate()) {
1838 addr_t pc = thread_sp->GetRegisterContext()->GetPC();
1840 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
pc);
1841 if (bp_site_sp && bp_site_sp->IsEnabled())
1842 thread_sp->SetThreadStoppedAtUnexecutedBP(
pc);
1844 if (exc_type != 0) {
1852 if (interrupt_thread)
1853 thread_sp = interrupt_thread;
1855 const size_t exc_data_size = exc_data.size();
1856 thread_sp->SetStopInfo(
1858 *thread_sp, exc_type, exc_data_size,
1859 exc_data_size >= 1 ? exc_data[0] : 0,
1860 exc_data_size >= 2 ? exc_data[1] : 0,
1861 exc_data_size >= 3 ? exc_data[2] : 0));
1864 bool handled =
false;
1865 bool did_exec =
false;
1868 if (!reason.empty() && reason !=
"none") {
1869 if (reason ==
"trace") {
1872 }
else if (reason ==
"breakpoint") {
1873 thread_sp->SetThreadHitBreakpointSite();
1881 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
1882 thread_sp->SetStopInfo(
1884 *thread_sp, bp_site_sp->GetID()));
1887 thread_sp->SetStopInfo(invalid_stop_info_sp);
1890 }
else if (reason ==
"trap") {
1892 }
else if (reason ==
"watchpoint") {
1928 bool silently_continue =
false;
1938 silently_continue =
true;
1942 if (!wp_resource_sp) {
1944 LLDB_LOGF(log,
"failed to find watchpoint");
1951 watch_id = wp_resource_sp->GetConstituentAtIndex(0)->GetID();
1954 *thread_sp, watch_id, silently_continue));
1956 }
else if (reason ==
"exception") {
1958 *thread_sp, description.c_str()));
1960 }
else if (reason ==
"history boundary") {
1962 *thread_sp, description.c_str()));
1964 }
else if (reason ==
"exec") {
1966 thread_sp->SetStopInfo(
1969 }
else if (reason ==
"processor trace") {
1971 *thread_sp, description.c_str()));
1972 }
else if (reason ==
"fork") {
1977 thread_sp->SetStopInfo(
1980 }
else if (reason ==
"vfork") {
1986 *thread_sp, child_pid, child_tid));
1988 }
else if (reason ==
"vforkdone") {
1989 thread_sp->SetStopInfo(
1995 if (!handled && signo && !did_exec) {
2016 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
2025 if (bp_site_sp->IsEnabled())
2026 thread_sp->SetThreadHitBreakpointSite();
2028 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
2030 thread_sp->GetRegisterContext()->SetPC(
pc);
2031 thread_sp->SetStopInfo(
2033 *thread_sp, bp_site_sp->GetID()));
2036 thread_sp->SetStopInfo(invalid_stop_info_sp);
2042 thread_sp->SetStopInfo(
2046 *thread_sp, signo, description.c_str()));
2057 if (interrupt_thread)
2058 thread_sp = interrupt_thread;
2061 *thread_sp, signo, description.c_str()));
2065 if (!description.empty()) {
2068 const char *stop_info_desc = stop_info_sp->GetDescription();
2069 if (!stop_info_desc || !stop_info_desc[0])
2070 stop_info_sp->SetDescription(description.c_str());
2073 *thread_sp, description.c_str()));
2083 const std::string &description) {
2092 *thread_sp, signo, description.c_str()));
2101 static constexpr llvm::StringLiteral g_key_tid(
"tid");
2102 static constexpr llvm::StringLiteral g_key_name(
"name");
2103 static constexpr llvm::StringLiteral g_key_reason(
"reason");
2104 static constexpr llvm::StringLiteral g_key_metype(
"metype");
2105 static constexpr llvm::StringLiteral g_key_medata(
"medata");
2106 static constexpr llvm::StringLiteral g_key_qaddr(
"qaddr");
2107 static constexpr llvm::StringLiteral g_key_dispatch_queue_t(
2108 "dispatch_queue_t");
2109 static constexpr llvm::StringLiteral g_key_associated_with_dispatch_queue(
2110 "associated_with_dispatch_queue");
2111 static constexpr llvm::StringLiteral g_key_queue_name(
"qname");
2112 static constexpr llvm::StringLiteral g_key_queue_kind(
"qkind");
2113 static constexpr llvm::StringLiteral g_key_queue_serial_number(
"qserialnum");
2114 static constexpr llvm::StringLiteral g_key_registers(
"registers");
2115 static constexpr llvm::StringLiteral g_key_memory(
"memory");
2116 static constexpr llvm::StringLiteral g_key_description(
"description");
2117 static constexpr llvm::StringLiteral g_key_signal(
"signal");
2122 std::string thread_name;
2124 std::string description;
2125 uint32_t exc_type = 0;
2126 std::vector<addr_t> exc_data;
2129 bool queue_vars_valid =
false;
2132 std::string queue_name;
2134 uint64_t queue_serial_number = 0;
2139 thread_dict->
ForEach([
this, &tid, &expedited_register_map, &thread_name,
2140 &signo, &reason, &description, &exc_type, &exc_data,
2141 &thread_dispatch_qaddr, &queue_vars_valid,
2142 &associated_with_dispatch_queue, &dispatch_queue_t,
2143 &queue_name, &queue_kind, &queue_serial_number](
2144 llvm::StringRef key,
2146 if (key == g_key_tid) {
2149 }
else if (key == g_key_metype) {
2151 exc_type =
object->GetUnsignedIntegerValue(0);
2152 }
else if (key == g_key_medata) {
2157 exc_data.push_back(object->GetUnsignedIntegerValue());
2161 }
else if (key == g_key_name) {
2162 thread_name = std::string(object->GetStringValue());
2163 }
else if (key == g_key_qaddr) {
2164 thread_dispatch_qaddr =
2166 }
else if (key == g_key_queue_name) {
2167 queue_vars_valid =
true;
2168 queue_name = std::string(object->GetStringValue());
2169 }
else if (key == g_key_queue_kind) {
2170 std::string queue_kind_str = std::string(object->GetStringValue());
2171 if (queue_kind_str ==
"serial") {
2172 queue_vars_valid =
true;
2174 }
else if (queue_kind_str ==
"concurrent") {
2175 queue_vars_valid =
true;
2178 }
else if (key == g_key_queue_serial_number) {
2179 queue_serial_number =
object->GetUnsignedIntegerValue(0);
2180 if (queue_serial_number != 0)
2181 queue_vars_valid =
true;
2182 }
else if (key == g_key_dispatch_queue_t) {
2183 dispatch_queue_t =
object->GetUnsignedIntegerValue(0);
2185 queue_vars_valid =
true;
2186 }
else if (key == g_key_associated_with_dispatch_queue) {
2187 queue_vars_valid =
true;
2188 bool associated =
object->GetBooleanValue();
2193 }
else if (key == g_key_reason) {
2194 reason = std::string(object->GetStringValue());
2195 }
else if (key == g_key_description) {
2196 description = std::string(object->GetStringValue());
2197 }
else if (key == g_key_registers) {
2200 if (registers_dict) {
2202 [&expedited_register_map](llvm::StringRef key,
2205 if (llvm::to_integer(key, reg))
2206 expedited_register_map[reg] =
2207 std::string(object->GetStringValue());
2211 }
else if (key == g_key_memory) {
2217 if (mem_cache_dict) {
2220 "address", mem_cache_addr)) {
2222 llvm::StringRef str;
2227 const size_t byte_size = bytes.
GetStringRef().size() / 2;
2230 const size_t bytes_copied =
2232 if (bytes_copied == byte_size)
2243 }
else if (key == g_key_signal)
2249 reason, description, exc_type, exc_data,
2250 thread_dispatch_qaddr, queue_vars_valid,
2251 associated_with_dispatch_queue, dispatch_queue_t,
2252 queue_name, queue_kind, queue_serial_number);
2258 const char stop_type = stop_packet.
GetChar();
2259 switch (stop_type) {
2278 const uint8_t signo = stop_packet.
GetHexU8();
2279 llvm::StringRef key;
2280 llvm::StringRef value;
2281 std::string thread_name;
2283 std::string description;
2284 uint32_t exc_type = 0;
2285 std::vector<addr_t> exc_data;
2287 bool queue_vars_valid =
2291 std::string queue_name;
2293 uint64_t queue_serial_number = 0;
2297 if (key.compare(
"metype") == 0) {
2299 value.getAsInteger(16, exc_type);
2300 }
else if (key.compare(
"medata") == 0) {
2303 value.getAsInteger(16, x);
2304 exc_data.push_back(x);
2305 }
else if (key.compare(
"thread") == 0) {
2308 auto pid_tid = thread_id.
GetPidTid(pid);
2310 stop_pid = pid_tid->first;
2311 tid = pid_tid->second;
2314 }
else if (key.compare(
"threads") == 0) {
2315 std::lock_guard<std::recursive_mutex> guard(
2318 }
else if (key.compare(
"thread-pcs") == 0) {
2323 while (!value.empty()) {
2324 llvm::StringRef pc_str;
2325 std::tie(pc_str, value) = value.split(
',');
2326 if (pc_str.getAsInteger(16,
pc))
2330 }
else if (key.compare(
"jstopinfo") == 0) {
2339 }
else if (key.compare(
"hexname") == 0) {
2343 }
else if (key.compare(
"name") == 0) {
2344 thread_name = std::string(value);
2345 }
else if (key.compare(
"qaddr") == 0) {
2346 value.getAsInteger(16, thread_dispatch_qaddr);
2347 }
else if (key.compare(
"dispatch_queue_t") == 0) {
2348 queue_vars_valid =
true;
2349 value.getAsInteger(16, dispatch_queue_t);
2350 }
else if (key.compare(
"qname") == 0) {
2351 queue_vars_valid =
true;
2355 }
else if (key.compare(
"qkind") == 0) {
2356 queue_kind = llvm::StringSwitch<QueueKind>(value)
2361 }
else if (key.compare(
"qserialnum") == 0) {
2362 if (!value.getAsInteger(0, queue_serial_number))
2363 queue_vars_valid =
true;
2364 }
else if (key.compare(
"reason") == 0) {
2365 reason = std::string(value);
2366 }
else if (key.compare(
"description") == 0) {
2370 }
else if (key.compare(
"memory") == 0) {
2384 llvm::StringRef addr_str, bytes_str;
2385 std::tie(addr_str, bytes_str) = value.split(
'=');
2386 if (!addr_str.empty() && !bytes_str.empty()) {
2388 if (!addr_str.getAsInteger(0, mem_cache_addr)) {
2393 const size_t bytes_copied =
2395 if (bytes_copied == byte_size)
2399 }
else if (key.compare(
"watch") == 0 || key.compare(
"rwatch") == 0 ||
2400 key.compare(
"awatch") == 0) {
2403 value.getAsInteger(16, wp_addr);
2411 reason =
"watchpoint";
2413 ostr.
Printf(
"%" PRIu64, wp_addr);
2414 description = std::string(ostr.
GetString());
2415 }
else if (key.compare(
"swbreak") == 0 || key.compare(
"hwbreak") == 0) {
2416 reason =
"breakpoint";
2417 }
else if (key.compare(
"replaylog") == 0) {
2418 reason =
"history boundary";
2419 }
else if (key.compare(
"library") == 0) {
2425 }
else if (key.compare(
"fork") == 0 || key.compare(
"vfork") == 0) {
2431 LLDB_LOG(log,
"Invalid PID/TID to fork: {0}", value);
2437 ostr.
Printf(
"%" PRIu64
" %" PRIu64, pid_tid->first, pid_tid->second);
2438 description = std::string(ostr.
GetString());
2439 }
else if (key.compare(
"addressing_bits") == 0) {
2440 uint64_t addressing_bits;
2441 if (!value.getAsInteger(0, addressing_bits)) {
2444 }
else if (key.compare(
"low_mem_addressing_bits") == 0) {
2445 uint64_t addressing_bits;
2446 if (!value.getAsInteger(0, addressing_bits)) {
2449 }
else if (key.compare(
"high_mem_addressing_bits") == 0) {
2450 uint64_t addressing_bits;
2451 if (!value.getAsInteger(0, addressing_bits)) {
2454 }
else if (key.size() == 2 && ::isxdigit(key[0]) && ::isxdigit(key[1])) {
2456 if (!key.getAsInteger(16, reg))
2457 expedited_register_map[reg] = std::string(std::move(value));
2467 "Received stop for incorrect PID = {0} (inferior PID = {1})",
2487 tid, expedited_register_map, signo, thread_name, reason, description,
2488 exc_type, exc_data, thread_dispatch_qaddr, queue_vars_valid,
2489 associated_with_dispatch_queue, dispatch_queue_t, queue_name,
2490 queue_kind, queue_serial_number);
2557 LLDB_LOGF(log,
"ProcessGDBRemote::DoDetach(keep_stopped: %i)", keep_stopped);
2561 if (
error.Success())
2563 "ProcessGDBRemote::DoDetach() detach packet sent successfully");
2566 "ProcessGDBRemote::DoDetach() detach packet send failed: %s",
2567 error.AsCString() ?
error.AsCString() :
"<unknown error>");
2570 if (!
error.Success())
2585 LLDB_LOGF(log,
"ProcessGDBRemote::DoDestroy()");
2588 int exit_status = SIGABRT;
2589 std::string exit_string;
2596 exit_status = kill_res.get();
2597#if defined(__APPLE__)
2609 if (platform_sp && platform_sp->IsHost()) {
2612 reap_pid = waitpid(
GetID(), &status, WNOHANG);
2613 LLDB_LOGF(log,
"Reaped pid: %d, status: %d.\n", reap_pid, status);
2617 exit_string.assign(
"killed");
2619 exit_string.assign(llvm::toString(kill_res.takeError()));
2622 exit_string.assign(
"killed or interrupted while attaching.");
2628 exit_string.assign(
"destroying when not connected to debugserver");
2649 const bool did_exec =
2650 response.
GetStringRef().find(
";reason:exec;") != std::string::npos;
2653 LLDB_LOGF(log,
"ProcessGDBRemote::SetLastStopPacket () - detected exec");
2658 m_gdb_comm.ResetDiscoverableSettings(did_exec);
2683 LLDB_LOG_ERROR(log, list.takeError(),
"Failed to read module list: {0}.");
2685 addr = list->m_link_map;
2705 const size_t n = thread_infos->
GetSize();
2706 for (
size_t i = 0; i < n; ++i) {
2722 xPacketState x_state =
m_gdb_comm.GetxPacketState();
2725 size_t max_memory_size = x_state != xPacketState::Unimplemented
2728 if (size > max_memory_size) {
2732 size = max_memory_size;
2737 packet_len = ::snprintf(packet,
sizeof(packet),
"%c%" PRIx64
",%" PRIx64,
2738 x_state != xPacketState::Unimplemented ?
'x' :
'm',
2739 (uint64_t)addr, (uint64_t)size);
2740 assert(packet_len + 1 < (
int)
sizeof(packet));
2743 if (
m_gdb_comm.SendPacketAndWaitForResponse(packet, response,
2748 if (x_state != xPacketState::Unimplemented) {
2753 llvm::StringRef data_received = response.
GetStringRef();
2754 if (x_state == xPacketState::Prefixed &&
2755 !data_received.consume_front(
"b")) {
2757 "unexpected response to GDB server memory read packet '{0}': "
2759 packet, data_received);
2764 size_t memcpy_size = std::min(size, data_received.size());
2765 memcpy(buf, data_received.data(), memcpy_size);
2769 llvm::MutableArrayRef<uint8_t>((uint8_t *)buf, size),
'\xdd');
2773 "memory read failed for 0x%" PRIx64, addr);
2776 "GDB server does not support reading memory");
2779 "unexpected response to GDB server memory read packet '%s': '%s'",
2788llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
2791 llvm::MutableArrayRef<uint8_t> buffer) {
2795 llvm::Expected<StringExtractorGDBRemote> response =
2799 "MultiMemRead error response: {0}");
2803 llvm::StringRef response_str = response->GetStringRef();
2804 const unsigned expected_num_ranges = ranges.size();
2805 llvm::Expected<llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>>
2808 if (!parsed_response) {
2810 "MultiMemRead error parsing response: {0}");
2813 return std::move(*parsed_response);
2816llvm::Expected<StringExtractorGDBRemote>
2819 std::string packet_str;
2820 llvm::raw_string_ostream stream(packet_str);
2821 stream <<
"MultiMemRead:ranges:";
2823 auto range_to_stream = [&](
auto range) {
2825 stream << llvm::formatv(
"{0:x-},{1:x-}", range.base, range.size);
2827 llvm::interleave(ranges, stream, range_to_stream,
",");
2832 m_gdb_comm.SendPacketAndWaitForResponse(packet_str.data(), response,
2835 return llvm::createStringError(
2836 llvm::formatv(
"MultiMemRead failed to send packet: '{0}'", packet_str));
2839 return llvm::createStringError(
2840 llvm::formatv(
"MultiMemRead failed: '{0}'", response.
GetStringRef()));
2843 return llvm::createStringError(llvm::formatv(
2844 "MultiMemRead unexpected response: '{0}'", response.
GetStringRef()));
2849llvm::Expected<llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>>
2851 llvm::MutableArrayRef<uint8_t> buffer,
2852 unsigned expected_num_ranges) {
2854 auto [sizes_str, memory_data] = response_str.split(
';');
2855 if (sizes_str.size() == response_str.size())
2856 return llvm::createStringError(llvm::formatv(
2857 "MultiMemRead response missing field separator ';' in: '{0}'",
2860 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> read_results;
2863 for (llvm::StringRef size_str : llvm::split(sizes_str,
',')) {
2865 if (size_str.getAsInteger(16, read_size))
2866 return llvm::createStringError(llvm::formatv(
2867 "MultiMemRead response has invalid size string: {0}", size_str));
2869 if (memory_data.size() < read_size)
2870 return llvm::createStringError(
2871 llvm::formatv(
"MultiMemRead response did not have enough data, "
2872 "requested sizes: {0}",
2875 llvm::StringRef region_to_read = memory_data.take_front(read_size);
2876 memory_data = memory_data.drop_front(read_size);
2878 assert(buffer.size() >= read_size);
2879 llvm::MutableArrayRef<uint8_t> region_to_write =
2880 buffer.take_front(read_size);
2881 buffer = buffer.drop_front(read_size);
2883 memcpy(region_to_write.data(), region_to_read.data(), read_size);
2884 read_results.push_back(region_to_write);
2887 return read_results;
2891 return m_gdb_comm.GetMemoryTaggingSupported();
2894llvm::Expected<std::vector<uint8_t>>
2901 return llvm::createStringError(llvm::inconvertibleErrorCode(),
2902 "Error reading memory tags from remote");
2906 llvm::ArrayRef<uint8_t> tag_data = buffer_sp->GetData();
2907 std::vector<uint8_t> got;
2908 got.reserve(tag_data.size());
2909 std::copy(tag_data.begin(), tag_data.end(), std::back_inserter(got));
2915 const std::vector<uint8_t> &tags) {
2918 return m_gdb_comm.WriteMemoryTags(addr, len, type, tags);
2922 std::vector<ObjectFile::LoadableData> entries) {
2932 if (
error.Success())
2946 for (
size_t i = 0; i < size; ++i)
2971 if (blocksize == 0) {
2979 lldb::addr_t block_start_addr = addr - (addr % blocksize);
2980 size += (addr - block_start_addr);
2981 if ((size % blocksize) != 0)
2982 size += (blocksize - size % blocksize);
2998 auto overlap = last_range.GetRangeEnd() - range.
GetRangeBase();
3019 "flash erase failed for 0x%" PRIx64, addr);
3022 "GDB server does not support flashing");
3025 "unexpected response to GDB server flash erase packet '%s': '%s'",
3042 if (
m_gdb_comm.SendPacketAndWaitForResponse(
"vFlashDone", response,
3052 "GDB server does not support flashing");
3055 "unexpected response to GDB server flash done packet: '%s'",
3070 if (size > max_memory_size) {
3074 size = max_memory_size;
3095 if (!
error.Success())
3097 packet.
Printf(
"vFlashWrite:%" PRIx64
":", addr);
3100 packet.
Printf(
"M%" PRIx64
",%" PRIx64
":", addr, (uint64_t)size);
3113 "memory write failed for 0x%" PRIx64, addr);
3116 "GDB server does not support writing memory");
3119 "unexpected response to GDB server memory write packet '%s': '%s'",
3129 uint32_t permissions,
3135 allocated_addr =
m_gdb_comm.AllocateMemory(size, permissions);
3138 return allocated_addr;
3144 if (permissions & lldb::ePermissionsReadable)
3146 if (permissions & lldb::ePermissionsWritable)
3148 if (permissions & lldb::ePermissionsExecutable)
3157 "ProcessGDBRemote::%s no direct stub support for memory "
3158 "allocation, and InferiorCallMmap also failed - is stub "
3159 "missing register context save/restore capability?",
3166 "unable to allocate %" PRIu64
" bytes of memory with permissions %s",
3170 return allocated_addr;
3185 return m_gdb_comm.GetWatchpointReportedAfter();
3192 switch (supported) {
3197 "tried to deallocate memory without ever allocating memory");
3203 "unable to deallocate memory at 0x%" PRIx64, addr);
3215 "unable to deallocate memory at 0x%" PRIx64, addr);
3230 m_gdb_comm.SendStdinNotification(src, src_len);
3237 assert(bp_site !=
nullptr);
3248 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3249 ") address = 0x%" PRIx64,
3250 site_id, (uint64_t)addr);
3255 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3256 ") address = 0x%" PRIx64
" -- SUCCESS (already enabled)",
3257 site_id, (uint64_t)addr);
3276 uint8_t error_no =
m_gdb_comm.SendGDBStoppointTypePacket(
3278 if (error_no == 0) {
3294 if (error_no != UINT8_MAX)
3296 "error: %d sending the breakpoint request", error_no);
3305 LLDB_LOGF(log,
"Software breakpoints are unsupported");
3316 uint8_t error_no =
m_gdb_comm.SendGDBStoppointTypePacket(
3318 if (error_no == 0) {
3329 if (error_no != UINT8_MAX)
3331 "error: %d sending the hardware breakpoint request "
3332 "(hardware breakpoint resources might be exhausted or unavailable)",
3336 "error sending the hardware breakpoint request "
3337 "(hardware breakpoint resources "
3338 "might be exhausted or unavailable)");
3344 LLDB_LOGF(log,
"Hardware breakpoints are unsupported");
3362 assert(bp_site !=
nullptr);
3367 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3368 ") addr = 0x%8.8" PRIx64,
3369 site_id, (uint64_t)addr);
3394 if (
error.Success())
3398 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3399 ") addr = 0x%8.8" PRIx64
" -- SUCCESS (already disabled)",
3400 site_id, (uint64_t)addr);
3404 if (
error.Success())
3413 bool read = wp_res_sp->WatchpointResourceRead();
3414 bool write = wp_res_sp->WatchpointResourceWrite();
3416 assert((read || write) &&
3417 "WatchpointResource type is neither read nor write");
3433 addr_t addr = wp_sp->GetLoadAddress();
3435 LLDB_LOGF(log,
"ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
")",
3437 if (wp_sp->IsEnabled()) {
3439 "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
3440 ") addr = 0x%8.8" PRIx64
": watchpoint already enabled.",
3441 watchID, (uint64_t)addr);
3445 bool read = wp_sp->WatchpointRead();
3446 bool write = wp_sp->WatchpointWrite() || wp_sp->WatchpointModify();
3447 size_t size = wp_sp->GetByteSize();
3450 WatchpointHardwareFeature supported_features =
3453 std::vector<WatchpointResourceSP> resources =
3455 addr, size, read, write, supported_features, target_arch);
3480 bool set_all_resources =
true;
3481 std::vector<WatchpointResourceSP> succesfully_set_resources;
3482 for (
const auto &wp_res_sp : resources) {
3483 addr_t addr = wp_res_sp->GetLoadAddress();
3484 size_t size = wp_res_sp->GetByteSize();
3486 if (!
m_gdb_comm.SupportsGDBStoppointPacket(type) ||
3487 m_gdb_comm.SendGDBStoppointTypePacket(type,
true, addr, size,
3489 set_all_resources =
false;
3492 succesfully_set_resources.push_back(wp_res_sp);
3495 if (set_all_resources) {
3496 wp_sp->SetEnabled(
true, notify);
3497 for (
const auto &wp_res_sp : resources) {
3500 wp_res_sp->AddConstituent(wp_sp);
3508 for (
const auto &wp_res_sp : succesfully_set_resources) {
3509 addr_t addr = wp_res_sp->GetLoadAddress();
3510 size_t size = wp_res_sp->GetByteSize();
3512 m_gdb_comm.SendGDBStoppointTypePacket(type,
false, addr, size,
3516 "Setting one of the watchpoint resources failed");
3532 addr_t addr = wp_sp->GetLoadAddress();
3535 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3536 ") addr = 0x%8.8" PRIx64,
3537 watchID, (uint64_t)addr);
3539 if (!wp_sp->IsEnabled()) {
3541 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3542 ") addr = 0x%8.8" PRIx64
" -- SUCCESS (already disabled)",
3543 watchID, (uint64_t)addr);
3547 wp_sp->SetEnabled(
false, notify);
3551 if (wp_sp->IsHardware()) {
3552 bool disabled_all =
true;
3554 std::vector<WatchpointResourceSP> unused_resources;
3556 if (wp_res_sp->ConstituentsContains(wp_sp)) {
3558 addr_t addr = wp_res_sp->GetLoadAddress();
3559 size_t size = wp_res_sp->GetByteSize();
3560 if (
m_gdb_comm.SendGDBStoppointTypePacket(type,
false, addr, size,
3562 disabled_all =
false;
3564 wp_res_sp->RemoveConstituent(wp_sp);
3565 if (wp_res_sp->GetNumberOfConstituents() == 0)
3566 unused_resources.push_back(wp_res_sp);
3570 for (
auto &wp_res_sp : unused_resources)
3573 wp_sp->SetEnabled(
false, notify);
3576 "Failure disabling one of the watchpoint locations");
3589 LLDB_LOGF(log,
"ProcessGDBRemote::DoSignal (signal = %d)", signo);
3604 if (platform_sp && !platform_sp->IsHost())
3609 const char *error_string =
error.AsCString();
3610 if (error_string ==
nullptr)
3619 static FileSpec g_debugserver_file_spec;
3626 std::string env_debugserver_path = host_env.lookup(
"LLDB_DEBUGSERVER_PATH");
3627 if (!env_debugserver_path.empty()) {
3628 debugserver_file_spec.
SetFile(env_debugserver_path,
3629 FileSpec::Style::native);
3630 LLDB_LOG(log,
"gdb-remote stub exe path set from environment variable: {0}",
3631 env_debugserver_path);
3633 debugserver_file_spec = g_debugserver_file_spec;
3635 return debugserver_file_spec;
3638 debugserver_file_spec = HostInfo::GetSupportExeDir();
3639 if (debugserver_file_spec) {
3642 LLDB_LOG(log,
"found gdb-remote stub exe '{0}'", debugserver_file_spec);
3644 g_debugserver_file_spec = debugserver_file_spec;
3647 if (!debugserver_file_spec) {
3650 LLDB_LOG(log,
"could not find gdb-remote stub exe '{0}'",
3651 debugserver_file_spec);
3655 g_debugserver_file_spec.
Clear();
3658 return debugserver_file_spec;
3663 using namespace std::placeholders;
3673 const std::weak_ptr<ProcessGDBRemote> this_wp =
3674 std::static_pointer_cast<ProcessGDBRemote>(shared_from_this());
3681#if defined(__APPLE__)
3685 int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID,
3687 struct kinfo_proc processInfo;
3688 size_t bufsize =
sizeof(processInfo);
3689 if (sysctl(mib, (
unsigned)(
sizeof(mib) /
sizeof(
int)), &processInfo, &bufsize,
3692 if (processInfo.kp_proc.p_flag & P_TRANSLATED) {
3693 debugserver_path =
FileSpec(
"/Library/Apple/usr/libexec/oah/debugserver");
3700 "'. Please ensure it is properly installed "
3701 "and available in your PATH");
3716 debugserver_launch_info,
nullptr);
3721 LLDB_LOGF(log,
"failed to start debugserver process: %s",
3731 m_gdb_comm.SetConnection(std::make_unique<ConnectionFileDescriptor>(
3732 std::move(socket_pair->second)));
3746 std::weak_ptr<ProcessGDBRemote> process_wp,
lldb::pid_t debugserver_pid,
3755 "ProcessGDBRemote::%s(process_wp, pid=%" PRIu64
3756 ", signo=%i (0x%x), exit_status=%i)",
3757 __FUNCTION__, debugserver_pid, signo, signo, exit_status);
3759 std::shared_ptr<ProcessGDBRemote> process_sp = process_wp.lock();
3760 LLDB_LOGF(log,
"ProcessGDBRemote::%s(process = %p)", __FUNCTION__,
3761 static_cast<void *
>(process_sp.get()));
3762 if (!process_sp || process_sp->m_debugserver_pid != debugserver_pid)
3768 std::this_thread::sleep_for(std::chrono::milliseconds(500));
3772 const StateType state = process_sp->GetState();
3781 llvm::StringRef signal_name =
3782 process_sp->GetUnixSignals()->GetSignalAsStringRef(signo);
3784 if (!signal_name.empty())
3785 stream.
Format(format_str, signal_name);
3787 stream.
Format(format_str, signo);
3789 process_sp->SetExitStatus(-1, stream.
GetString());
3805 static llvm::once_flag g_once_flag;
3807 llvm::call_once(g_once_flag, []() {
3816 debugger, PluginProperties::GetSettingName())) {
3817 const bool is_global_setting =
true;
3820 "Properties for the gdb-remote process plug-in.", is_global_setting);
3827 LLDB_LOGF(log,
"ProcessGDBRemote::%s ()", __FUNCTION__);
3834 llvm::Expected<HostThread> async_thread =
3838 if (!async_thread) {
3840 "failed to launch host thread: {0}");
3846 "ProcessGDBRemote::%s () - Called when Async thread was "
3856 LLDB_LOGF(log,
"ProcessGDBRemote::%s ()", __FUNCTION__);
3871 "ProcessGDBRemote::%s () - Called when Async thread was not running.",
3877 LLDB_LOGF(log,
"ProcessGDBRemote::%s(pid = %" PRIu64
") thread starting...",
3878 __FUNCTION__,
GetID());
3896 "ProcessGDBRemote::%s(pid = %" PRIu64
3897 ") listener.WaitForEvent (NULL, event_sp)...",
3898 __FUNCTION__,
GetID());
3901 const uint32_t event_type = event_sp->GetType();
3904 "ProcessGDBRemote::%s(pid = %" PRIu64
3905 ") Got an event of type: %d...",
3906 __FUNCTION__,
GetID(), event_type);
3908 switch (event_type) {
3913 if (continue_packet) {
3914 const char *continue_cstr =
3915 (
const char *)continue_packet->
GetBytes();
3916 const size_t continue_cstr_len = continue_packet->
GetByteSize();
3918 "ProcessGDBRemote::%s(pid = %" PRIu64
3919 ") got eBroadcastBitAsyncContinue: %s",
3920 __FUNCTION__,
GetID(), continue_cstr);
3922 if (::strstr(continue_cstr,
"vAttach") ==
nullptr)
3929 llvm::StringRef(continue_cstr, continue_cstr_len),
3940 switch (stop_state) {
3953 int exit_status = response.
GetHexU8();
3954 std::string desc_string;
3956 llvm::StringRef desc_str;
3957 llvm::StringRef desc_token;
3959 if (desc_token !=
"description")
3974 if (::strstr(continue_cstr,
"vAttach") !=
nullptr &&
3977 "System Integrity Protection");
3978 }
else if (::strstr(continue_cstr,
"vAttach") !=
nullptr &&
3998 "ProcessGDBRemote::%s(pid = %" PRIu64
3999 ") got eBroadcastBitAsyncThreadShouldExit...",
4000 __FUNCTION__,
GetID());
4006 "ProcessGDBRemote::%s(pid = %" PRIu64
4007 ") got unknown event 0x%8.8x",
4008 __FUNCTION__,
GetID(), event_type);
4015 "ProcessGDBRemote::%s(pid = %" PRIu64
4016 ") listener.WaitForEvent (NULL, event_sp) => false",
4017 __FUNCTION__,
GetID());
4022 LLDB_LOGF(log,
"ProcessGDBRemote::%s(pid = %" PRIu64
") thread exiting...",
4023 __FUNCTION__,
GetID());
4055 LLDB_LOGF(log,
"Hit New Thread Notification breakpoint.");
4061 LLDB_LOG(log,
"Check if need to update ignored signals");
4075 LLDB_LOG(log,
"Signals' version hasn't changed. version={0}",
4080 auto signals_to_ignore =
4085 "Signals' version changed. old version={0}, new version={1}, "
4086 "signals ignored={2}, update result={3}",
4088 signals_to_ignore.size(),
error);
4090 if (
error.Success())
4100 LLDB_LOGF(log,
"Enabled noticing new thread breakpoint.");
4106 platform_sp->SetThreadCreationBreakpoint(
GetTarget());
4110 log,
"Successfully created new thread notification breakpoint %i",
4115 LLDB_LOGF(log,
"Failed to create new thread notification breakpoint.");
4125 LLDB_LOGF(log,
"Disabling new thread notification breakpoint.");
4145 return_value =
m_gdb_comm.SendLaunchEventDataPacket(data, &was_supported);
4146 if (return_value != 0) {
4149 "Sending events is not supported for this process.");
4159 if (
m_gdb_comm.GetQXferAuxvReadSupported()) {
4160 llvm::Expected<std::string> response =
m_gdb_comm.ReadExtFeature(
"auxv",
"");
4162 buf = std::make_shared<DataBufferHeap>(response->c_str(),
4163 response->length());
4174 if (
m_gdb_comm.GetThreadExtendedInfoSupported()) {
4180 args_dict->GetAsDictionary()->AddIntegerItem(
"thread", tid);
4183 packet <<
"jThreadExtendedInfo:";
4184 args_dict->Dump(packet,
false);
4191 packet << (char)(0x7d ^ 0x20);
4200 if (!response.
Empty()) {
4213 args_dict->GetAsDictionary()->AddIntegerItem(
"image_list_address",
4214 image_list_address);
4215 args_dict->GetAsDictionary()->AddIntegerItem(
"image_count", image_count);
4223 args_dict->GetAsDictionary()->AddBooleanItem(
"fetch_all_solibs",
true);
4229 const std::vector<lldb::addr_t> &load_addresses) {
4233 for (
auto addr : load_addresses)
4234 addresses->AddIntegerItem(addr);
4236 args_dict->GetAsDictionary()->AddItem(
"solib_addresses", addresses);
4246 if (
m_gdb_comm.GetLoadedDynamicLibrariesInfosSupported()) {
4249 std::chrono::seconds(10));
4252 packet <<
"jGetLoadedDynamicLibrariesInfos:";
4253 args_dict->Dump(packet,
false);
4260 packet << (char)(0x7d ^ 0x20);
4269 if (!response.
Empty()) {
4282 if (
m_gdb_comm.GetDynamicLoaderProcessStateSupported()) {
4285 if (
m_gdb_comm.SendPacketAndWaitForResponse(
"jGetDyldProcessState",
4291 if (!response.
Empty()) {
4304 if (
m_gdb_comm.GetSharedCacheInfoSupported()) {
4306 packet <<
"jGetSharedCacheInfo:";
4307 args_dict->Dump(packet,
false);
4314 packet << (char)(0x7d ^ 0x20);
4323 if (!response.
Empty()) {
4334 return m_gdb_comm.ConfigureRemoteStructuredData(type_name, config_sp);
4347 const uint64_t reasonable_largeish_default = 128 * 1024;
4348 const uint64_t conservative_default = 512;
4351 uint64_t stub_max_size =
m_gdb_comm.GetRemoteMaxPacketSize();
4352 if (stub_max_size !=
UINT64_MAX && stub_max_size != 0) {
4358 if (stub_max_size > reasonable_largeish_default) {
4359 stub_max_size = reasonable_largeish_default;
4365 if (stub_max_size > 70)
4366 stub_max_size -= 32 + 32 + 6;
4372 log->
Warning(
"Packet size is too small. "
4373 "LLDB may face problems while writing memory");
4384 uint64_t user_specified_max) {
4385 if (user_specified_max != 0) {
4413 module_spec = cached->second;
4414 return bool(module_spec);
4417 if (!
m_gdb_comm.GetModuleInfo(module_file_spec, arch, module_spec)) {
4418 LLDB_LOGF(log,
"ProcessGDBRemote::%s - failed to get module info for %s:%s",
4419 __FUNCTION__, module_file_spec.
GetPath().c_str(),
4426 module_spec.
Dump(stream);
4427 LLDB_LOGF(log,
"ProcessGDBRemote::%s - got module info for (%s:%s) : %s",
4428 __FUNCTION__, module_file_spec.
GetPath().c_str(),
4437 llvm::ArrayRef<FileSpec> module_file_specs,
const llvm::Triple &triple) {
4438 auto module_specs =
m_gdb_comm.GetModulesInfo(module_file_specs, triple);
4440 for (
const FileSpec &spec : module_file_specs)
4445 triple.getTriple())] = spec;
4459typedef std::vector<std::string> stringVec;
4461typedef std::vector<struct GdbServerRegisterInfo> GDBServerRegisterVec;
4462struct RegisterSetInfo {
4466typedef std::map<uint32_t, RegisterSetInfo> RegisterSetMap;
4468struct GdbServerTargetInfo {
4472 RegisterSetMap reg_set_map;
4489 std::map<uint64_t, FieldEnum::Enumerator> enumerators;
4492 "evalue", [&enumerators, &log](
const XMLNode &enumerator_node) {
4493 std::optional<llvm::StringRef> name;
4494 std::optional<uint64_t> value;
4497 [&name, &value, &log](
const llvm::StringRef &attr_name,
4498 const llvm::StringRef &attr_value) {
4499 if (attr_name ==
"name") {
4500 if (attr_value.size())
4503 LLDB_LOG(log,
"ProcessGDBRemote::ParseEnumEvalues "
4504 "Ignoring empty name in evalue");
4505 }
else if (attr_name ==
"value") {
4506 uint64_t parsed_value = 0;
4507 if (llvm::to_integer(attr_value, parsed_value))
4508 value = parsed_value;
4511 "ProcessGDBRemote::ParseEnumEvalues "
4512 "Invalid value \"{0}\" in "
4517 "ProcessGDBRemote::ParseEnumEvalues Ignoring "
4518 "unknown attribute "
4519 "\"{0}\" in evalue",
4527 enumerators.insert_or_assign(
4528 *value, FieldEnum::Enumerator(*value, name->str()));
4535 for (
auto [_, enumerator] : enumerators)
4536 final_enumerators.push_back(enumerator);
4538 return final_enumerators;
4542ParseEnums(XMLNode feature_node,
4543 llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4544 Log *log(
GetLog(GDBRLog::Process));
4548 "enum", [log, ®isters_enum_types](
const XMLNode &enum_node) {
4552 const llvm::StringRef &attr_value) {
4553 if (attr_name ==
"id")
4571 if (!enumerators.empty()) {
4573 "ProcessGDBRemote::ParseEnums Found enum type \"{0}\"",
4575 registers_enum_types.insert_or_assign(
4576 id, std::make_unique<FieldEnum>(
id, enumerators));
4585static std::vector<RegisterFlags::Field> ParseFlagsFields(
4586 XMLNode flags_node,
unsigned size,
4587 const llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4588 Log *log(
GetLog(GDBRLog::Process));
4589 const unsigned max_start_bit = size * 8 - 1;
4592 std::vector<RegisterFlags::Field> fields;
4594 ®isters_enum_types](
4597 std::optional<llvm::StringRef> name;
4598 std::optional<unsigned> start;
4599 std::optional<unsigned> end;
4600 std::optional<llvm::StringRef> type;
4603 &log](
const llvm::StringRef &attr_name,
4604 const llvm::StringRef &attr_value) {
4607 if (attr_name ==
"name") {
4610 "ProcessGDBRemote::ParseFlagsFields Found field node name \"{0}\"",
4613 }
else if (attr_name ==
"start") {
4614 unsigned parsed_start = 0;
4615 if (llvm::to_integer(attr_value, parsed_start)) {
4616 if (parsed_start > max_start_bit) {
4618 "ProcessGDBRemote::ParseFlagsFields Invalid start {0} in "
4621 parsed_start, max_start_bit);
4623 start = parsed_start;
4627 "ProcessGDBRemote::ParseFlagsFields Invalid start \"{0}\" in "
4631 }
else if (attr_name ==
"end") {
4632 unsigned parsed_end = 0;
4633 if (llvm::to_integer(attr_value, parsed_end))
4634 if (parsed_end > max_start_bit) {
4636 "ProcessGDBRemote::ParseFlagsFields Invalid end {0} in "
4639 parsed_end, max_start_bit);
4644 "ProcessGDBRemote::ParseFlagsFields Invalid end \"{0}\" in "
4648 }
else if (attr_name ==
"type") {
4653 "ProcessGDBRemote::ParseFlagsFields Ignoring unknown attribute "
4654 "\"{0}\" in field node",
4661 if (name && start && end) {
4665 "ProcessGDBRemote::ParseFlagsFields Start {0} > end {1} in field "
4666 "\"{2}\", ignoring",
4667 *start, *end, name->data());
4671 "ProcessGDBRemote::ParseFlagsFields Ignoring field \"{2}\" "
4673 "size > 64 bits, this is not supported",
4677 const FieldEnum *enum_type =
nullptr;
4678 if (type && !type->empty()) {
4679 auto found = registers_enum_types.find(*type);
4680 if (found != registers_enum_types.end()) {
4681 enum_type = found->second.get();
4684 uint64_t max_value =
4687 if (enumerator.m_value > max_value) {
4688 enum_type =
nullptr;
4691 "ProcessGDBRemote::ParseFlagsFields In enum \"{0}\" "
4692 "evalue \"{1}\" with value {2} exceeds the maximum value "
4693 "of field \"{3}\" ({4}), ignoring enum",
4694 type->data(), enumerator.m_name, enumerator.m_value,
4695 name->data(), max_value);
4701 "ProcessGDBRemote::ParseFlagsFields Could not find type "
4703 "for field \"{1}\", ignoring",
4704 type->data(), name->data());
4709 RegisterFlags::Field(name->str(), *start, *end, enum_type));
4720 XMLNode feature_node,
4721 llvm::StringMap<std::unique_ptr<RegisterFlags>> ®isters_flags_types,
4722 const llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4723 Log *log(
GetLog(GDBRLog::Process));
4727 [&log, ®isters_flags_types,
4728 ®isters_enum_types](
const XMLNode &flags_node) ->
bool {
4729 LLDB_LOG(log,
"ProcessGDBRemote::ParseFlags Found flags node \"{0}\"",
4732 std::optional<llvm::StringRef>
id;
4733 std::optional<unsigned> size;
4735 [&
id, &size, &log](
const llvm::StringRef &name,
4736 const llvm::StringRef &value) {
4739 }
else if (name ==
"size") {
4740 unsigned parsed_size = 0;
4741 if (llvm::to_integer(value, parsed_size))
4745 "ProcessGDBRemote::ParseFlags Invalid size \"{0}\" "
4751 "ProcessGDBRemote::ParseFlags Ignoring unknown "
4752 "attribute \"{0}\" in flags node",
4760 std::vector<RegisterFlags::Field> fields =
4761 ParseFlagsFields(flags_node, *size, registers_enum_types);
4762 if (fields.size()) {
4764 std::sort(fields.rbegin(), fields.rend());
4765 std::vector<RegisterFlags::Field>::const_iterator overlap =
4766 std::adjacent_find(fields.begin(), fields.end(),
4767 [](
const RegisterFlags::Field &lhs,
4768 const RegisterFlags::Field &rhs) {
4769 return lhs.Overlaps(rhs);
4773 if (overlap == fields.end()) {
4774 if (registers_flags_types.contains(*
id)) {
4788 "ProcessGDBRemote::ParseFlags Definition of flags "
4790 "previous definition, using original definition instead.",
4793 registers_flags_types.insert_or_assign(
4794 *
id, std::make_unique<RegisterFlags>(
id->str(), *size,
4795 std::move(fields)));
4799 std::vector<RegisterFlags::Field>::const_iterator next =
4803 "ProcessGDBRemote::ParseFlags Ignoring flags because fields "
4804 "{0} (start: {1} end: {2}) and {3} (start: {4} end: {5}) "
4806 overlap->GetName().c_str(), overlap->GetStart(),
4807 overlap->GetEnd(), next->GetName().c_str(), next->GetStart(),
4813 "ProcessGDBRemote::ParseFlags Ignoring definition of flags "
4814 "\"{0}\" because it contains no fields.",
4824 XMLNode feature_node, GdbServerTargetInfo &target_info,
4825 std::vector<DynamicRegisterInfo::Register> ®isters,
4826 llvm::StringMap<std::unique_ptr<RegisterFlags>> ®isters_flags_types,
4827 llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4831 Log *log(
GetLog(GDBRLog::Process));
4834 ParseEnums(feature_node, registers_enum_types);
4835 for (
const auto &enum_type : registers_enum_types)
4838 ParseFlags(feature_node, registers_flags_types, registers_enum_types);
4839 for (
const auto &flags : registers_flags_types)
4840 flags.second->DumpToLog(log);
4844 [&target_info, ®isters, ®isters_flags_types,
4845 log](
const XMLNode ®_node) ->
bool {
4846 std::string gdb_group;
4847 std::string gdb_type;
4848 DynamicRegisterInfo::Register reg_info;
4849 bool encoding_set =
false;
4850 bool format_set =
false;
4854 &encoding_set, &format_set, ®_info,
4855 log](
const llvm::StringRef &name,
4856 const llvm::StringRef &value) ->
bool {
4857 if (name ==
"name") {
4859 }
else if (name ==
"bitsize") {
4860 if (llvm::to_integer(value, reg_info.
byte_size))
4862 llvm::divideCeil(reg_info.
byte_size, CHAR_BIT);
4863 }
else if (name ==
"type") {
4864 gdb_type = value.str();
4865 }
else if (name ==
"group") {
4866 gdb_group = value.str();
4867 }
else if (name ==
"regnum") {
4869 }
else if (name ==
"offset") {
4871 }
else if (name ==
"altname") {
4873 }
else if (name ==
"encoding") {
4874 encoding_set =
true;
4876 }
else if (name ==
"format") {
4882 llvm::StringSwitch<lldb::Format>(value)
4893 }
else if (name ==
"group_id") {
4895 llvm::to_integer(value, set_id);
4896 RegisterSetMap::const_iterator pos =
4897 target_info.reg_set_map.find(set_id);
4898 if (pos != target_info.reg_set_map.end())
4899 reg_info.
set_name = pos->second.name;
4900 }
else if (name ==
"gcc_regnum" || name ==
"ehframe_regnum") {
4902 }
else if (name ==
"dwarf_regnum") {
4904 }
else if (name ==
"generic") {
4906 }
else if (name ==
"value_regnums") {
4909 }
else if (name ==
"invalidate_regnums") {
4914 "ProcessGDBRemote::ParseRegisters unhandled reg "
4915 "attribute %s = %s",
4916 name.data(), value.data());
4921 if (!gdb_type.empty()) {
4923 llvm::StringMap<std::unique_ptr<RegisterFlags>>::iterator it =
4924 registers_flags_types.find(gdb_type);
4925 if (it != registers_flags_types.end()) {
4926 auto flags_type = it->second.get();
4927 if (reg_info.
byte_size == flags_type->GetSize())
4931 "ProcessGDBRemote::ParseRegisters Size of register "
4932 "flags %s (%d bytes) for "
4933 "register %s does not match the register size (%d "
4934 "bytes). Ignoring this set of flags.",
4935 flags_type->GetID().c_str(), flags_type->GetSize(),
4942 if (!gdb_type.empty() && !(encoding_set || format_set)) {
4943 if (llvm::StringRef(gdb_type).starts_with(
"int")) {
4946 }
else if (gdb_type ==
"data_ptr" || gdb_type ==
"code_ptr") {
4949 }
else if (gdb_type ==
"float" || gdb_type ==
"ieee_single" ||
4950 gdb_type ==
"ieee_double") {
4953 }
else if (gdb_type ==
"aarch64v" ||
4954 llvm::StringRef(gdb_type).starts_with(
"vec") ||
4955 gdb_type ==
"i387_ext" || gdb_type ==
"uint128" ||
4968 "ProcessGDBRemote::ParseRegisters Could not determine lldb"
4969 "format and encoding for gdb type %s",
4979 if (!gdb_group.empty()) {
4990 "ProcessGDBRemote::%s Skipping zero bitsize register %s",
4993 registers.push_back(reg_info);
5008 ArchSpec &arch_to_use, std::string xml_filename,
5009 std::vector<DynamicRegisterInfo::Register> ®isters) {
5011 llvm::Expected<std::string> raw =
m_gdb_comm.ReadExtFeature(
"features", xml_filename);
5012 if (errorToBool(raw.takeError()))
5017 if (xml_document.
ParseMemory(raw->c_str(), raw->size(),
5018 xml_filename.c_str())) {
5019 GdbServerTargetInfo target_info;
5020 std::vector<XMLNode> feature_nodes;
5026 const XMLNode &node) ->
bool {
5027 llvm::StringRef name = node.
GetName();
5028 if (name ==
"architecture") {
5030 }
else if (name ==
"osabi") {
5032 }
else if (name ==
"xi:include" || name ==
"include") {
5035 target_info.includes.push_back(href);
5036 }
else if (name ==
"feature") {
5037 feature_nodes.push_back(node);
5038 }
else if (name ==
"groups") {
5040 "group", [&target_info](
const XMLNode &node) ->
bool {
5042 RegisterSetInfo set_info;
5045 [&set_id, &set_info](
const llvm::StringRef &name,
5046 const llvm::StringRef &value) ->
bool {
5049 llvm::to_integer(value, set_id);
5056 target_info.reg_set_map[set_id] = set_info;
5069 feature_nodes.push_back(feature_node);
5071 const XMLNode &node) ->
bool {
5072 llvm::StringRef name = node.
GetName();
5073 if (name ==
"xi:include" || name ==
"include") {
5076 target_info.includes.push_back(href);
5090 if (!arch_to_use.
IsValid() && !target_info.arch.empty()) {
5092 arch_to_use.
SetTriple(llvm::StringSwitch<std::string>(target_info.arch)
5093 .Case(
"i386:x86-64",
"x86_64")
5094 .Case(
"riscv:rv64",
"riscv64")
5095 .Case(
"riscv:rv32",
"riscv32")
5096 .Default(target_info.arch) +
5104 for (
auto &feature_node : feature_nodes) {
5105 ParseRegisters(feature_node, target_info, registers,
5109 for (
const auto &include : target_info.includes) {
5121 std::vector<DynamicRegisterInfo::Register> ®isters,
5123 std::map<uint32_t, uint32_t> remote_to_local_map;
5124 uint32_t remote_regnum = 0;
5125 for (
auto it : llvm::enumerate(registers)) {
5133 remote_to_local_map[remote_reg_info.
regnum_remote] = it.index();
5139 auto proc_to_lldb = [&remote_to_local_map](uint32_t process_regnum) {
5140 auto lldb_regit = remote_to_local_map.find(process_regnum);
5141 return lldb_regit != remote_to_local_map.end() ? lldb_regit->second
5145 llvm::transform(remote_reg_info.value_regs,
5146 remote_reg_info.value_regs.begin(), proc_to_lldb);
5147 llvm::transform(remote_reg_info.invalidate_regs,
5148 remote_reg_info.invalidate_regs.begin(), proc_to_lldb);
5155 abi_sp->AugmentRegisterInfo(registers);
5165 if (!
m_gdb_comm.GetQXferFeaturesReadSupported())
5166 return llvm::createStringError(
5167 llvm::inconvertibleErrorCode(),
5168 "the debug server does not support \"qXfer:features:read\"");
5171 return llvm::createStringError(
5172 llvm::inconvertibleErrorCode(),
5173 "the debug server supports \"qXfer:features:read\", but LLDB does not "
5174 "have XML parsing enabled (check LLLDB_ENABLE_LIBXML2)");
5184 std::vector<DynamicRegisterInfo::Register> registers;
5192 ? llvm::ErrorSuccess()
5193 : llvm::createStringError(
5194 llvm::inconvertibleErrorCode(),
5195 "the debug server did not describe any registers");
5201 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5202 "XML parsing not available");
5205 LLDB_LOGF(log,
"ProcessGDBRemote::%s", __FUNCTION__);
5214 llvm::Expected<std::string> raw = comm.
ReadExtFeature(
"libraries-svr4",
"");
5216 return raw.takeError();
5219 LLDB_LOGF(log,
"parsing: %s", raw->c_str());
5222 if (!doc.
ParseMemory(raw->c_str(), raw->size(),
"noname.xml"))
5223 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5224 "Error reading noname.xml");
5228 return llvm::createStringError(
5229 llvm::inconvertibleErrorCode(),
5230 "Error finding library-list-svr4 xml element");
5235 if (!main_lm.empty())
5239 "library", [log, &list](
const XMLNode &library) ->
bool {
5244 [&module](
const llvm::StringRef &name,
5245 const llvm::StringRef &value) ->
bool {
5248 module.set_name(value.str());
5249 else if (name ==
"lm") {
5251 llvm::to_integer(value, uint_value);
5252 module.set_link_map(uint_value);
5253 }
else if (name ==
"l_addr") {
5256 llvm::to_integer(value, uint_value);
5257 module.set_base(uint_value);
5260 module.set_base_is_offset(true);
5261 }
else if (name ==
"l_ld") {
5263 llvm::to_integer(value, uint_value);
5264 module.set_dynamic(uint_value);
5273 bool base_is_offset;
5275 module.get_name(name);
5276 module.get_link_map(lm);
5277 module.get_base(base);
5278 module.get_base_is_offset(base_is_offset);
5279 module.get_dynamic(ld);
5282 "found (link_map:0x%08" PRIx64
", base:0x%08" PRIx64
5283 "[%s], ld:0x%08" PRIx64
", name:'%s')",
5284 lm, base, (base_is_offset ?
"offset" :
"absolute"), ld,
5294 LLDB_LOGF(log,
"found %" PRId32
" modules in total",
5295 (
int)list.
m_list.size());
5299 llvm::Expected<std::string> raw = comm.
ReadExtFeature(
"libraries",
"");
5302 return raw.takeError();
5304 LLDB_LOGF(log,
"parsing: %s", raw->c_str());
5307 if (!doc.
ParseMemory(raw->c_str(), raw->size(),
"noname.xml"))
5308 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5309 "Error reading noname.xml");
5313 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5314 "Error finding library-list xml element");
5318 "library", [log, &list](
const XMLNode &library) ->
bool {
5322 module.set_name(name);
5331 llvm::to_integer(address, address_value);
5332 module.set_base(address_value);
5334 module.set_base_is_offset(false);
5339 bool base_is_offset;
5340 module.get_name(name);
5341 module.get_base(base);
5342 module.get_base_is_offset(base_is_offset);
5344 LLDB_LOGF(log,
"found (base:0x%08" PRIx64
"[%s], name:'%s')", base,
5345 (base_is_offset ?
"offset" :
"absolute"), name.c_str());
5354 LLDB_LOGF(log,
"found %" PRId32
" modules in total",
5355 (
int)list.
m_list.size());
5358 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5359 "Remote libraries not supported");
5366 bool value_is_offset) {
5381 return module_list.takeError();
5387 std::string mod_name;
5390 bool mod_base_is_offset;
5393 valid &= modInfo.
get_name(mod_name);
5394 valid &= modInfo.
get_base(mod_base);
5407 if (module_sp.get())
5408 new_modules.
Append(module_sp);
5411 if (new_modules.
GetSize() > 0) {
5416 for (
size_t i = 0; i < loaded_modules.
GetSize(); ++i) {
5420 for (
size_t j = 0; j < new_modules.
GetSize(); ++j) {
5429 removed_modules.
Append(loaded_module);
5433 loaded_modules.
Remove(removed_modules);
5434 m_process->GetTarget().ModulesDidUnload(removed_modules,
false);
5450 m_process->GetTarget().ModulesDidLoad(new_modules);
5453 return llvm::ErrorSuccess();
5462 std::string file_path = file.
GetPath(
false);
5463 if (file_path.empty())
5484 "Fetching file load address from remote server returned an error");
5494 "Unknown error happened during sending the load address packet");
5515 std::string input = data.str();
5522 size_t found, pos = 0, len = input.length();
5523 while ((found = input.find(
end_delimiter, pos)) != std::string::npos) {
5525 input.substr(pos, found).c_str());
5526 std::string profile_data =
5541 std::map<uint64_t, uint32_t> new_thread_id_to_used_usec_map;
5543 llvm::raw_string_ostream output_stream(output);
5544 llvm::StringRef name, value;
5548 if (name.compare(
"thread_used_id") == 0) {
5550 uint64_t thread_id = threadIDHexExtractor.
GetHexMaxU64(
false, 0);
5552 bool has_used_usec =
false;
5553 uint32_t curr_used_usec = 0;
5554 llvm::StringRef usec_name, usec_value;
5555 uint32_t input_file_pos = profileDataExtractor.
GetFilePos();
5557 if (usec_name ==
"thread_used_usec") {
5558 has_used_usec =
true;
5559 usec_value.getAsInteger(0, curr_used_usec);
5563 profileDataExtractor.
SetFilePos(input_file_pos);
5567 if (has_used_usec) {
5568 uint32_t prev_used_usec = 0;
5569 std::map<uint64_t, uint32_t>::iterator iterator =
5572 prev_used_usec = iterator->second;
5574 uint32_t real_used_usec = curr_used_usec - prev_used_usec;
5576 bool good_first_time =
5577 (prev_used_usec == 0) && (real_used_usec > 250000);
5578 bool good_subsequent_time =
5579 (prev_used_usec > 0) &&
5582 if (good_first_time || good_subsequent_time) {
5586 output_stream << name <<
":";
5588 output_stream << index_id <<
";";
5590 output_stream << usec_name <<
":" << usec_value <<
";";
5593 llvm::StringRef local_name, local_value;
5599 new_thread_id_to_used_usec_map[thread_id] = curr_used_usec;
5602 output_stream << name <<
":" << value <<
";";
5605 output_stream << name <<
":" << value <<
";";
5640 return llvm::createStringError(
5641 llvm::inconvertibleErrorCode(),
5642 llvm::formatv(
"qSaveCore returned an error"));
5647 for (
auto x : llvm::split(response.
GetStringRef(),
';')) {
5648 if (x.consume_front(
"core-path:"))
5654 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5655 "qSaveCore returned no core path");
5658 FileSpec remote_core{llvm::StringRef(path)};
5664 platform.
Unlink(remote_core);
5666 return error.ToError();
5672 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5673 "Unable to send qSaveCore");
5686 "GDBRemoteCommunicationClientBase::%s() received $J packet "
5687 "but was not a StructuredData packet: packet starts with "
5700 json_sp->Dump(json_str,
true);
5703 "ProcessGDBRemote::%s() "
5704 "received Async StructuredData packet: %s",
5705 __FUNCTION__, json_str.
GetData());
5708 "ProcessGDBRemote::%s"
5709 "() received StructuredData packet:"
5719 if (structured_data_sp)
5727 "Tests packet speeds of various sizes to determine "
5728 "the performance characteristics of the GDB remote "
5733 "The number of packets to send of each varying size "
5734 "(default is 1000).",
5737 "The maximum number of bytes to send in a packet. Sizes "
5738 "increase in powers of 2 while the size is less than or "
5739 "equal to this option value. (default 1024).",
5742 "The maximum number of bytes to receive in a packet. Sizes "
5743 "increase in powers of 2 while the size is less than or "
5744 "equal to this option value. (default 1024).",
5747 "Print the output as JSON data for easy parsing.", false, true) {
5767 if (!output_stream_sp)
5768 output_stream_sp =
m_interpreter.GetDebugger().GetAsyncOutputStream();
5771 const uint32_t num_packets =
5773 const uint64_t max_send =
m_max_send.GetOptionValue().GetCurrentValue();
5774 const uint64_t max_recv =
m_max_recv.GetOptionValue().GetCurrentValue();
5775 const bool json =
m_json.GetOptionValue().GetCurrentValue();
5776 const uint64_t k_recv_amount =
5779 num_packets, max_send, max_recv, k_recv_amount, json,
5804 "Dumps the packet history buffer. ", nullptr) {}
5825 interpreter,
"process plugin packet xfer-size",
5826 "Maximum size that lldb will try to read/write one one chunk.",
5837 "amount to be transferred when "
5848 uint64_t user_specified_max = strtoul(packet_size,
nullptr, 10);
5849 if (errno == 0 && user_specified_max != 0) {
5864 "Send a custom packet through the GDB remote "
5865 "protocol and print the answer. "
5866 "The packet header and footer will automatically "
5867 "be added to the packet prior to sending and "
5868 "stripped from the result.",
5879 "'%s' takes a one or more packet content arguments",
5887 for (
size_t i = 0; i < argc; ++i) {
5894 output_strm.
Printf(
" packet: %s\n", packet_cstr);
5895 std::string response_str = std::string(response.
GetStringRef());
5897 if (strstr(packet_cstr,
"qGetProfileData") !=
nullptr) {
5901 if (response_str.empty())
5902 output_strm.
PutCString(
"response: \nerror: UNIMPLEMENTED\n");
5915 "Send a qRcmd packet through the GDB remote protocol "
5916 "and print the response. "
5917 "The argument passed to this command will be hex "
5918 "encoded into a valid 'qRcmd' packet, sent and the "
5919 "response will be printed.") {}
5925 if (command.empty()) {
5942 [&output_strm](llvm::StringRef output) { output_strm << output; });
5945 const std::string &response_str = std::string(response.
GetStringRef());
5947 if (response_str.empty())
5948 output_strm.
PutCString(
"response: \nerror: UNIMPLEMENTED\n");
5960 "Commands that deal with GDB remote packets.",
5989 interpreter,
"process plugin",
5990 "Commands for operating on a ProcessGDBRemote process.",
5991 "process plugin <subcommand> [<subcommand-options>]") {
6002 m_command_sp = std::make_shared<CommandObjectMultiwordProcessGDBRemote>(
6003 GetTarget().GetDebugger().GetCommandInterpreter());
6032 addr_t addr = wp_res_sp->GetLoadAddress();
6033 size_t size = wp_res_sp->GetByteSize();
6035 m_gdb_comm.SendGDBStoppointTypePacket(type, enable, addr, size,
6053 follow_pid = parent_pid;
6054 follow_tid = parent_tid;
6055 detach_pid = child_pid;
6056 detach_tid = child_tid;
6059 follow_pid = child_pid;
6060 follow_tid = child_tid;
6061 detach_pid = parent_pid;
6062 detach_tid = parent_tid;
6067 if (!
m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
6068 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to set pid/tid");
6082 if (!
m_gdb_comm.SetCurrentThread(follow_tid, follow_pid) ||
6083 !
m_gdb_comm.SetCurrentThreadForRun(follow_tid, follow_pid)) {
6084 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to reset pid/tid");
6088 LLDB_LOG(log,
"Detaching process {0}", detach_pid);
6091 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() detach packet send failed: {0}",
6092 error.AsCString() ?
error.AsCString() :
"<unknown error>");
6110 "ProcessGDBRemote::DidFork() called for child_pid: {0}, child_tid {1}",
6111 child_pid, child_tid);
6123 detach_pid = child_pid;
6124 detach_tid = child_tid;
6127 detach_pid =
m_gdb_comm.GetCurrentProcessID();
6133 if (!
m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
6134 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to set pid/tid");
6142 if (!
m_gdb_comm.SetCurrentThread(child_tid, child_pid) ||
6143 !
m_gdb_comm.SetCurrentThreadForRun(child_tid, child_pid)) {
6144 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to reset pid/tid");
6150 LLDB_LOG(log,
"Detaching process {0}", detach_pid);
6154 "ProcessGDBRemote::DidFork() detach packet send failed: {0}",
6155 error.AsCString() ?
error.AsCString() :
"<unknown error>");
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.
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
#define LLDB_LOGV(log,...)
#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 > ®nums, 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)
Options * GetOptions() override
OptionGroupBoolean m_json
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectProcessGDBRemoteSpeedTest() override=default
OptionGroupOptions m_option_group
OptionGroupUInt64 m_max_send
OptionGroupUInt64 m_num_packets
CommandObjectProcessGDBRemoteSpeedTest(CommandInterpreter &interpreter)
OptionGroupUInt64 m_max_recv
static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch)
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.
bool IsValid() const
Tests if this ArchSpec is valid.
void Clear()
Clears the object state.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool SetTriple(const llvm::Triple &triple)
Architecture triple setter.
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
A command line argument class.
static lldb::Encoding StringToEncoding(llvm::StringRef s, lldb::Encoding fail_value=lldb::eEncodingInvalid)
static uint32_t StringToGenericRegister(llvm::StringRef s)
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
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.
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
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)
friend class CommandInterpreter
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
Stream & GetOutputStream()
A uniqued constant string class.
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.
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
static const EventDataBytes * GetEventDataFromEvent(const Event *event_ptr)
size_t GetByteSize() const
std::vector< Enumerator > Enumerators
const Enumerators & GetEnumerators() const
void DumpToLog(Log *log) const
const FileSpec & GetFileSpec() const
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
void AppendPathComponent(llvm::StringRef component)
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
void Clear()
Clears the object state.
void Resolve(llvm::SmallVectorImpl< char > &path)
Resolve path to make it canonical.
static const char * DEV_NULL
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()
ValueType Get() const
Get accessor for all flags.
static Environment GetEnvironment()
static void Kill(lldb::pid_t pid, int signo)
static lldb::ListenerSP MakeListener(const char *name)
bool get_name(std::string &out) const
bool get_link_map(lldb::addr_t &out) const
bool get_base_is_offset(bool &out) const
bool get_base(lldb::addr_t &out) const
void add(const LoadedModuleInfo &mod)
std::vector< LoadedModuleInfo > m_list
void PutCString(const char *cstr)
void void void void void Warning(const char *fmt,...) __attribute__((format(printf
lldb::offset_t GetBlocksize() const
OptionalBool GetFlash() const
A collection class for Module objects.
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
A class that describes an executable image and its associated object and symbol files.
virtual ObjectFile * GetObjectFile()
Get the object file representation for the current architecture.
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
A plug-in interface definition class for object file parsers.
@ eTypeExecutable
A normal executable.
@ eTypeDebugInfo
An object file that contains only debug information.
@ eTypeStubLibrary
A library that can be linked against but not used for execution.
@ eTypeObjectFile
An intermediate object file.
@ eTypeDynamicLinker
The platform's dynamic linker executable.
@ eTypeCoreFile
A core file that has a checkpoint of a program's execution state.
@ eTypeSharedLibrary
A shared library that can be used during execution.
@ eTypeJIT
JIT code that has symbols, sections and possibly debug info.
A command line option parsing protocol class.
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool CreateSettingForProcessPlugin(Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, llvm::StringRef description, bool is_global_property)
static lldb::OptionValuePropertiesSP GetSettingForProcessPlugin(Debugger &debugger, llvm::StringRef setting_name)
static bool UnregisterPlugin(ABICreateInstance create_callback)
bool GetIgnoreExisting() const
bool GetDetachOnError() const
bool GetWaitForLaunch() const
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
lldb::pid_t GetProcessID() const
FileSpec & GetExecutableFile()
uint32_t GetUserID() const
Environment & GetEnvironment()
void SetUserID(uint32_t uid)
const char * GetLaunchEventData() const
const FileAction * GetFileActionForFD(int fd) const
void SetMonitorProcessCallback(Host::MonitorChildProcessCallback callback)
void SetLaunchInSeparateProcessGroup(bool separate)
const FileSpec & GetWorkingDirectory() const
Args GetExtraStartupCommands() const
FollowForkMode GetFollowForkMode() const
std::chrono::seconds GetInterruptTimeout() const
A plug-in interface definition class for debugging a process.
StopPointSiteList< lldb_private::BreakpointSite > & GetBreakpointSiteList()
virtual Status DisableSoftwareBreakpoint(BreakpointSite *bp_site)
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
ThreadList & GetThreadList()
void SetAddressableBitMasks(AddressableBits bit_masks)
Process(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
Construct with a shared pointer to a target, and the Process listener.
lldb::StateType GetPrivateState()
void SetUnixSignals(lldb::UnixSignalsSP &&signals_sp)
virtual void ModulesDidLoad(ModuleList &module_list)
void ResumePrivateStateThread()
void MapSupportedStructuredDataPlugins(const StructuredData::Array &supported_type_names)
Loads any plugins associated with asynchronous structured data and maps the relevant supported type n...
virtual SystemRuntime * GetSystemRuntime()
Get the system runtime plug-in for this process.
std::map< uint64_t, uint32_t > m_thread_id_to_index_id_map
lldb::DynamicLoaderUP m_dyld_up
virtual Status WriteObjectFile(std::vector< ObjectFile::LoadableData > entries)
StopPointSiteList< lldb_private::WatchpointResource > m_watchpoint_resource_list
Watchpoint resources currently in use.
void AppendSTDOUT(const char *s, size_t len)
bool HasAssignedIndexIDToThread(uint64_t sb_thread_id)
lldb::ByteOrder GetByteOrder() const
void UpdateThreadListIfNeeded()
bool IsValid() const
Return whether this object is valid (i.e.
virtual void DidExec()
Called after a process re-execs itself.
void BroadcastAsyncProfileData(const std::string &one_profile_data)
lldb::UnixSignalsSP m_unix_signals_sp
lldb::tid_t m_interrupt_tid
virtual Status EnableSoftwareBreakpoint(BreakpointSite *bp_site)
bool RouteAsyncStructuredData(const StructuredData::ObjectSP object_sp)
Route the incoming structured data dictionary to the right plugin.
virtual bool IsAlive()
Check if a process is still alive.
ThreadList m_thread_list_real
The threads for this process as are known to the protocol we are debugging with.
ThreadSafeValue< lldb::StateType > m_public_state
void SetID(lldb::pid_t new_pid)
Sets the stored pid.
uint32_t AssignIndexIDToThread(uint64_t thread_id)
virtual bool SetExitStatus(int exit_status, llvm::StringRef exit_string)
Set accessor for the process exit status (return code).
MemoryCache m_memory_cache
uint32_t GetAddressByteSize() const
uint32_t GetStopID() const
void SetPrivateState(lldb::StateType state)
void SetSTDIOFileDescriptor(int file_descriptor)
Associates a file descriptor with the process' STDIO handling and configures an asynchronous reading ...
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
ThreadList m_thread_list
The threads for this process as the user will see them.
const lldb::UnixSignalsSP & GetUnixSignals()
std::weak_ptr< Target > m_target_wp
The target that owns this process.
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.
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
Locate the memory region that contains load_addr.
friend class DynamicLoader
size_t GetSoftwareBreakpointTrapOpcode(BreakpointSite *bp_site)
ThreadedCommunication m_stdio_communication
Target & GetTarget()
Get the target object pointer for this module.
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)
shared_fd_t GetSendableFD()
static llvm::Expected< Pair > CreatePair(std::optional< SocketProtocol > protocol=std::nullopt)
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
bool Success() const
Test for success condition.
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
bool HardwareRequired() const
int PutEscapedBytes(const void *s, size_t src_len)
Output a block of data to the stream performing GDB-remote escaping.
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.
void Format(const char *format, Args &&... args)
size_t PutStringAsRawHex8(llvm::StringRef s)
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
size_t PutBytesAsRawHex8(const void *src, size_t src_len, lldb::ByteOrder src_byte_order=lldb::eByteOrderInvalid, lldb::ByteOrder dst_byte_order=lldb::eByteOrderInvalid)
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
Dictionary * GetAsDictionary()
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()
Debugger & GetDebugger() const
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
lldb::PlatformSP GetPlatform()
const ArchSpec & GetArchitecture() const
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
bool MergeArchitecture(const ArchSpec &arch_spec)
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.
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...
XMLNode GetRootElement(const char *required_name=nullptr)
bool ParseMemory(const char *xml, size_t xml_length, const char *url="untitled.xml")
void ForEachChildElement(NodeCallback const &callback) const
llvm::StringRef GetName() const
bool GetElementText(std::string &text) const
std::string GetAttributeValue(const char *name, const char *fail_value=nullptr) const
void ForEachChildElementWithName(const char *name, NodeCallback const &callback) const
XMLNode FindFirstChildElementWithName(const char *name) const
void ForEachAttribute(AttributeCallback const &callback) const
@ eBroadcastBitRunPacketSent
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)
bool GetQXferLibrariesSVR4ReadSupported()
bool GetQXferLibrariesReadSupported()
void DumpHistory(Stream &strm)
Status FlashErase(lldb::addr_t addr, size_t size)
Status DisableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true) override
friend class ThreadGDBRemote
DataExtractor GetAuxvData() override
GDBRemoteCommunicationClient & GetGDBRemote()
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.
void KillDebugserverProcess()
Status DoDestroy() override
Status LaunchAndConnectToDebugserver(const ProcessInfo &process_info)
StructuredData::ObjectSP m_jstopinfo_sp
virtual std::shared_ptr< ThreadGDBRemote > CreateThread(lldb::tid_t tid)
StructuredData::ObjectSP m_jthreadsinfo_sp
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.
Broadcaster m_async_broadcaster
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.
FlashRangeVector m_erased_flash_ranges
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.
tid_sig_collection m_continue_C_tids
bool HasErased(FlashRange range)
std::optional< bool > DoGetWatchpointReportedAfter() override
Provide an override value in the subclass for lldb's CPU-based logic for whether watchpoint exception...
Status WillLaunchOrAttach()
std::optional< uint32_t > GetWatchpointSlotCount() override
Get the number of watchpoints supported by this target.
GDBRemoteCommunicationClient m_gdb_comm
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.
friend class GDBRemoteCommunicationClient
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 ®ion_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
void DidForkSwitchSoftwareBreakpoints(bool enable)
void DidLaunchOrAttach(ArchSpec &process_arch)
size_t UpdateThreadIDsFromStopReplyThreadsValue(llvm::StringRef value)
FlashRangeVector::Entry FlashRange
Status GetFileLoadAddress(const FileSpec &file, bool &is_loaded, lldb::addr_t &load_addr) override
Try to find the load address of a file.
MMapMap m_addr_to_mmap_size
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 > ®isters, const ArchSpec &arch_to_use)
Status UpdateAutomaticSignalFiltering() override
void HandleAsyncStdout(llvm::StringRef out) override
static llvm::StringRef GetPluginDescriptionStatic()
tid_sig_collection m_continue_S_tids
bool m_allow_flash_writes
lldb::BreakpointSP m_thread_create_bp_sp
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.
bool m_waiting_for_attach
llvm::Error GetGDBServerRegisterInfo(ArchSpec &arch)
Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a process ID.
void HandleStopReply() override
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.
bool UpdateThreadIDList()
static llvm::StringRef GetPluginNameStatic()
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.
uint64_t m_last_signals_version
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.
Status SendEventData(const char *data) override
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.
static void DebuggerInitialize(Debugger &debugger)
tid_collection m_thread_ids
Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a partial process name.
GDBRemoteDynamicRegisterInfoSP m_register_info_sp
std::string m_partial_profile_data
StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos_sender(StructuredData::ObjectSP args)
void MaybeLoadExecutableModule()
std::vector< lldb::addr_t > m_thread_pcs
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)
std::recursive_mutex m_async_thread_state_mutex
Status ConnectToDebugserver(llvm::StringRef host_port)
void SetUnixSignals(const lldb::UnixSignalsSP &signals_sp)
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
uint64_t m_remote_stub_max_memory_size
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.
int64_t m_breakpoint_pc_offset
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.
lldb::CommandObjectSP m_command_sp
llvm::Expected< llvm::SmallVector< llvm::MutableArrayRef< uint8_t > > > ParseMultiMemReadPacket(llvm::StringRef response_str, llvm::MutableArrayRef< uint8_t > buffer, unsigned expected_num_ranges)
void DidVForkDone() override
Called after reported vfork completion.
std::string HarmonizeThreadIdsForProfileData(StringExtractorGDBRemote &inputStringExtractor)
bool GetGDBServerRegisterInfoXMLAndProcess(ArchSpec &arch_to_use, std::string xml_filename, std::vector< DynamicRegisterInfo::Register > ®isters)
bool m_use_g_packet_for_reading
Status DoWillAttachToProcessWithName(const char *process_name, bool wait_for_launch) override
Called before attaching to a process.
static std::chrono::seconds GetPacketTimeout()
lldb::ListenerSP m_async_listener_sp
std::pair< std::string, std::string > ModuleCacheKey
bool CalculateThreadStopInfo(ThreadGDBRemote *thread)
tid_collection m_continue_c_tids
bool SupportsMemoryTagging() override
Check whether the process supports memory tagging.
void BuildDynamicRegisterInfo(bool force)
tid_collection m_continue_s_tids
size_t UpdateThreadPCsFromStopReplyThreadsValue(llvm::StringRef value)
~ProcessGDBRemote() override
llvm::VersionTuple GetHostOSVersion() override
Sometimes the connection to a process can detect the host OS version that the process is running on.
lldb::tid_t m_initial_tid
llvm::Expected< StringExtractorGDBRemote > SendMultiMemReadPacket(llvm::ArrayRef< Range< lldb::addr_t, size_t > > ranges)
std::map< uint64_t, uint32_t > m_thread_id_to_used_usec_map
Status DoWriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type, const std::vector< uint8_t > &tags) override
Does the final operation to write memory tags.
llvm::Expected< std::vector< uint8_t > > TraceGetBinaryData(const TraceGetBinaryDataRequest &request) override
Get binary data given a trace technology and a data identifier.
Status EnableBreakpointSite(BreakpointSite *bp_site) override
void ModulesDidLoad(ModuleList &module_list) override
ProcessGDBRemote(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
uint32_t m_vfork_in_progress_count
@ eBroadcastBitAsyncContinue
@ eBroadcastBitAsyncThreadShouldExit
@ eBroadcastBitAsyncThreadDidExit
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)
lldb::thread_result_t AsyncThread()
Status WriteObjectFile(std::vector< ObjectFile::LoadableData > entries) override
llvm::Error LoadModules() override
Sometimes processes know how to retrieve and load shared libraries.
uint64_t m_max_memory_size
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
llvm::VersionTuple GetHostMacCatalystVersion() override
void DidForkSwitchHardwareTraps(bool enable)
HostThread m_async_thread
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.
std::atomic< lldb::pid_t > m_debugserver_pid
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_INVALID_WATCH_ID
#define LLDB_INVALID_SIGNAL_NUMBER
#define LLDB_INVALID_THREAD_ID
#define UNUSED_IF_ASSERT_DISABLED(x)
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_REGNUM
#define LLDB_INVALID_PROCESS_ID
#define LLDB_REGNUM_GENERIC_PC
lldb::ByteOrder InlHostByteOrder()
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.
bool InferiorCallMunmap(Process *proc, lldb::addr_t addr, lldb::addr_t length)
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.
const char * GetPermissionsAsCString(uint32_t permissions)
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
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.
@ eFormatVoid
Do not print this.
@ eFormatComplex
Floating point complex type.
@ eFormatHexFloat
ISO C99 hex float string.
@ 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,...
@ eFormatCharPrintable
Only printable characters, '.' if not printable.
@ eFormatComplexInteger
Integer complex type.
@ eFormatFloat128
Disambiguate between 128-bit long double (which uses eFormatFloat) and __float128 (which uses eFormat...
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.
@ eEncodingVector
vector registers
@ eEncodingUint
unsigned integer
std::shared_ptr< lldb_private::Event > EventSP
@ eReturnStatusSuccessFinishResult
@ eArgTypeUnsignedInteger
std::shared_ptr< lldb_private::Watchpoint > WatchpointSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::WatchpointResource > WatchpointResourceSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
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.
const RegisterFlags * flags_type
std::vector< uint32_t > value_regs
std::vector< uint32_t > invalidate_regs
static Status ToFormat(const char *s, lldb::Format &format, size_t *byte_size_ptr)
BaseType GetRangeBase() const
SizeType GetByteSize() const
void SetRangeBase(BaseType b)
Set the start value for the range, and keep the same size.
BaseType GetRangeEnd() const
void SetByteSize(SizeType s)
jLLDBTraceGetBinaryData gdb-remote packet
jLLDBTraceStop gdb-remote packet