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) {
214 if (crash_file_path ==
nullptr)
215 process_sp = std::shared_ptr<ProcessGDBRemote>(
234 bool plugin_specified_by_name) {
235 if (plugin_specified_by_name)
239 Module *exe_module = target_sp->GetExecutableModulePointer();
243 switch (exe_objfile->
GetType()) {
267 :
Process(target_sp, listener_sp),
271 Listener::MakeListener(
"lldb.process.gdb-remote.async-listener")),
281 "async thread should exit");
283 "async thread continue");
285 "async thread did exit");
289 const uint32_t async_event_mask =
295 "ProcessGDBRemote::%s failed to listen for "
296 "m_async_broadcaster events",
300 const uint64_t timeout_seconds =
302 if (timeout_seconds > 0)
303 m_gdb_comm.SetPacketTimeout(std::chrono::seconds(timeout_seconds));
327std::shared_ptr<ThreadGDBRemote>
329 return std::make_shared<ThreadGDBRemote>(*
this, tid);
333 const FileSpec &target_definition_fspec) {
339 if (module_object_sp) {
342 "gdb-server-target-definition",
error));
344 if (target_definition_sp) {
346 target_definition_sp->GetValueForKey(
"host-info"));
348 if (
auto host_info_dict = target_object->GetAsDictionary()) {
350 host_info_dict->GetValueForKey(
"triple");
351 if (
auto triple_string_value = triple_value->GetAsString()) {
352 std::string triple_string =
353 std::string(triple_string_value->GetValue());
354 ArchSpec host_arch(triple_string.c_str());
363 target_definition_sp->GetValueForKey(
"breakpoint-pc-offset");
364 if (breakpoint_pc_offset_value) {
365 if (
auto breakpoint_pc_int_value =
366 breakpoint_pc_offset_value->GetAsSignedInteger())
371 *target_definition_sp,
GetTarget().GetArchitecture()) > 0) {
380 const llvm::StringRef &comma_separated_register_numbers,
381 std::vector<uint32_t> ®nums,
int base) {
383 for (llvm::StringRef x : llvm::split(comma_separated_register_numbers,
',')) {
385 if (llvm::to_integer(x, reg, base))
386 regnums.push_back(reg);
388 return regnums.size();
400 const auto host_packet_timeout =
m_gdb_comm.GetHostDefaultPacketTimeout();
401 if (host_packet_timeout > std::chrono::seconds(0)) {
419 if (target_definition_fspec) {
425 target_definition_fspec.
GetPath() +
436 if (remote_process_arch.
IsValid())
437 arch_to_use = remote_process_arch;
439 arch_to_use = remote_host_arch;
442 arch_to_use = target_arch;
448 std::vector<DynamicRegisterInfo::Register> registers;
449 uint32_t reg_num = 0;
453 const int packet_len =
454 ::snprintf(packet,
sizeof(packet),
"qRegisterInfo%x", reg_num);
455 assert(packet_len < (
int)
sizeof(packet));
458 if (
m_gdb_comm.SendPacketAndWaitForResponse(packet, response) ==
462 llvm::StringRef name;
463 llvm::StringRef value;
467 if (name ==
"name") {
469 }
else if (name ==
"alt-name") {
471 }
else if (name ==
"bitsize") {
472 if (!value.getAsInteger(0, reg_info.
byte_size))
474 }
else if (name ==
"offset") {
476 }
else if (name ==
"encoding") {
480 }
else if (name ==
"format") {
484 llvm::StringSwitch<Format>(value)
526 }
else if (name ==
"set") {
528 }
else if (name ==
"gcc" || name ==
"ehframe") {
530 }
else if (name ==
"dwarf") {
532 }
else if (name ==
"generic") {
534 }
else if (name ==
"container-regs") {
536 }
else if (name ==
"invalidate-regs") {
542 registers.push_back(reg_info);
551 if (registers.empty())
566 bool wait_for_launch) {
598 if (
m_gdb_comm.GetProcessArchitecture().IsValid()) {
601 if (
m_gdb_comm.GetHostArchitecture().IsValid()) {
612 "Process %" PRIu64
" was reported after connecting to "
613 "'%s', but state was not stopped: %s",
617 "Process %" PRIu64
" was reported after connecting to '%s', "
618 "but no stop reply packet was received",
619 pid, remote_url.str().c_str());
623 "ProcessGDBRemote::%s pid %" PRIu64
624 ": normalizing target architecture initial triple: %s "
625 "(GetTarget().GetArchitecture().IsValid() %s, "
626 "m_gdb_comm.GetHostArchitecture().IsValid(): %s)",
627 __FUNCTION__,
GetID(),
628 GetTarget().GetArchitecture().GetTriple().getTriple().c_str(),
630 m_gdb_comm.GetHostArchitecture().IsValid() ?
"true" :
"false");
636 if (
m_gdb_comm.GetProcessArchitecture().IsValid())
643 "ProcessGDBRemote::%s pid %" PRIu64
644 ": normalized target architecture triple: %s",
645 __FUNCTION__,
GetID(),
646 GetTarget().GetArchitecture().GetTriple().getTriple().c_str());
663 LLDB_LOGF(log,
"ProcessGDBRemote::%s() entered", __FUNCTION__);
665 uint32_t launch_flags = launch_info.
GetFlags().
Get();
689 if (stdin_file_spec || stdout_file_spec || stderr_file_spec)
691 "ProcessGDBRemote::%s provided with STDIO paths via "
692 "launch_info: stdin=%s, stdout=%s, stderr=%s",
694 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
695 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
696 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
699 "ProcessGDBRemote::%s no STDIO paths given via launch_info",
703 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
704 if (stdin_file_spec || disable_stdio) {
719 if (
error.Success()) {
721 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
726 if (!stdin_file_spec)
728 FileSpec::Style::native);
729 if (!stdout_file_spec)
731 FileSpec::Style::native);
732 if (!stderr_file_spec)
734 FileSpec::Style::native);
735 }
else if (platform_sp && platform_sp->IsHost()) {
740 if ((!stdin_file_spec || !stdout_file_spec || !stderr_file_spec) &&
744 if (!stdin_file_spec)
745 stdin_file_spec = secondary_name;
747 if (!stdout_file_spec)
748 stdout_file_spec = secondary_name;
750 if (!stderr_file_spec)
751 stderr_file_spec = secondary_name;
755 "ProcessGDBRemote::%s adjusted STDIO paths for local platform "
756 "(IsHost() is true) using secondary: stdin=%s, stdout=%s, "
759 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
760 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
761 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
765 "ProcessGDBRemote::%s final STDIO paths after all "
766 "adjustments: stdin=%s, stdout=%s, stderr=%s",
768 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
769 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
770 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
774 if (stdout_file_spec)
776 if (stderr_file_spec)
779 m_gdb_comm.SetDisableASLR(launch_flags & eLaunchFlagDisableASLR);
780 m_gdb_comm.SetDetachOnError(launch_flags & eLaunchFlagDetachOnError);
783 GetTarget().GetArchitecture().GetArchitectureName());
786 if (launch_event_data !=
nullptr && *launch_event_data !=
'\0')
787 m_gdb_comm.SendLaunchEventDataPacket(launch_event_data);
799 std::chrono::seconds(10));
806 if (llvm::Error err =
m_gdb_comm.LaunchProcess(args)) {
809 llvm::fmt_consume(std::move(err)));
816 LLDB_LOGF(log,
"failed to connect to debugserver: %s",
838 if (!disable_stdio) {
844 LLDB_LOGF(log,
"failed to connect to debugserver: %s",
error.AsCString());
854 if (!connect_url.empty()) {
855 LLDB_LOGF(log,
"ProcessGDBRemote::%s Connecting to %s", __FUNCTION__,
856 connect_url.str().c_str());
857 std::unique_ptr<ConnectionFileDescriptor> conn_up(
860 const uint32_t max_retry_count = 50;
861 uint32_t retry_count = 0;
870 if (retry_count >= max_retry_count)
873 std::this_thread::sleep_for(std::chrono::milliseconds(100));
897 m_gdb_comm.GetListThreadsInStopReplySupported();
904 auto handle_cmds = [&] (
const Args &args) ->
void {
908 entry.c_str(), response);
914 handle_cmds(platform_sp->GetExtraStartupCommands());
931 if (remote_process_arch.
IsValid()) {
932 process_arch = remote_process_arch;
933 LLDB_LOG(log,
"gdb-remote had process architecture, using {0} {1}",
937 process_arch =
m_gdb_comm.GetHostArchitecture();
939 "gdb-remote did not have process architecture, using gdb-remote "
940 "host architecture {0} {1}",
951 LLDB_LOG(log,
"analyzing target arch, currently {0} {1}",
963 if ((process_arch.
GetMachine() == llvm::Triple::arm ||
964 process_arch.
GetMachine() == llvm::Triple::thumb) &&
965 process_arch.
GetTriple().getVendor() == llvm::Triple::Apple) {
968 "remote process is ARM/Apple, "
969 "setting target arch to {0} {1}",
974 const llvm::Triple &remote_triple = process_arch.
GetTriple();
975 llvm::Triple new_target_triple = target_arch.
GetTriple();
976 if (new_target_triple.getVendorName().size() == 0) {
977 new_target_triple.setVendor(remote_triple.getVendor());
979 if (new_target_triple.getOSName().size() == 0) {
980 new_target_triple.setOS(remote_triple.getOS());
982 if (new_target_triple.getEnvironmentName().size() == 0)
983 new_target_triple.setEnvironment(remote_triple.getEnvironment());
986 ArchSpec new_target_arch = target_arch;
987 new_target_arch.
SetTriple(new_target_triple);
993 "final target arch after adjustments for remote architecture: "
1012 m_gdb_comm.GetSupportedStructuredDataPlugins())
1021 if (platform_sp && platform_sp->IsConnected())
1033 UUID standalone_uuid;
1035 bool standalone_value_is_offset;
1036 if (
m_gdb_comm.GetProcessStandaloneBinary(standalone_uuid, standalone_value,
1037 standalone_value_is_offset)) {
1040 if (standalone_uuid.
IsValid()) {
1041 const bool force_symbol_search =
true;
1042 const bool notify =
true;
1043 const bool set_address_in_target =
true;
1044 const bool allow_memory_image_last_resort =
false;
1046 this,
"", standalone_uuid, standalone_value,
1047 standalone_value_is_offset, force_symbol_search, notify,
1048 set_address_in_target, allow_memory_image_last_resort);
1060 std::vector<addr_t> bin_addrs =
m_gdb_comm.GetProcessStandaloneBinaries();
1061 if (bin_addrs.size()) {
1063 const bool value_is_slide =
false;
1064 for (
addr_t addr : bin_addrs) {
1065 const bool notify =
true;
1072 .LoadPlatformBinaryAndSetup(
this, addr, notify))
1075 const bool force_symbol_search =
true;
1076 const bool set_address_in_target =
true;
1077 const bool allow_memory_image_last_resort =
false;
1080 this, llvm::StringRef(), uuid, addr, value_is_slide,
1081 force_symbol_search, notify, set_address_in_target,
1082 allow_memory_image_last_resort);
1092 std::optional<QOffsets> offsets =
m_gdb_comm.GetQOffsets();
1097 size_t(llvm::count(offsets->offsets, offsets->offsets[0])) ==
1098 offsets->offsets.size();
1102 bool changed =
false;
1103 module_sp->SetLoadAddress(
GetTarget(), offsets->offsets[0],
1108 m_process->GetTarget().ModulesDidLoad(list);
1122 LLDB_LOGF(log,
"ProcessGDBRemote::%s()", __FUNCTION__);
1128 if (
error.Success()) {
1132 const int packet_len =
1133 ::snprintf(packet,
sizeof(packet),
"vAttach;%" PRIx64, attach_pid);
1136 std::make_shared<EventDataBytes>(llvm::StringRef(packet, packet_len));
1151 if (process_name && process_name[0]) {
1153 if (
error.Success()) {
1159 if (!
m_gdb_comm.GetVAttachOrWaitSupported()) {
1174 auto data_sp = std::make_shared<EventDataBytes>(packet.
GetString());
1195llvm::Expected<std::string>
1200llvm::Expected<std::vector<uint8_t>>
1212 process_arch.
Clear();
1227 return m_gdb_comm.GetReverseStepSupported() ||
1234 LLDB_LOGF(log,
"ProcessGDBRemote::Resume(%s)",
1239 if (listener_sp->StartListeningForEvents(
1241 listener_sp->StartListeningForEvents(
1248 bool continue_packet_error =
false;
1262 std::string pid_prefix;
1264 pid_prefix = llvm::formatv(
"p{0:x-}.",
GetID());
1266 if (num_continue_c_tids == num_threads ||
1271 continue_packet.
Format(
"vCont;c:{0}-1", pid_prefix);
1279 for (tid_collection::const_iterator
1282 t_pos != t_end; ++t_pos)
1283 continue_packet.
Format(
";c:{0}{1:x-}", pid_prefix, *t_pos);
1285 continue_packet_error =
true;
1290 for (tid_sig_collection::const_iterator
1293 s_pos != s_end; ++s_pos)
1294 continue_packet.
Format(
";C{0:x-2}:{1}{2:x-}", s_pos->second,
1295 pid_prefix, s_pos->first);
1297 continue_packet_error =
true;
1302 for (tid_collection::const_iterator
1305 t_pos != t_end; ++t_pos)
1306 continue_packet.
Format(
";s:{0}{1:x-}", pid_prefix, *t_pos);
1308 continue_packet_error =
true;
1313 for (tid_sig_collection::const_iterator
1316 s_pos != s_end; ++s_pos)
1317 continue_packet.
Format(
";S{0:x-2}:{1}{2:x-}", s_pos->second,
1318 pid_prefix, s_pos->first);
1320 continue_packet_error =
true;
1323 if (continue_packet_error)
1324 continue_packet.
Clear();
1327 continue_packet_error =
true;
1333 if (num_continue_c_tids > 0) {
1334 if (num_continue_c_tids == num_threads) {
1338 continue_packet_error =
false;
1339 }
else if (num_continue_c_tids == 1 && num_continue_C_tids == 0 &&
1340 num_continue_s_tids == 0 && num_continue_S_tids == 0) {
1344 continue_packet_error =
false;
1348 if (continue_packet_error && num_continue_C_tids > 0) {
1349 if ((num_continue_C_tids + num_continue_c_tids) == num_threads &&
1350 num_continue_C_tids > 0 && num_continue_s_tids == 0 &&
1351 num_continue_S_tids == 0) {
1354 if (num_continue_C_tids > 1) {
1359 if (num_continue_C_tids > 1) {
1360 continue_packet_error =
false;
1363 continue_packet_error =
true;
1366 if (!continue_packet_error)
1370 continue_packet_error =
false;
1373 if (!continue_packet_error) {
1375 continue_packet.
Printf(
"C%2.2x", continue_signo);
1380 if (continue_packet_error && num_continue_s_tids > 0) {
1381 if (num_continue_s_tids == num_threads) {
1387 continue_packet_error =
false;
1388 }
else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1389 num_continue_s_tids == 1 && num_continue_S_tids == 0) {
1393 continue_packet_error =
false;
1397 if (!continue_packet_error && num_continue_S_tids > 0) {
1398 if (num_continue_S_tids == num_threads) {
1401 continue_packet_error =
false;
1402 if (num_continue_S_tids > 1) {
1403 for (
size_t i = 1; i < num_threads; ++i) {
1405 continue_packet_error =
true;
1408 if (!continue_packet_error) {
1411 continue_packet.
Printf(
"S%2.2x", step_signo);
1413 }
else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1414 num_continue_s_tids == 0 && num_continue_S_tids == 1) {
1418 continue_packet_error =
false;
1424 if (num_continue_s_tids > 0 || num_continue_S_tids > 0) {
1426 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: target does not "
1427 "support reverse-stepping");
1429 "target does not support reverse-stepping");
1432 if (num_continue_S_tids > 0) {
1435 "ProcessGDBRemote::DoResume: Signals not supported in reverse");
1437 "can't deliver signals while running in reverse");
1440 if (num_continue_s_tids > 1) {
1441 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: can't step multiple "
1442 "threads in reverse");
1444 "can't step multiple threads while reverse-stepping");
1450 if (!
m_gdb_comm.GetReverseContinueSupported()) {
1451 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: target does not "
1452 "support reverse-continue");
1454 "target does not support reverse execution of processes");
1457 if (num_continue_C_tids > 0) {
1460 "ProcessGDBRemote::DoResume: Signals not supported in reverse");
1462 "can't deliver signals while running in reverse");
1470 continue_packet_error =
false;
1473 if (continue_packet_error) {
1475 "can't make continue packet for this resume");
1480 "Trying to resume but the async thread is dead.");
1481 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: Trying to resume but the "
1482 "async thread is dead.");
1487 std::make_shared<EventDataBytes>(continue_packet.
GetString());
1490 if (!listener_sp->GetEvent(event_sp, ResumeTimeout())) {
1492 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: Resume timed out.");
1495 "Broadcast continue, but the async thread was "
1496 "killed before we got an ack back.");
1498 "ProcessGDBRemote::DoResume: Broadcast continue, but the "
1499 "async thread was killed before we got an ack back.");
1515 llvm::StringRef value) {
1521 auto pid_tid = thread_ids.
GetPidTid(pid);
1522 if (pid_tid && pid_tid->first == pid) {
1528 }
while (thread_ids.
GetChar() ==
',');
1534 llvm::StringRef value) {
1536 for (llvm::StringRef x : llvm::split(value,
',')) {
1538 if (llvm::to_integer(x,
pc, 16))
1550 if (thread_infos && thread_infos->
GetSize() > 0) {
1574 const std::string &stop_info_str = std::string(stop_info.
GetStringRef());
1577 const size_t thread_pcs_pos = stop_info_str.find(
";thread-pcs:");
1578 if (thread_pcs_pos != std::string::npos) {
1579 const size_t start = thread_pcs_pos + strlen(
";thread-pcs:");
1580 const size_t end = stop_info_str.find(
';', start);
1581 if (end != std::string::npos) {
1582 std::string value = stop_info_str.substr(start, end - start);
1587 const size_t threads_pos = stop_info_str.find(
";threads:");
1588 if (threads_pos != std::string::npos) {
1589 const size_t start = threads_pos + strlen(
";threads:");
1590 const size_t end = stop_info_str.find(
';', start);
1591 if (end != std::string::npos) {
1592 std::string value = stop_info_str.substr(start, end - start);
1600 bool sequence_mutex_unavailable =
false;
1602 if (sequence_mutex_unavailable) {
1617 if (num_thread_ids == 0) {
1623 ThreadList old_thread_list_copy(old_thread_list);
1624 if (num_thread_ids > 0) {
1625 for (
size_t i = 0; i < num_thread_ids; ++i) {
1631 LLDB_LOGV(log,
"Making new thread: {0} for thread ID: {1:x}.",
1632 thread_sp.get(), thread_sp->GetID());
1634 LLDB_LOGV(log,
"Found old thread: {0} for thread ID: {1:x}.",
1635 thread_sp.get(), thread_sp->GetID());
1645 size_t old_num_thread_ids = old_thread_list_copy.
GetSize(
false);
1646 for (
size_t i = 0; i < old_num_thread_ids; i++) {
1648 if (old_thread_sp) {
1649 lldb::tid_t old_thread_id = old_thread_sp->GetProtocolID();
1664 uint32_t pc_regnum = reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1677 if (thread_infos_sp) {
1681 const size_t n = thread_infos->
GetSize();
1682 for (
size_t i = 0; i < n; ++i) {
1688 if (tid == thread->GetID())
1717 if (
GetGDBRemote().GetThreadStopInfo(thread->GetProtocolID(), stop_packet))
1727 for (
const auto &pair : expedited_register_map) {
1731 reg_value_extractor.
GetHexBytes(buffer_sp->GetData(),
'\xcc');
1732 uint32_t lldb_regnum = gdb_reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1740 uint8_t signo,
const std::string &thread_name,
const std::string &reason,
1741 const std::string &description, uint32_t exc_type,
1742 const std::vector<addr_t> &exc_data,
addr_t thread_dispatch_qaddr,
1743 bool queue_vars_valid,
1745 LazyBool associated_with_dispatch_queue,
addr_t dispatch_queue_t,
1746 std::string &queue_name,
QueueKind queue_kind, uint64_t queue_serial) {
1770 reg_ctx_sp->InvalidateIfNeeded(
true);
1778 if (reg_ctx_sp->ReconfigureRegisterInfo()) {
1781 reg_ctx_sp->InvalidateAllRegisters();
1788 thread_sp->SetName(thread_name.empty() ?
nullptr : thread_name.c_str());
1793 if (queue_vars_valid)
1794 gdb_thread->
SetQueueInfo(std::move(queue_name), queue_kind, queue_serial,
1795 dispatch_queue_t, associated_with_dispatch_queue);
1806 StopInfoSP current_stop_info_sp = thread_sp->GetPrivateStopInfo(
false);
1808 current_stop_info_sp) {
1809 thread_sp->SetStopInfo(current_stop_info_sp);
1813 if (!thread_sp->StopInfoIsUpToDate()) {
1816 addr_t pc = thread_sp->GetRegisterContext()->GetPC();
1818 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
pc);
1819 if (bp_site_sp && bp_site_sp->IsEnabled())
1820 thread_sp->SetThreadStoppedAtUnexecutedBP(
pc);
1822 if (exc_type != 0) {
1830 if (interrupt_thread)
1831 thread_sp = interrupt_thread;
1833 const size_t exc_data_size = exc_data.size();
1834 thread_sp->SetStopInfo(
1836 *thread_sp, exc_type, exc_data_size,
1837 exc_data_size >= 1 ? exc_data[0] : 0,
1838 exc_data_size >= 2 ? exc_data[1] : 0,
1839 exc_data_size >= 3 ? exc_data[2] : 0));
1842 bool handled =
false;
1843 bool did_exec =
false;
1846 if (!reason.empty() && reason !=
"none") {
1847 if (reason ==
"trace") {
1850 }
else if (reason ==
"breakpoint") {
1851 thread_sp->SetThreadHitBreakpointSite();
1859 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
1860 thread_sp->SetStopInfo(
1862 *thread_sp, bp_site_sp->GetID()));
1865 thread_sp->SetStopInfo(invalid_stop_info_sp);
1868 }
else if (reason ==
"trap") {
1870 }
else if (reason ==
"watchpoint") {
1906 bool silently_continue =
false;
1916 silently_continue =
true;
1920 if (!wp_resource_sp) {
1922 LLDB_LOGF(log,
"failed to find watchpoint");
1929 watch_id = wp_resource_sp->GetConstituentAtIndex(0)->GetID();
1932 *thread_sp, watch_id, silently_continue));
1934 }
else if (reason ==
"exception") {
1936 *thread_sp, description.c_str()));
1938 }
else if (reason ==
"history boundary") {
1940 *thread_sp, description.c_str()));
1942 }
else if (reason ==
"exec") {
1944 thread_sp->SetStopInfo(
1947 }
else if (reason ==
"processor trace") {
1949 *thread_sp, description.c_str()));
1950 }
else if (reason ==
"fork") {
1955 thread_sp->SetStopInfo(
1958 }
else if (reason ==
"vfork") {
1964 *thread_sp, child_pid, child_tid));
1966 }
else if (reason ==
"vforkdone") {
1967 thread_sp->SetStopInfo(
1973 if (!handled && signo && !did_exec) {
1994 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
2003 if (bp_site_sp->IsEnabled())
2004 thread_sp->SetThreadHitBreakpointSite();
2006 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
2008 thread_sp->GetRegisterContext()->SetPC(
pc);
2009 thread_sp->SetStopInfo(
2011 *thread_sp, bp_site_sp->GetID()));
2014 thread_sp->SetStopInfo(invalid_stop_info_sp);
2020 thread_sp->SetStopInfo(
2024 *thread_sp, signo, description.c_str()));
2035 if (interrupt_thread)
2036 thread_sp = interrupt_thread;
2039 *thread_sp, signo, description.c_str()));
2043 if (!description.empty()) {
2046 const char *stop_info_desc = stop_info_sp->GetDescription();
2047 if (!stop_info_desc || !stop_info_desc[0])
2048 stop_info_sp->SetDescription(description.c_str());
2051 *thread_sp, description.c_str()));
2061 const std::string &description) {
2070 *thread_sp, signo, description.c_str()));
2079 static constexpr llvm::StringLiteral g_key_tid(
"tid");
2080 static constexpr llvm::StringLiteral g_key_name(
"name");
2081 static constexpr llvm::StringLiteral g_key_reason(
"reason");
2082 static constexpr llvm::StringLiteral g_key_metype(
"metype");
2083 static constexpr llvm::StringLiteral g_key_medata(
"medata");
2084 static constexpr llvm::StringLiteral g_key_qaddr(
"qaddr");
2085 static constexpr llvm::StringLiteral g_key_dispatch_queue_t(
2086 "dispatch_queue_t");
2087 static constexpr llvm::StringLiteral g_key_associated_with_dispatch_queue(
2088 "associated_with_dispatch_queue");
2089 static constexpr llvm::StringLiteral g_key_queue_name(
"qname");
2090 static constexpr llvm::StringLiteral g_key_queue_kind(
"qkind");
2091 static constexpr llvm::StringLiteral g_key_queue_serial_number(
"qserialnum");
2092 static constexpr llvm::StringLiteral g_key_registers(
"registers");
2093 static constexpr llvm::StringLiteral g_key_memory(
"memory");
2094 static constexpr llvm::StringLiteral g_key_description(
"description");
2095 static constexpr llvm::StringLiteral g_key_signal(
"signal");
2100 std::string thread_name;
2102 std::string description;
2103 uint32_t exc_type = 0;
2104 std::vector<addr_t> exc_data;
2107 bool queue_vars_valid =
false;
2110 std::string queue_name;
2112 uint64_t queue_serial_number = 0;
2117 thread_dict->
ForEach([
this, &tid, &expedited_register_map, &thread_name,
2118 &signo, &reason, &description, &exc_type, &exc_data,
2119 &thread_dispatch_qaddr, &queue_vars_valid,
2120 &associated_with_dispatch_queue, &dispatch_queue_t,
2121 &queue_name, &queue_kind, &queue_serial_number](
2122 llvm::StringRef key,
2124 if (key == g_key_tid) {
2127 }
else if (key == g_key_metype) {
2129 exc_type =
object->GetUnsignedIntegerValue(0);
2130 }
else if (key == g_key_medata) {
2135 exc_data.push_back(object->GetUnsignedIntegerValue());
2139 }
else if (key == g_key_name) {
2140 thread_name = std::string(object->GetStringValue());
2141 }
else if (key == g_key_qaddr) {
2142 thread_dispatch_qaddr =
2144 }
else if (key == g_key_queue_name) {
2145 queue_vars_valid =
true;
2146 queue_name = std::string(object->GetStringValue());
2147 }
else if (key == g_key_queue_kind) {
2148 std::string queue_kind_str = std::string(object->GetStringValue());
2149 if (queue_kind_str ==
"serial") {
2150 queue_vars_valid =
true;
2152 }
else if (queue_kind_str ==
"concurrent") {
2153 queue_vars_valid =
true;
2156 }
else if (key == g_key_queue_serial_number) {
2157 queue_serial_number =
object->GetUnsignedIntegerValue(0);
2158 if (queue_serial_number != 0)
2159 queue_vars_valid =
true;
2160 }
else if (key == g_key_dispatch_queue_t) {
2161 dispatch_queue_t =
object->GetUnsignedIntegerValue(0);
2163 queue_vars_valid =
true;
2164 }
else if (key == g_key_associated_with_dispatch_queue) {
2165 queue_vars_valid =
true;
2166 bool associated =
object->GetBooleanValue();
2171 }
else if (key == g_key_reason) {
2172 reason = std::string(object->GetStringValue());
2173 }
else if (key == g_key_description) {
2174 description = std::string(object->GetStringValue());
2175 }
else if (key == g_key_registers) {
2178 if (registers_dict) {
2180 [&expedited_register_map](llvm::StringRef key,
2183 if (llvm::to_integer(key, reg))
2184 expedited_register_map[reg] =
2185 std::string(object->GetStringValue());
2189 }
else if (key == g_key_memory) {
2195 if (mem_cache_dict) {
2198 "address", mem_cache_addr)) {
2200 llvm::StringRef str;
2205 const size_t byte_size = bytes.
GetStringRef().size() / 2;
2208 const size_t bytes_copied =
2210 if (bytes_copied == byte_size)
2221 }
else if (key == g_key_signal)
2227 reason, description, exc_type, exc_data,
2228 thread_dispatch_qaddr, queue_vars_valid,
2229 associated_with_dispatch_queue, dispatch_queue_t,
2230 queue_name, queue_kind, queue_serial_number);
2236 const char stop_type = stop_packet.
GetChar();
2237 switch (stop_type) {
2256 const uint8_t signo = stop_packet.
GetHexU8();
2257 llvm::StringRef key;
2258 llvm::StringRef value;
2259 std::string thread_name;
2261 std::string description;
2262 uint32_t exc_type = 0;
2263 std::vector<addr_t> exc_data;
2265 bool queue_vars_valid =
2269 std::string queue_name;
2271 uint64_t queue_serial_number = 0;
2275 if (key.compare(
"metype") == 0) {
2277 value.getAsInteger(16, exc_type);
2278 }
else if (key.compare(
"medata") == 0) {
2281 value.getAsInteger(16, x);
2282 exc_data.push_back(x);
2283 }
else if (key.compare(
"thread") == 0) {
2286 auto pid_tid = thread_id.
GetPidTid(pid);
2288 stop_pid = pid_tid->first;
2289 tid = pid_tid->second;
2292 }
else if (key.compare(
"threads") == 0) {
2293 std::lock_guard<std::recursive_mutex> guard(
2296 }
else if (key.compare(
"thread-pcs") == 0) {
2301 while (!value.empty()) {
2302 llvm::StringRef pc_str;
2303 std::tie(pc_str, value) = value.split(
',');
2304 if (pc_str.getAsInteger(16,
pc))
2308 }
else if (key.compare(
"jstopinfo") == 0) {
2317 }
else if (key.compare(
"hexname") == 0) {
2321 }
else if (key.compare(
"name") == 0) {
2322 thread_name = std::string(value);
2323 }
else if (key.compare(
"qaddr") == 0) {
2324 value.getAsInteger(16, thread_dispatch_qaddr);
2325 }
else if (key.compare(
"dispatch_queue_t") == 0) {
2326 queue_vars_valid =
true;
2327 value.getAsInteger(16, dispatch_queue_t);
2328 }
else if (key.compare(
"qname") == 0) {
2329 queue_vars_valid =
true;
2333 }
else if (key.compare(
"qkind") == 0) {
2334 queue_kind = llvm::StringSwitch<QueueKind>(value)
2339 }
else if (key.compare(
"qserialnum") == 0) {
2340 if (!value.getAsInteger(0, queue_serial_number))
2341 queue_vars_valid =
true;
2342 }
else if (key.compare(
"reason") == 0) {
2343 reason = std::string(value);
2344 }
else if (key.compare(
"description") == 0) {
2348 }
else if (key.compare(
"memory") == 0) {
2362 llvm::StringRef addr_str, bytes_str;
2363 std::tie(addr_str, bytes_str) = value.split(
'=');
2364 if (!addr_str.empty() && !bytes_str.empty()) {
2366 if (!addr_str.getAsInteger(0, mem_cache_addr)) {
2371 const size_t bytes_copied =
2373 if (bytes_copied == byte_size)
2377 }
else if (key.compare(
"watch") == 0 || key.compare(
"rwatch") == 0 ||
2378 key.compare(
"awatch") == 0) {
2381 value.getAsInteger(16, wp_addr);
2389 reason =
"watchpoint";
2391 ostr.
Printf(
"%" PRIu64, wp_addr);
2392 description = std::string(ostr.
GetString());
2393 }
else if (key.compare(
"swbreak") == 0 || key.compare(
"hwbreak") == 0) {
2394 reason =
"breakpoint";
2395 }
else if (key.compare(
"replaylog") == 0) {
2396 reason =
"history boundary";
2397 }
else if (key.compare(
"library") == 0) {
2403 }
else if (key.compare(
"fork") == 0 || key.compare(
"vfork") == 0) {
2409 LLDB_LOG(log,
"Invalid PID/TID to fork: {0}", value);
2415 ostr.
Printf(
"%" PRIu64
" %" PRIu64, pid_tid->first, pid_tid->second);
2416 description = std::string(ostr.
GetString());
2417 }
else if (key.compare(
"addressing_bits") == 0) {
2418 uint64_t addressing_bits;
2419 if (!value.getAsInteger(0, addressing_bits)) {
2422 }
else if (key.compare(
"low_mem_addressing_bits") == 0) {
2423 uint64_t addressing_bits;
2424 if (!value.getAsInteger(0, addressing_bits)) {
2427 }
else if (key.compare(
"high_mem_addressing_bits") == 0) {
2428 uint64_t addressing_bits;
2429 if (!value.getAsInteger(0, addressing_bits)) {
2432 }
else if (key.size() == 2 && ::isxdigit(key[0]) && ::isxdigit(key[1])) {
2434 if (!key.getAsInteger(16, reg))
2435 expedited_register_map[reg] = std::string(std::move(value));
2445 "Received stop for incorrect PID = {0} (inferior PID = {1})",
2465 tid, expedited_register_map, signo, thread_name, reason, description,
2466 exc_type, exc_data, thread_dispatch_qaddr, queue_vars_valid,
2467 associated_with_dispatch_queue, dispatch_queue_t, queue_name,
2468 queue_kind, queue_serial_number);
2535 LLDB_LOGF(log,
"ProcessGDBRemote::DoDetach(keep_stopped: %i)", keep_stopped);
2539 if (
error.Success())
2541 "ProcessGDBRemote::DoDetach() detach packet sent successfully");
2544 "ProcessGDBRemote::DoDetach() detach packet send failed: %s",
2545 error.AsCString() ?
error.AsCString() :
"<unknown error>");
2548 if (!
error.Success())
2563 LLDB_LOGF(log,
"ProcessGDBRemote::DoDestroy()");
2566 int exit_status = SIGABRT;
2567 std::string exit_string;
2574 exit_status = kill_res.get();
2575#if defined(__APPLE__)
2587 if (platform_sp && platform_sp->IsHost()) {
2590 reap_pid = waitpid(
GetID(), &status, WNOHANG);
2591 LLDB_LOGF(log,
"Reaped pid: %d, status: %d.\n", reap_pid, status);
2595 exit_string.assign(
"killed");
2597 exit_string.assign(llvm::toString(kill_res.takeError()));
2600 exit_string.assign(
"killed or interrupted while attaching.");
2606 exit_string.assign(
"destroying when not connected to debugserver");
2627 const bool did_exec =
2628 response.
GetStringRef().find(
";reason:exec;") != std::string::npos;
2631 LLDB_LOGF(log,
"ProcessGDBRemote::SetLastStopPacket () - detected exec");
2636 m_gdb_comm.ResetDiscoverableSettings(did_exec);
2661 LLDB_LOG_ERROR(log, list.takeError(),
"Failed to read module list: {0}.");
2663 addr = list->m_link_map;
2683 const size_t n = thread_infos->
GetSize();
2684 for (
size_t i = 0; i < n; ++i) {
2700 xPacketState x_state =
m_gdb_comm.GetxPacketState();
2703 size_t max_memory_size = x_state != xPacketState::Unimplemented
2706 if (size > max_memory_size) {
2710 size = max_memory_size;
2715 packet_len = ::snprintf(packet,
sizeof(packet),
"%c%" PRIx64
",%" PRIx64,
2716 x_state != xPacketState::Unimplemented ?
'x' :
'm',
2717 (uint64_t)addr, (uint64_t)size);
2718 assert(packet_len + 1 < (
int)
sizeof(packet));
2721 if (
m_gdb_comm.SendPacketAndWaitForResponse(packet, response,
2726 if (x_state != xPacketState::Unimplemented) {
2731 llvm::StringRef data_received = response.
GetStringRef();
2732 if (x_state == xPacketState::Prefixed &&
2733 !data_received.consume_front(
"b")) {
2735 "unexpected response to GDB server memory read packet '{0}': "
2737 packet, data_received);
2742 size_t memcpy_size = std::min(size, data_received.size());
2743 memcpy(buf, data_received.data(), memcpy_size);
2747 llvm::MutableArrayRef<uint8_t>((uint8_t *)buf, size),
'\xdd');
2751 "memory read failed for 0x%" PRIx64, addr);
2754 "GDB server does not support reading memory");
2757 "unexpected response to GDB server memory read packet '%s': '%s'",
2766llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
2769 llvm::MutableArrayRef<uint8_t> buffer) {
2773 llvm::Expected<StringExtractorGDBRemote> response =
2777 "MultiMemRead error response: {0}");
2781 llvm::StringRef response_str = response->GetStringRef();
2782 const unsigned expected_num_ranges = ranges.size();
2783 llvm::Expected<llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>>
2786 if (!parsed_response) {
2788 "MultiMemRead error parsing response: {0}");
2791 return std::move(*parsed_response);
2794llvm::Expected<StringExtractorGDBRemote>
2797 std::string packet_str;
2798 llvm::raw_string_ostream stream(packet_str);
2799 stream <<
"MultiMemRead:ranges:";
2801 auto range_to_stream = [&](
auto range) {
2803 stream << llvm::formatv(
"{0:x-},{1:x-}", range.base, range.size);
2805 llvm::interleave(ranges, stream, range_to_stream,
",");
2810 m_gdb_comm.SendPacketAndWaitForResponse(packet_str.data(), response,
2813 return llvm::createStringError(
2814 llvm::formatv(
"MultiMemRead failed to send packet: '{0}'", packet_str));
2817 return llvm::createStringError(
2818 llvm::formatv(
"MultiMemRead failed: '{0}'", response.
GetStringRef()));
2821 return llvm::createStringError(llvm::formatv(
2822 "MultiMemRead unexpected response: '{0}'", response.
GetStringRef()));
2827llvm::Expected<llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>>
2829 llvm::MutableArrayRef<uint8_t> buffer,
2830 unsigned expected_num_ranges) {
2832 auto [sizes_str, memory_data] = response_str.split(
';');
2833 if (sizes_str.size() == response_str.size())
2834 return llvm::createStringError(llvm::formatv(
2835 "MultiMemRead response missing field separator ';' in: '{0}'",
2838 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> read_results;
2841 for (llvm::StringRef size_str : llvm::split(sizes_str,
',')) {
2843 if (size_str.getAsInteger(16, read_size))
2844 return llvm::createStringError(llvm::formatv(
2845 "MultiMemRead response has invalid size string: {0}", size_str));
2847 if (memory_data.size() < read_size)
2848 return llvm::createStringError(
2849 llvm::formatv(
"MultiMemRead response did not have enough data, "
2850 "requested sizes: {0}",
2853 llvm::StringRef region_to_read = memory_data.take_front(read_size);
2854 memory_data = memory_data.drop_front(read_size);
2856 assert(buffer.size() >= read_size);
2857 llvm::MutableArrayRef<uint8_t> region_to_write =
2858 buffer.take_front(read_size);
2859 buffer = buffer.drop_front(read_size);
2861 memcpy(region_to_write.data(), region_to_read.data(), read_size);
2862 read_results.push_back(region_to_write);
2865 return read_results;
2869 return m_gdb_comm.GetMemoryTaggingSupported();
2872llvm::Expected<std::vector<uint8_t>>
2879 return llvm::createStringError(llvm::inconvertibleErrorCode(),
2880 "Error reading memory tags from remote");
2884 llvm::ArrayRef<uint8_t> tag_data = buffer_sp->GetData();
2885 std::vector<uint8_t> got;
2886 got.reserve(tag_data.size());
2887 std::copy(tag_data.begin(), tag_data.end(), std::back_inserter(got));
2893 const std::vector<uint8_t> &tags) {
2896 return m_gdb_comm.WriteMemoryTags(addr, len, type, tags);
2900 std::vector<ObjectFile::LoadableData> entries) {
2910 if (
error.Success())
2924 for (
size_t i = 0; i < size; ++i)
2949 if (blocksize == 0) {
2957 lldb::addr_t block_start_addr = addr - (addr % blocksize);
2958 size += (addr - block_start_addr);
2959 if ((size % blocksize) != 0)
2960 size += (blocksize - size % blocksize);
2976 auto overlap = last_range.GetRangeEnd() - range.
GetRangeBase();
2997 "flash erase failed for 0x%" PRIx64, addr);
3000 "GDB server does not support flashing");
3003 "unexpected response to GDB server flash erase packet '%s': '%s'",
3020 if (
m_gdb_comm.SendPacketAndWaitForResponse(
"vFlashDone", response,
3030 "GDB server does not support flashing");
3033 "unexpected response to GDB server flash done packet: '%s'",
3048 if (size > max_memory_size) {
3052 size = max_memory_size;
3073 if (!
error.Success())
3075 packet.
Printf(
"vFlashWrite:%" PRIx64
":", addr);
3078 packet.
Printf(
"M%" PRIx64
",%" PRIx64
":", addr, (uint64_t)size);
3091 "memory write failed for 0x%" PRIx64, addr);
3094 "GDB server does not support writing memory");
3097 "unexpected response to GDB server memory write packet '%s': '%s'",
3107 uint32_t permissions,
3113 allocated_addr =
m_gdb_comm.AllocateMemory(size, permissions);
3116 return allocated_addr;
3122 if (permissions & lldb::ePermissionsReadable)
3124 if (permissions & lldb::ePermissionsWritable)
3126 if (permissions & lldb::ePermissionsExecutable)
3135 "ProcessGDBRemote::%s no direct stub support for memory "
3136 "allocation, and InferiorCallMmap also failed - is stub "
3137 "missing register context save/restore capability?",
3144 "unable to allocate %" PRIu64
" bytes of memory with permissions %s",
3148 return allocated_addr;
3163 return m_gdb_comm.GetWatchpointReportedAfter();
3170 switch (supported) {
3175 "tried to deallocate memory without ever allocating memory");
3181 "unable to deallocate memory at 0x%" PRIx64, addr);
3193 "unable to deallocate memory at 0x%" PRIx64, addr);
3208 m_gdb_comm.SendStdinNotification(src, src_len);
3215 assert(bp_site !=
nullptr);
3226 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3227 ") address = 0x%" PRIx64,
3228 site_id, (uint64_t)addr);
3233 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3234 ") address = 0x%" PRIx64
" -- SUCCESS (already enabled)",
3235 site_id, (uint64_t)addr);
3254 uint8_t error_no =
m_gdb_comm.SendGDBStoppointTypePacket(
3256 if (error_no == 0) {
3272 if (error_no != UINT8_MAX)
3274 "error: %d sending the breakpoint request", error_no);
3283 LLDB_LOGF(log,
"Software breakpoints are unsupported");
3294 uint8_t error_no =
m_gdb_comm.SendGDBStoppointTypePacket(
3296 if (error_no == 0) {
3307 if (error_no != UINT8_MAX)
3309 "error: %d sending the hardware breakpoint request "
3310 "(hardware breakpoint resources might be exhausted or unavailable)",
3314 "error sending the hardware breakpoint request "
3315 "(hardware breakpoint resources "
3316 "might be exhausted or unavailable)");
3322 LLDB_LOGF(log,
"Hardware breakpoints are unsupported");
3340 assert(bp_site !=
nullptr);
3345 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3346 ") addr = 0x%8.8" PRIx64,
3347 site_id, (uint64_t)addr);
3372 if (
error.Success())
3376 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3377 ") addr = 0x%8.8" PRIx64
" -- SUCCESS (already disabled)",
3378 site_id, (uint64_t)addr);
3382 if (
error.Success())
3391 bool read = wp_res_sp->WatchpointResourceRead();
3392 bool write = wp_res_sp->WatchpointResourceWrite();
3394 assert((read || write) &&
3395 "WatchpointResource type is neither read nor write");
3411 addr_t addr = wp_sp->GetLoadAddress();
3413 LLDB_LOGF(log,
"ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
")",
3415 if (wp_sp->IsEnabled()) {
3417 "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
3418 ") addr = 0x%8.8" PRIx64
": watchpoint already enabled.",
3419 watchID, (uint64_t)addr);
3423 bool read = wp_sp->WatchpointRead();
3424 bool write = wp_sp->WatchpointWrite() || wp_sp->WatchpointModify();
3425 size_t size = wp_sp->GetByteSize();
3428 WatchpointHardwareFeature supported_features =
3431 std::vector<WatchpointResourceSP> resources =
3433 addr, size, read, write, supported_features, target_arch);
3458 bool set_all_resources =
true;
3459 std::vector<WatchpointResourceSP> succesfully_set_resources;
3460 for (
const auto &wp_res_sp : resources) {
3461 addr_t addr = wp_res_sp->GetLoadAddress();
3462 size_t size = wp_res_sp->GetByteSize();
3464 if (!
m_gdb_comm.SupportsGDBStoppointPacket(type) ||
3465 m_gdb_comm.SendGDBStoppointTypePacket(type,
true, addr, size,
3467 set_all_resources =
false;
3470 succesfully_set_resources.push_back(wp_res_sp);
3473 if (set_all_resources) {
3474 wp_sp->SetEnabled(
true, notify);
3475 for (
const auto &wp_res_sp : resources) {
3478 wp_res_sp->AddConstituent(wp_sp);
3486 for (
const auto &wp_res_sp : succesfully_set_resources) {
3487 addr_t addr = wp_res_sp->GetLoadAddress();
3488 size_t size = wp_res_sp->GetByteSize();
3490 m_gdb_comm.SendGDBStoppointTypePacket(type,
false, addr, size,
3494 "Setting one of the watchpoint resources failed");
3510 addr_t addr = wp_sp->GetLoadAddress();
3513 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3514 ") addr = 0x%8.8" PRIx64,
3515 watchID, (uint64_t)addr);
3517 if (!wp_sp->IsEnabled()) {
3519 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3520 ") addr = 0x%8.8" PRIx64
" -- SUCCESS (already disabled)",
3521 watchID, (uint64_t)addr);
3525 wp_sp->SetEnabled(
false, notify);
3529 if (wp_sp->IsHardware()) {
3530 bool disabled_all =
true;
3532 std::vector<WatchpointResourceSP> unused_resources;
3534 if (wp_res_sp->ConstituentsContains(wp_sp)) {
3536 addr_t addr = wp_res_sp->GetLoadAddress();
3537 size_t size = wp_res_sp->GetByteSize();
3538 if (
m_gdb_comm.SendGDBStoppointTypePacket(type,
false, addr, size,
3540 disabled_all =
false;
3542 wp_res_sp->RemoveConstituent(wp_sp);
3543 if (wp_res_sp->GetNumberOfConstituents() == 0)
3544 unused_resources.push_back(wp_res_sp);
3548 for (
auto &wp_res_sp : unused_resources)
3551 wp_sp->SetEnabled(
false, notify);
3554 "Failure disabling one of the watchpoint locations");
3567 LLDB_LOGF(log,
"ProcessGDBRemote::DoSignal (signal = %d)", signo);
3582 if (platform_sp && !platform_sp->IsHost())
3587 const char *error_string =
error.AsCString();
3588 if (error_string ==
nullptr)
3597 static FileSpec g_debugserver_file_spec;
3604 std::string env_debugserver_path = host_env.lookup(
"LLDB_DEBUGSERVER_PATH");
3605 if (!env_debugserver_path.empty()) {
3606 debugserver_file_spec.
SetFile(env_debugserver_path,
3607 FileSpec::Style::native);
3608 LLDB_LOG(log,
"gdb-remote stub exe path set from environment variable: {0}",
3609 env_debugserver_path);
3611 debugserver_file_spec = g_debugserver_file_spec;
3613 return debugserver_file_spec;
3616 debugserver_file_spec = HostInfo::GetSupportExeDir();
3617 if (debugserver_file_spec) {
3620 LLDB_LOG(log,
"found gdb-remote stub exe '{0}'", debugserver_file_spec);
3622 g_debugserver_file_spec = debugserver_file_spec;
3625 if (!debugserver_file_spec) {
3628 LLDB_LOG(log,
"could not find gdb-remote stub exe '{0}'",
3629 debugserver_file_spec);
3633 g_debugserver_file_spec.
Clear();
3636 return debugserver_file_spec;
3641 using namespace std::placeholders;
3651 const std::weak_ptr<ProcessGDBRemote> this_wp =
3652 std::static_pointer_cast<ProcessGDBRemote>(shared_from_this());
3659#if defined(__APPLE__)
3663 int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID,
3665 struct kinfo_proc processInfo;
3666 size_t bufsize =
sizeof(processInfo);
3667 if (sysctl(mib, (
unsigned)(
sizeof(mib) /
sizeof(
int)), &processInfo, &bufsize,
3670 if (processInfo.kp_proc.p_flag & P_TRANSLATED) {
3671 debugserver_path =
FileSpec(
"/Library/Apple/usr/libexec/oah/debugserver");
3678 "'. Please ensure it is properly installed "
3679 "and available in your PATH");
3694 debugserver_launch_info,
nullptr);
3699 LLDB_LOGF(log,
"failed to start debugserver process: %s",
3709 m_gdb_comm.SetConnection(std::make_unique<ConnectionFileDescriptor>(
3710 std::move(socket_pair->second)));
3724 std::weak_ptr<ProcessGDBRemote> process_wp,
lldb::pid_t debugserver_pid,
3733 "ProcessGDBRemote::%s(process_wp, pid=%" PRIu64
3734 ", signo=%i (0x%x), exit_status=%i)",
3735 __FUNCTION__, debugserver_pid, signo, signo, exit_status);
3737 std::shared_ptr<ProcessGDBRemote> process_sp = process_wp.lock();
3738 LLDB_LOGF(log,
"ProcessGDBRemote::%s(process = %p)", __FUNCTION__,
3739 static_cast<void *
>(process_sp.get()));
3740 if (!process_sp || process_sp->m_debugserver_pid != debugserver_pid)
3746 std::this_thread::sleep_for(std::chrono::milliseconds(500));
3750 const StateType state = process_sp->GetState();
3759 llvm::StringRef signal_name =
3760 process_sp->GetUnixSignals()->GetSignalAsStringRef(signo);
3762 if (!signal_name.empty())
3763 stream.
Format(format_str, signal_name);
3765 stream.
Format(format_str, signo);
3767 process_sp->SetExitStatus(-1, stream.
GetString());
3783 static llvm::once_flag g_once_flag;
3785 llvm::call_once(g_once_flag, []() {
3794 debugger, PluginProperties::GetSettingName())) {
3795 const bool is_global_setting =
true;
3798 "Properties for the gdb-remote process plug-in.", is_global_setting);
3805 LLDB_LOGF(log,
"ProcessGDBRemote::%s ()", __FUNCTION__);
3812 llvm::Expected<HostThread> async_thread =
3816 if (!async_thread) {
3818 "failed to launch host thread: {0}");
3824 "ProcessGDBRemote::%s () - Called when Async thread was "
3834 LLDB_LOGF(log,
"ProcessGDBRemote::%s ()", __FUNCTION__);
3849 "ProcessGDBRemote::%s () - Called when Async thread was not running.",
3855 LLDB_LOGF(log,
"ProcessGDBRemote::%s(pid = %" PRIu64
") thread starting...",
3856 __FUNCTION__,
GetID());
3874 "ProcessGDBRemote::%s(pid = %" PRIu64
3875 ") listener.WaitForEvent (NULL, event_sp)...",
3876 __FUNCTION__,
GetID());
3879 const uint32_t event_type = event_sp->GetType();
3882 "ProcessGDBRemote::%s(pid = %" PRIu64
3883 ") Got an event of type: %d...",
3884 __FUNCTION__,
GetID(), event_type);
3886 switch (event_type) {
3891 if (continue_packet) {
3892 const char *continue_cstr =
3893 (
const char *)continue_packet->
GetBytes();
3894 const size_t continue_cstr_len = continue_packet->
GetByteSize();
3896 "ProcessGDBRemote::%s(pid = %" PRIu64
3897 ") got eBroadcastBitAsyncContinue: %s",
3898 __FUNCTION__,
GetID(), continue_cstr);
3900 if (::strstr(continue_cstr,
"vAttach") ==
nullptr)
3907 llvm::StringRef(continue_cstr, continue_cstr_len),
3918 switch (stop_state) {
3931 int exit_status = response.
GetHexU8();
3932 std::string desc_string;
3934 llvm::StringRef desc_str;
3935 llvm::StringRef desc_token;
3937 if (desc_token !=
"description")
3952 if (::strstr(continue_cstr,
"vAttach") !=
nullptr &&
3955 "System Integrity Protection");
3956 }
else if (::strstr(continue_cstr,
"vAttach") !=
nullptr &&
3976 "ProcessGDBRemote::%s(pid = %" PRIu64
3977 ") got eBroadcastBitAsyncThreadShouldExit...",
3978 __FUNCTION__,
GetID());
3984 "ProcessGDBRemote::%s(pid = %" PRIu64
3985 ") got unknown event 0x%8.8x",
3986 __FUNCTION__,
GetID(), event_type);
3993 "ProcessGDBRemote::%s(pid = %" PRIu64
3994 ") listener.WaitForEvent (NULL, event_sp) => false",
3995 __FUNCTION__,
GetID());
4000 LLDB_LOGF(log,
"ProcessGDBRemote::%s(pid = %" PRIu64
") thread exiting...",
4001 __FUNCTION__,
GetID());
4033 LLDB_LOGF(log,
"Hit New Thread Notification breakpoint.");
4039 LLDB_LOG(log,
"Check if need to update ignored signals");
4053 LLDB_LOG(log,
"Signals' version hasn't changed. version={0}",
4058 auto signals_to_ignore =
4063 "Signals' version changed. old version={0}, new version={1}, "
4064 "signals ignored={2}, update result={3}",
4066 signals_to_ignore.size(),
error);
4068 if (
error.Success())
4078 LLDB_LOGF(log,
"Enabled noticing new thread breakpoint.");
4084 platform_sp->SetThreadCreationBreakpoint(
GetTarget());
4088 log,
"Successfully created new thread notification breakpoint %i",
4093 LLDB_LOGF(log,
"Failed to create new thread notification breakpoint.");
4103 LLDB_LOGF(log,
"Disabling new thread notification breakpoint.");
4123 return_value =
m_gdb_comm.SendLaunchEventDataPacket(data, &was_supported);
4124 if (return_value != 0) {
4127 "Sending events is not supported for this process.");
4137 if (
m_gdb_comm.GetQXferAuxvReadSupported()) {
4138 llvm::Expected<std::string> response =
m_gdb_comm.ReadExtFeature(
"auxv",
"");
4140 buf = std::make_shared<DataBufferHeap>(response->c_str(),
4141 response->length());
4152 if (
m_gdb_comm.GetThreadExtendedInfoSupported()) {
4158 args_dict->GetAsDictionary()->AddIntegerItem(
"thread", tid);
4161 packet <<
"jThreadExtendedInfo:";
4162 args_dict->Dump(packet,
false);
4169 packet << (char)(0x7d ^ 0x20);
4178 if (!response.
Empty()) {
4191 args_dict->GetAsDictionary()->AddIntegerItem(
"image_list_address",
4192 image_list_address);
4193 args_dict->GetAsDictionary()->AddIntegerItem(
"image_count", image_count);
4201 args_dict->GetAsDictionary()->AddBooleanItem(
"fetch_all_solibs",
true);
4207 const std::vector<lldb::addr_t> &load_addresses) {
4211 for (
auto addr : load_addresses)
4212 addresses->AddIntegerItem(addr);
4214 args_dict->GetAsDictionary()->AddItem(
"solib_addresses", addresses);
4224 if (
m_gdb_comm.GetLoadedDynamicLibrariesInfosSupported()) {
4227 std::chrono::seconds(10));
4230 packet <<
"jGetLoadedDynamicLibrariesInfos:";
4231 args_dict->Dump(packet,
false);
4238 packet << (char)(0x7d ^ 0x20);
4247 if (!response.
Empty()) {
4260 if (
m_gdb_comm.GetDynamicLoaderProcessStateSupported()) {
4263 if (
m_gdb_comm.SendPacketAndWaitForResponse(
"jGetDyldProcessState",
4269 if (!response.
Empty()) {
4282 if (
m_gdb_comm.GetSharedCacheInfoSupported()) {
4284 packet <<
"jGetSharedCacheInfo:";
4285 args_dict->Dump(packet,
false);
4292 packet << (char)(0x7d ^ 0x20);
4301 if (!response.
Empty()) {
4312 return m_gdb_comm.ConfigureRemoteStructuredData(type_name, config_sp);
4325 const uint64_t reasonable_largeish_default = 128 * 1024;
4326 const uint64_t conservative_default = 512;
4329 uint64_t stub_max_size =
m_gdb_comm.GetRemoteMaxPacketSize();
4330 if (stub_max_size !=
UINT64_MAX && stub_max_size != 0) {
4336 if (stub_max_size > reasonable_largeish_default) {
4337 stub_max_size = reasonable_largeish_default;
4343 if (stub_max_size > 70)
4344 stub_max_size -= 32 + 32 + 6;
4350 log->
Warning(
"Packet size is too small. "
4351 "LLDB may face problems while writing memory");
4362 uint64_t user_specified_max) {
4363 if (user_specified_max != 0) {
4391 module_spec = cached->second;
4392 return bool(module_spec);
4395 if (!
m_gdb_comm.GetModuleInfo(module_file_spec, arch, module_spec)) {
4396 LLDB_LOGF(log,
"ProcessGDBRemote::%s - failed to get module info for %s:%s",
4397 __FUNCTION__, module_file_spec.
GetPath().c_str(),
4404 module_spec.
Dump(stream);
4405 LLDB_LOGF(log,
"ProcessGDBRemote::%s - got module info for (%s:%s) : %s",
4406 __FUNCTION__, module_file_spec.
GetPath().c_str(),
4415 llvm::ArrayRef<FileSpec> module_file_specs,
const llvm::Triple &triple) {
4416 auto module_specs =
m_gdb_comm.GetModulesInfo(module_file_specs, triple);
4418 for (
const FileSpec &spec : module_file_specs)
4423 triple.getTriple())] = spec;
4437typedef std::vector<std::string> stringVec;
4439typedef std::vector<struct GdbServerRegisterInfo> GDBServerRegisterVec;
4440struct RegisterSetInfo {
4444typedef std::map<uint32_t, RegisterSetInfo> RegisterSetMap;
4446struct GdbServerTargetInfo {
4450 RegisterSetMap reg_set_map;
4467 std::map<uint64_t, FieldEnum::Enumerator> enumerators;
4470 "evalue", [&enumerators, &log](
const XMLNode &enumerator_node) {
4471 std::optional<llvm::StringRef> name;
4472 std::optional<uint64_t> value;
4475 [&name, &value, &log](
const llvm::StringRef &attr_name,
4476 const llvm::StringRef &attr_value) {
4477 if (attr_name ==
"name") {
4478 if (attr_value.size())
4481 LLDB_LOG(log,
"ProcessGDBRemote::ParseEnumEvalues "
4482 "Ignoring empty name in evalue");
4483 }
else if (attr_name ==
"value") {
4484 uint64_t parsed_value = 0;
4485 if (llvm::to_integer(attr_value, parsed_value))
4486 value = parsed_value;
4489 "ProcessGDBRemote::ParseEnumEvalues "
4490 "Invalid value \"{0}\" in "
4495 "ProcessGDBRemote::ParseEnumEvalues Ignoring "
4496 "unknown attribute "
4497 "\"{0}\" in evalue",
4505 enumerators.insert_or_assign(
4506 *value, FieldEnum::Enumerator(*value, name->str()));
4513 for (
auto [_, enumerator] : enumerators)
4514 final_enumerators.push_back(enumerator);
4516 return final_enumerators;
4520ParseEnums(XMLNode feature_node,
4521 llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4522 Log *log(
GetLog(GDBRLog::Process));
4526 "enum", [log, ®isters_enum_types](
const XMLNode &enum_node) {
4530 const llvm::StringRef &attr_value) {
4531 if (attr_name ==
"id")
4549 if (!enumerators.empty()) {
4551 "ProcessGDBRemote::ParseEnums Found enum type \"{0}\"",
4553 registers_enum_types.insert_or_assign(
4554 id, std::make_unique<FieldEnum>(
id, enumerators));
4563static std::vector<RegisterFlags::Field> ParseFlagsFields(
4564 XMLNode flags_node,
unsigned size,
4565 const llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4566 Log *log(
GetLog(GDBRLog::Process));
4567 const unsigned max_start_bit = size * 8 - 1;
4570 std::vector<RegisterFlags::Field> fields;
4572 ®isters_enum_types](
4575 std::optional<llvm::StringRef> name;
4576 std::optional<unsigned> start;
4577 std::optional<unsigned> end;
4578 std::optional<llvm::StringRef> type;
4581 &log](
const llvm::StringRef &attr_name,
4582 const llvm::StringRef &attr_value) {
4585 if (attr_name ==
"name") {
4588 "ProcessGDBRemote::ParseFlagsFields Found field node name \"{0}\"",
4591 }
else if (attr_name ==
"start") {
4592 unsigned parsed_start = 0;
4593 if (llvm::to_integer(attr_value, parsed_start)) {
4594 if (parsed_start > max_start_bit) {
4596 "ProcessGDBRemote::ParseFlagsFields Invalid start {0} in "
4599 parsed_start, max_start_bit);
4601 start = parsed_start;
4605 "ProcessGDBRemote::ParseFlagsFields Invalid start \"{0}\" in "
4609 }
else if (attr_name ==
"end") {
4610 unsigned parsed_end = 0;
4611 if (llvm::to_integer(attr_value, parsed_end))
4612 if (parsed_end > max_start_bit) {
4614 "ProcessGDBRemote::ParseFlagsFields Invalid end {0} in "
4617 parsed_end, max_start_bit);
4622 "ProcessGDBRemote::ParseFlagsFields Invalid end \"{0}\" in "
4626 }
else if (attr_name ==
"type") {
4631 "ProcessGDBRemote::ParseFlagsFields Ignoring unknown attribute "
4632 "\"{0}\" in field node",
4639 if (name && start && end) {
4643 "ProcessGDBRemote::ParseFlagsFields Start {0} > end {1} in field "
4644 "\"{2}\", ignoring",
4645 *start, *end, name->data());
4649 "ProcessGDBRemote::ParseFlagsFields Ignoring field \"{2}\" "
4651 "size > 64 bits, this is not supported",
4655 const FieldEnum *enum_type =
nullptr;
4656 if (type && !type->empty()) {
4657 auto found = registers_enum_types.find(*type);
4658 if (found != registers_enum_types.end()) {
4659 enum_type = found->second.get();
4662 uint64_t max_value =
4665 if (enumerator.m_value > max_value) {
4666 enum_type =
nullptr;
4669 "ProcessGDBRemote::ParseFlagsFields In enum \"{0}\" "
4670 "evalue \"{1}\" with value {2} exceeds the maximum value "
4671 "of field \"{3}\" ({4}), ignoring enum",
4672 type->data(), enumerator.m_name, enumerator.m_value,
4673 name->data(), max_value);
4679 "ProcessGDBRemote::ParseFlagsFields Could not find type "
4681 "for field \"{1}\", ignoring",
4682 type->data(), name->data());
4687 RegisterFlags::Field(name->str(), *start, *end, enum_type));
4698 XMLNode feature_node,
4699 llvm::StringMap<std::unique_ptr<RegisterFlags>> ®isters_flags_types,
4700 const llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4701 Log *log(
GetLog(GDBRLog::Process));
4705 [&log, ®isters_flags_types,
4706 ®isters_enum_types](
const XMLNode &flags_node) ->
bool {
4707 LLDB_LOG(log,
"ProcessGDBRemote::ParseFlags Found flags node \"{0}\"",
4710 std::optional<llvm::StringRef>
id;
4711 std::optional<unsigned> size;
4713 [&
id, &size, &log](
const llvm::StringRef &name,
4714 const llvm::StringRef &value) {
4717 }
else if (name ==
"size") {
4718 unsigned parsed_size = 0;
4719 if (llvm::to_integer(value, parsed_size))
4723 "ProcessGDBRemote::ParseFlags Invalid size \"{0}\" "
4729 "ProcessGDBRemote::ParseFlags Ignoring unknown "
4730 "attribute \"{0}\" in flags node",
4738 std::vector<RegisterFlags::Field> fields =
4739 ParseFlagsFields(flags_node, *size, registers_enum_types);
4740 if (fields.size()) {
4742 std::sort(fields.rbegin(), fields.rend());
4743 std::vector<RegisterFlags::Field>::const_iterator overlap =
4744 std::adjacent_find(fields.begin(), fields.end(),
4745 [](
const RegisterFlags::Field &lhs,
4746 const RegisterFlags::Field &rhs) {
4747 return lhs.Overlaps(rhs);
4751 if (overlap == fields.end()) {
4752 if (registers_flags_types.contains(*
id)) {
4766 "ProcessGDBRemote::ParseFlags Definition of flags "
4768 "previous definition, using original definition instead.",
4771 registers_flags_types.insert_or_assign(
4772 *
id, std::make_unique<RegisterFlags>(
id->str(), *size,
4773 std::move(fields)));
4777 std::vector<RegisterFlags::Field>::const_iterator next =
4781 "ProcessGDBRemote::ParseFlags Ignoring flags because fields "
4782 "{0} (start: {1} end: {2}) and {3} (start: {4} end: {5}) "
4784 overlap->GetName().c_str(), overlap->GetStart(),
4785 overlap->GetEnd(), next->GetName().c_str(), next->GetStart(),
4791 "ProcessGDBRemote::ParseFlags Ignoring definition of flags "
4792 "\"{0}\" because it contains no fields.",
4802 XMLNode feature_node, GdbServerTargetInfo &target_info,
4803 std::vector<DynamicRegisterInfo::Register> ®isters,
4804 llvm::StringMap<std::unique_ptr<RegisterFlags>> ®isters_flags_types,
4805 llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4809 Log *log(
GetLog(GDBRLog::Process));
4812 ParseEnums(feature_node, registers_enum_types);
4813 for (
const auto &enum_type : registers_enum_types)
4816 ParseFlags(feature_node, registers_flags_types, registers_enum_types);
4817 for (
const auto &flags : registers_flags_types)
4818 flags.second->DumpToLog(log);
4822 [&target_info, ®isters, ®isters_flags_types,
4823 log](
const XMLNode ®_node) ->
bool {
4824 std::string gdb_group;
4825 std::string gdb_type;
4826 DynamicRegisterInfo::Register reg_info;
4827 bool encoding_set =
false;
4828 bool format_set =
false;
4832 &encoding_set, &format_set, ®_info,
4833 log](
const llvm::StringRef &name,
4834 const llvm::StringRef &value) ->
bool {
4835 if (name ==
"name") {
4837 }
else if (name ==
"bitsize") {
4838 if (llvm::to_integer(value, reg_info.
byte_size))
4840 llvm::divideCeil(reg_info.
byte_size, CHAR_BIT);
4841 }
else if (name ==
"type") {
4842 gdb_type = value.str();
4843 }
else if (name ==
"group") {
4844 gdb_group = value.str();
4845 }
else if (name ==
"regnum") {
4847 }
else if (name ==
"offset") {
4849 }
else if (name ==
"altname") {
4851 }
else if (name ==
"encoding") {
4852 encoding_set =
true;
4854 }
else if (name ==
"format") {
4860 llvm::StringSwitch<lldb::Format>(value)
4871 }
else if (name ==
"group_id") {
4873 llvm::to_integer(value, set_id);
4874 RegisterSetMap::const_iterator pos =
4875 target_info.reg_set_map.find(set_id);
4876 if (pos != target_info.reg_set_map.end())
4877 reg_info.
set_name = pos->second.name;
4878 }
else if (name ==
"gcc_regnum" || name ==
"ehframe_regnum") {
4880 }
else if (name ==
"dwarf_regnum") {
4882 }
else if (name ==
"generic") {
4884 }
else if (name ==
"value_regnums") {
4887 }
else if (name ==
"invalidate_regnums") {
4892 "ProcessGDBRemote::ParseRegisters unhandled reg "
4893 "attribute %s = %s",
4894 name.data(), value.data());
4899 if (!gdb_type.empty()) {
4901 llvm::StringMap<std::unique_ptr<RegisterFlags>>::iterator it =
4902 registers_flags_types.find(gdb_type);
4903 if (it != registers_flags_types.end()) {
4904 auto flags_type = it->second.get();
4905 if (reg_info.
byte_size == flags_type->GetSize())
4909 "ProcessGDBRemote::ParseRegisters Size of register "
4910 "flags %s (%d bytes) for "
4911 "register %s does not match the register size (%d "
4912 "bytes). Ignoring this set of flags.",
4913 flags_type->GetID().c_str(), flags_type->GetSize(),
4920 if (!gdb_type.empty() && !(encoding_set || format_set)) {
4921 if (llvm::StringRef(gdb_type).starts_with(
"int")) {
4924 }
else if (gdb_type ==
"data_ptr" || gdb_type ==
"code_ptr") {
4927 }
else if (gdb_type ==
"float" || gdb_type ==
"ieee_single" ||
4928 gdb_type ==
"ieee_double") {
4931 }
else if (gdb_type ==
"aarch64v" ||
4932 llvm::StringRef(gdb_type).starts_with(
"vec") ||
4933 gdb_type ==
"i387_ext" || gdb_type ==
"uint128" ||
4946 "ProcessGDBRemote::ParseRegisters Could not determine lldb"
4947 "format and encoding for gdb type %s",
4957 if (!gdb_group.empty()) {
4968 "ProcessGDBRemote::%s Skipping zero bitsize register %s",
4971 registers.push_back(reg_info);
4986 ArchSpec &arch_to_use, std::string xml_filename,
4987 std::vector<DynamicRegisterInfo::Register> ®isters) {
4989 llvm::Expected<std::string> raw =
m_gdb_comm.ReadExtFeature(
"features", xml_filename);
4990 if (errorToBool(raw.takeError()))
4995 if (xml_document.
ParseMemory(raw->c_str(), raw->size(),
4996 xml_filename.c_str())) {
4997 GdbServerTargetInfo target_info;
4998 std::vector<XMLNode> feature_nodes;
5004 const XMLNode &node) ->
bool {
5005 llvm::StringRef name = node.
GetName();
5006 if (name ==
"architecture") {
5008 }
else if (name ==
"osabi") {
5010 }
else if (name ==
"xi:include" || name ==
"include") {
5013 target_info.includes.push_back(href);
5014 }
else if (name ==
"feature") {
5015 feature_nodes.push_back(node);
5016 }
else if (name ==
"groups") {
5018 "group", [&target_info](
const XMLNode &node) ->
bool {
5020 RegisterSetInfo set_info;
5023 [&set_id, &set_info](
const llvm::StringRef &name,
5024 const llvm::StringRef &value) ->
bool {
5027 llvm::to_integer(value, set_id);
5034 target_info.reg_set_map[set_id] = set_info;
5047 feature_nodes.push_back(feature_node);
5049 const XMLNode &node) ->
bool {
5050 llvm::StringRef name = node.
GetName();
5051 if (name ==
"xi:include" || name ==
"include") {
5054 target_info.includes.push_back(href);
5068 if (!arch_to_use.
IsValid() && !target_info.arch.empty()) {
5070 arch_to_use.
SetTriple(llvm::StringSwitch<std::string>(target_info.arch)
5071 .Case(
"i386:x86-64",
"x86_64")
5072 .Case(
"riscv:rv64",
"riscv64")
5073 .Case(
"riscv:rv32",
"riscv32")
5074 .Default(target_info.arch) +
5082 for (
auto &feature_node : feature_nodes) {
5083 ParseRegisters(feature_node, target_info, registers,
5087 for (
const auto &include : target_info.includes) {
5099 std::vector<DynamicRegisterInfo::Register> ®isters,
5101 std::map<uint32_t, uint32_t> remote_to_local_map;
5102 uint32_t remote_regnum = 0;
5103 for (
auto it : llvm::enumerate(registers)) {
5111 remote_to_local_map[remote_reg_info.
regnum_remote] = it.index();
5117 auto proc_to_lldb = [&remote_to_local_map](uint32_t process_regnum) {
5118 auto lldb_regit = remote_to_local_map.find(process_regnum);
5119 return lldb_regit != remote_to_local_map.end() ? lldb_regit->second
5123 llvm::transform(remote_reg_info.value_regs,
5124 remote_reg_info.value_regs.begin(), proc_to_lldb);
5125 llvm::transform(remote_reg_info.invalidate_regs,
5126 remote_reg_info.invalidate_regs.begin(), proc_to_lldb);
5133 abi_sp->AugmentRegisterInfo(registers);
5146 if (!
m_gdb_comm.GetQXferFeaturesReadSupported())
5157 std::vector<DynamicRegisterInfo::Register> registers;
5170 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5171 "XML parsing not available");
5174 LLDB_LOGF(log,
"ProcessGDBRemote::%s", __FUNCTION__);
5183 llvm::Expected<std::string> raw = comm.
ReadExtFeature(
"libraries-svr4",
"");
5185 return raw.takeError();
5188 LLDB_LOGF(log,
"parsing: %s", raw->c_str());
5191 if (!doc.
ParseMemory(raw->c_str(), raw->size(),
"noname.xml"))
5192 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5193 "Error reading noname.xml");
5197 return llvm::createStringError(
5198 llvm::inconvertibleErrorCode(),
5199 "Error finding library-list-svr4 xml element");
5204 if (!main_lm.empty())
5208 "library", [log, &list](
const XMLNode &library) ->
bool {
5213 [&module](
const llvm::StringRef &name,
5214 const llvm::StringRef &value) ->
bool {
5217 module.set_name(value.str());
5218 else if (name ==
"lm") {
5220 llvm::to_integer(value, uint_value);
5221 module.set_link_map(uint_value);
5222 }
else if (name ==
"l_addr") {
5225 llvm::to_integer(value, uint_value);
5226 module.set_base(uint_value);
5229 module.set_base_is_offset(true);
5230 }
else if (name ==
"l_ld") {
5232 llvm::to_integer(value, uint_value);
5233 module.set_dynamic(uint_value);
5242 bool base_is_offset;
5244 module.get_name(name);
5245 module.get_link_map(lm);
5246 module.get_base(base);
5247 module.get_base_is_offset(base_is_offset);
5248 module.get_dynamic(ld);
5251 "found (link_map:0x%08" PRIx64
", base:0x%08" PRIx64
5252 "[%s], ld:0x%08" PRIx64
", name:'%s')",
5253 lm, base, (base_is_offset ?
"offset" :
"absolute"), ld,
5263 LLDB_LOGF(log,
"found %" PRId32
" modules in total",
5264 (
int)list.
m_list.size());
5268 llvm::Expected<std::string> raw = comm.
ReadExtFeature(
"libraries",
"");
5271 return raw.takeError();
5273 LLDB_LOGF(log,
"parsing: %s", raw->c_str());
5276 if (!doc.
ParseMemory(raw->c_str(), raw->size(),
"noname.xml"))
5277 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5278 "Error reading noname.xml");
5282 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5283 "Error finding library-list xml element");
5287 "library", [log, &list](
const XMLNode &library) ->
bool {
5291 module.set_name(name);
5300 llvm::to_integer(address, address_value);
5301 module.set_base(address_value);
5303 module.set_base_is_offset(false);
5308 bool base_is_offset;
5309 module.get_name(name);
5310 module.get_base(base);
5311 module.get_base_is_offset(base_is_offset);
5313 LLDB_LOGF(log,
"found (base:0x%08" PRIx64
"[%s], name:'%s')", base,
5314 (base_is_offset ?
"offset" :
"absolute"), name.c_str());
5323 LLDB_LOGF(log,
"found %" PRId32
" modules in total",
5324 (
int)list.
m_list.size());
5327 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5328 "Remote libraries not supported");
5335 bool value_is_offset) {
5350 return module_list.takeError();
5356 std::string mod_name;
5359 bool mod_base_is_offset;
5362 valid &= modInfo.
get_name(mod_name);
5363 valid &= modInfo.
get_base(mod_base);
5376 if (module_sp.get())
5377 new_modules.
Append(module_sp);
5380 if (new_modules.
GetSize() > 0) {
5385 for (
size_t i = 0; i < loaded_modules.
GetSize(); ++i) {
5389 for (
size_t j = 0; j < new_modules.
GetSize(); ++j) {
5398 removed_modules.
Append(loaded_module);
5402 loaded_modules.
Remove(removed_modules);
5403 m_process->GetTarget().ModulesDidUnload(removed_modules,
false);
5419 m_process->GetTarget().ModulesDidLoad(new_modules);
5422 return llvm::ErrorSuccess();
5431 std::string file_path = file.
GetPath(
false);
5432 if (file_path.empty())
5453 "Fetching file load address from remote server returned an error");
5463 "Unknown error happened during sending the load address packet");
5484 std::string input = data.str();
5491 size_t found, pos = 0, len = input.length();
5492 while ((found = input.find(
end_delimiter, pos)) != std::string::npos) {
5494 input.substr(pos, found).c_str());
5495 std::string profile_data =
5510 std::map<uint64_t, uint32_t> new_thread_id_to_used_usec_map;
5512 llvm::raw_string_ostream output_stream(output);
5513 llvm::StringRef name, value;
5517 if (name.compare(
"thread_used_id") == 0) {
5519 uint64_t thread_id = threadIDHexExtractor.
GetHexMaxU64(
false, 0);
5521 bool has_used_usec =
false;
5522 uint32_t curr_used_usec = 0;
5523 llvm::StringRef usec_name, usec_value;
5524 uint32_t input_file_pos = profileDataExtractor.
GetFilePos();
5526 if (usec_name ==
"thread_used_usec") {
5527 has_used_usec =
true;
5528 usec_value.getAsInteger(0, curr_used_usec);
5532 profileDataExtractor.
SetFilePos(input_file_pos);
5536 if (has_used_usec) {
5537 uint32_t prev_used_usec = 0;
5538 std::map<uint64_t, uint32_t>::iterator iterator =
5541 prev_used_usec = iterator->second;
5543 uint32_t real_used_usec = curr_used_usec - prev_used_usec;
5545 bool good_first_time =
5546 (prev_used_usec == 0) && (real_used_usec > 250000);
5547 bool good_subsequent_time =
5548 (prev_used_usec > 0) &&
5551 if (good_first_time || good_subsequent_time) {
5555 output_stream << name <<
":";
5557 output_stream << index_id <<
";";
5559 output_stream << usec_name <<
":" << usec_value <<
";";
5562 llvm::StringRef local_name, local_value;
5568 new_thread_id_to_used_usec_map[thread_id] = curr_used_usec;
5571 output_stream << name <<
":" << value <<
";";
5574 output_stream << name <<
":" << value <<
";";
5609 return llvm::createStringError(
5610 llvm::inconvertibleErrorCode(),
5611 llvm::formatv(
"qSaveCore returned an error"));
5616 for (
auto x : llvm::split(response.
GetStringRef(),
';')) {
5617 if (x.consume_front(
"core-path:"))
5623 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5624 "qSaveCore returned no core path");
5627 FileSpec remote_core{llvm::StringRef(path)};
5633 platform.
Unlink(remote_core);
5635 return error.ToError();
5641 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5642 "Unable to send qSaveCore");
5655 "GDBRemoteCommunicationClientBase::%s() received $J packet "
5656 "but was not a StructuredData packet: packet starts with "
5669 json_sp->Dump(json_str,
true);
5672 "ProcessGDBRemote::%s() "
5673 "received Async StructuredData packet: %s",
5674 __FUNCTION__, json_str.
GetData());
5677 "ProcessGDBRemote::%s"
5678 "() received StructuredData packet:"
5688 if (structured_data_sp)
5696 "Tests packet speeds of various sizes to determine "
5697 "the performance characteristics of the GDB remote "
5702 "The number of packets to send of each varying size "
5703 "(default is 1000).",
5706 "The maximum number of bytes to send in a packet. Sizes "
5707 "increase in powers of 2 while the size is less than or "
5708 "equal to this option value. (default 1024).",
5711 "The maximum number of bytes to receive in a packet. Sizes "
5712 "increase in powers of 2 while the size is less than or "
5713 "equal to this option value. (default 1024).",
5716 "Print the output as JSON data for easy parsing.", false, true) {
5736 if (!output_stream_sp)
5737 output_stream_sp =
m_interpreter.GetDebugger().GetAsyncOutputStream();
5740 const uint32_t num_packets =
5742 const uint64_t max_send =
m_max_send.GetOptionValue().GetCurrentValue();
5743 const uint64_t max_recv =
m_max_recv.GetOptionValue().GetCurrentValue();
5744 const bool json =
m_json.GetOptionValue().GetCurrentValue();
5745 const uint64_t k_recv_amount =
5748 num_packets, max_send, max_recv, k_recv_amount, json,
5773 "Dumps the packet history buffer. ", nullptr) {}
5794 interpreter,
"process plugin packet xfer-size",
5795 "Maximum size that lldb will try to read/write one one chunk.",
5806 "amount to be transferred when "
5817 uint64_t user_specified_max = strtoul(packet_size,
nullptr, 10);
5818 if (errno == 0 && user_specified_max != 0) {
5833 "Send a custom packet through the GDB remote "
5834 "protocol and print the answer. "
5835 "The packet header and footer will automatically "
5836 "be added to the packet prior to sending and "
5837 "stripped from the result.",
5848 "'%s' takes a one or more packet content arguments",
5856 for (
size_t i = 0; i < argc; ++i) {
5863 output_strm.
Printf(
" packet: %s\n", packet_cstr);
5864 std::string response_str = std::string(response.
GetStringRef());
5866 if (strstr(packet_cstr,
"qGetProfileData") !=
nullptr) {
5870 if (response_str.empty())
5871 output_strm.
PutCString(
"response: \nerror: UNIMPLEMENTED\n");
5884 "Send a qRcmd packet through the GDB remote protocol "
5885 "and print the response. "
5886 "The argument passed to this command will be hex "
5887 "encoded into a valid 'qRcmd' packet, sent and the "
5888 "response will be printed.") {}
5894 if (command.empty()) {
5911 [&output_strm](llvm::StringRef output) { output_strm << output; });
5914 const std::string &response_str = std::string(response.
GetStringRef());
5916 if (response_str.empty())
5917 output_strm.
PutCString(
"response: \nerror: UNIMPLEMENTED\n");
5929 "Commands that deal with GDB remote packets.",
5958 interpreter,
"process plugin",
5959 "Commands for operating on a ProcessGDBRemote process.",
5960 "process plugin <subcommand> [<subcommand-options>]") {
5971 m_command_sp = std::make_shared<CommandObjectMultiwordProcessGDBRemote>(
5972 GetTarget().GetDebugger().GetCommandInterpreter());
6001 addr_t addr = wp_res_sp->GetLoadAddress();
6002 size_t size = wp_res_sp->GetByteSize();
6004 m_gdb_comm.SendGDBStoppointTypePacket(type, enable, addr, size,
6022 follow_pid = parent_pid;
6023 follow_tid = parent_tid;
6024 detach_pid = child_pid;
6025 detach_tid = child_tid;
6028 follow_pid = child_pid;
6029 follow_tid = child_tid;
6030 detach_pid = parent_pid;
6031 detach_tid = parent_tid;
6036 if (!
m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
6037 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to set pid/tid");
6051 if (!
m_gdb_comm.SetCurrentThread(follow_tid, follow_pid) ||
6052 !
m_gdb_comm.SetCurrentThreadForRun(follow_tid, follow_pid)) {
6053 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to reset pid/tid");
6057 LLDB_LOG(log,
"Detaching process {0}", detach_pid);
6060 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() detach packet send failed: {0}",
6061 error.AsCString() ?
error.AsCString() :
"<unknown error>");
6079 "ProcessGDBRemote::DidFork() called for child_pid: {0}, child_tid {1}",
6080 child_pid, child_tid);
6092 detach_pid = child_pid;
6093 detach_tid = child_tid;
6096 detach_pid =
m_gdb_comm.GetCurrentProcessID();
6102 if (!
m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
6103 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to set pid/tid");
6111 if (!
m_gdb_comm.SetCurrentThread(child_tid, child_pid) ||
6112 !
m_gdb_comm.SetCurrentThreadForRun(child_tid, child_pid)) {
6113 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to reset pid/tid");
6119 LLDB_LOG(log,
"Detaching process {0}", detach_pid);
6123 "ProcessGDBRemote::DidFork() detach packet send failed: {0}",
6124 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 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)
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
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
bool GetGDBServerRegisterInfo(ArchSpec &arch)
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