9#include "lldb/Host/Config.h"
14#include <netinet/in.h>
16#include <sys/socket.h>
21#include <sys/sysctl.h>
89#include "llvm/ADT/STLExtras.h"
90#include "llvm/ADT/ScopeExit.h"
91#include "llvm/ADT/StringMap.h"
92#include "llvm/ADT/StringSwitch.h"
93#include "llvm/Support/FormatAdapters.h"
94#include "llvm/Support/Threading.h"
95#include "llvm/Support/raw_ostream.h"
98#define DEBUGSERVER_BASENAME "debugserver"
100#define DEBUGSERVER_BASENAME "lldb-server.exe"
102#define DEBUGSERVER_BASENAME "lldb-server"
122 llvm::consumeError(file.takeError());
126 ((
Process *)p)->DumpPluginHistory(stream);
132#define LLDB_PROPERTIES_processgdbremote
133#include "ProcessGDBRemoteProperties.inc"
136#define LLDB_PROPERTIES_processgdbremote
137#include "ProcessGDBRemotePropertiesEnum.inc"
142 static llvm::StringRef GetSettingName() {
146 PluginProperties() : Properties() {
147 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
148 m_collection_sp->Initialize(g_processgdbremote_properties);
151 ~PluginProperties()
override =
default;
153 uint64_t GetPacketTimeout() {
154 const uint32_t idx = ePropertyPacketTimeout;
155 return GetPropertyAtIndexAs<uint64_t>(
156 idx, g_processgdbremote_properties[idx].default_uint_value);
159 bool SetPacketTimeout(uint64_t timeout) {
160 const uint32_t idx = ePropertyPacketTimeout;
161 return SetPropertyAtIndex(idx, timeout);
164 FileSpec GetTargetDefinitionFile()
const {
165 const uint32_t idx = ePropertyTargetDefinitionFile;
166 return GetPropertyAtIndexAs<FileSpec>(idx, {});
169 bool GetUseSVR4()
const {
170 const uint32_t idx = ePropertyUseSVR4;
171 return GetPropertyAtIndexAs<bool>(
172 idx, g_processgdbremote_properties[idx].default_uint_value != 0);
175 bool GetUseGPacketForReading()
const {
176 const uint32_t idx = ePropertyUseGPacketForReading;
177 return GetPropertyAtIndexAs<bool>(idx,
true);
181std::chrono::seconds ResumeTimeout() {
return std::chrono::seconds(5); }
186 static PluginProperties g_settings;
194#if defined(__APPLE__)
195#define LOW_PORT (IPPORT_RESERVED)
196#define HIGH_PORT (IPPORT_HIFIRSTAUTO)
198#define LOW_PORT (1024u)
199#define HIGH_PORT (49151u)
203 return "GDB Remote protocol based debugging plug-in.";
212 const FileSpec *crash_file_path,
bool can_connect) {
232 bool plugin_specified_by_name) {
233 if (plugin_specified_by_name)
237 Module *exe_module = target_sp->GetExecutableModulePointer();
241 switch (exe_objfile->
GetType()) {
265 :
Process(target_sp, listener_sp),
269 Listener::MakeListener(
"lldb.process.gdb-remote.async-listener")),
279 "async thread should exit");
281 "async thread continue");
283 "async thread did exit");
287 const uint32_t async_event_mask =
293 "ProcessGDBRemote::%s failed to listen for "
294 "m_async_broadcaster events",
298 const uint64_t timeout_seconds =
300 if (timeout_seconds > 0)
301 m_gdb_comm.SetPacketTimeout(std::chrono::seconds(timeout_seconds));
325std::shared_ptr<ThreadGDBRemote>
327 return std::make_shared<ThreadGDBRemote>(*
this, tid);
331 const FileSpec &target_definition_fspec) {
337 if (module_object_sp) {
340 "gdb-server-target-definition",
error));
342 if (target_definition_sp) {
344 target_definition_sp->GetValueForKey(
"host-info"));
346 if (
auto host_info_dict = target_object->GetAsDictionary()) {
348 host_info_dict->GetValueForKey(
"triple");
349 if (
auto triple_string_value = triple_value->GetAsString()) {
350 std::string triple_string =
351 std::string(triple_string_value->GetValue());
352 ArchSpec host_arch(triple_string.c_str());
361 target_definition_sp->GetValueForKey(
"breakpoint-pc-offset");
362 if (breakpoint_pc_offset_value) {
363 if (
auto breakpoint_pc_int_value =
364 breakpoint_pc_offset_value->GetAsSignedInteger())
369 *target_definition_sp,
GetTarget().GetArchitecture()) > 0) {
378 const llvm::StringRef &comma_separated_register_numbers,
379 std::vector<uint32_t> ®nums,
int base) {
381 for (llvm::StringRef x : llvm::split(comma_separated_register_numbers,
',')) {
383 if (llvm::to_integer(x, reg, base))
384 regnums.push_back(reg);
386 return regnums.size();
398 const auto host_packet_timeout =
m_gdb_comm.GetHostDefaultPacketTimeout();
399 if (host_packet_timeout > std::chrono::seconds(0)) {
417 if (target_definition_fspec) {
423 target_definition_fspec.
GetPath() +
434 if (remote_process_arch.
IsValid())
435 arch_to_use = remote_process_arch;
437 arch_to_use = remote_host_arch;
440 arch_to_use = target_arch;
446 std::vector<DynamicRegisterInfo::Register> registers;
447 uint32_t reg_num = 0;
451 const int packet_len =
452 ::snprintf(packet,
sizeof(packet),
"qRegisterInfo%x", reg_num);
453 assert(packet_len < (
int)
sizeof(packet));
456 if (
m_gdb_comm.SendPacketAndWaitForResponse(packet, response) ==
460 llvm::StringRef name;
461 llvm::StringRef value;
465 if (name ==
"name") {
467 }
else if (name ==
"alt-name") {
469 }
else if (name ==
"bitsize") {
470 if (!value.getAsInteger(0, reg_info.
byte_size))
472 }
else if (name ==
"offset") {
474 }
else if (name ==
"encoding") {
478 }
else if (name ==
"format") {
482 llvm::StringSwitch<Format>(value)
524 }
else if (name ==
"set") {
526 }
else if (name ==
"gcc" || name ==
"ehframe") {
528 }
else if (name ==
"dwarf") {
530 }
else if (name ==
"generic") {
532 }
else if (name ==
"container-regs") {
534 }
else if (name ==
"invalidate-regs") {
540 registers.push_back(reg_info);
549 if (registers.empty())
564 bool wait_for_launch) {
596 if (
m_gdb_comm.GetProcessArchitecture().IsValid()) {
599 if (
m_gdb_comm.GetHostArchitecture().IsValid()) {
610 "Process %" PRIu64
" was reported after connecting to "
611 "'%s', but state was not stopped: %s",
615 "Process %" PRIu64
" was reported after connecting to '%s', "
616 "but no stop reply packet was received",
617 pid, remote_url.str().c_str());
621 "ProcessGDBRemote::%s pid %" PRIu64
622 ": normalizing target architecture initial triple: %s "
623 "(GetTarget().GetArchitecture().IsValid() %s, "
624 "m_gdb_comm.GetHostArchitecture().IsValid(): %s)",
625 __FUNCTION__,
GetID(),
626 GetTarget().GetArchitecture().GetTriple().getTriple().c_str(),
628 m_gdb_comm.GetHostArchitecture().IsValid() ?
"true" :
"false");
634 if (
m_gdb_comm.GetProcessArchitecture().IsValid())
641 "ProcessGDBRemote::%s pid %" PRIu64
642 ": normalized target architecture triple: %s",
643 __FUNCTION__,
GetID(),
644 GetTarget().GetArchitecture().GetTriple().getTriple().c_str());
661 LLDB_LOGF(log,
"ProcessGDBRemote::%s() entered", __FUNCTION__);
663 uint32_t launch_flags = launch_info.
GetFlags().
Get();
687 if (stdin_file_spec || stdout_file_spec || stderr_file_spec)
689 "ProcessGDBRemote::%s provided with STDIO paths via "
690 "launch_info: stdin=%s, stdout=%s, stderr=%s",
692 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
693 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
694 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
697 "ProcessGDBRemote::%s no STDIO paths given via launch_info",
701 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
702 if (stdin_file_spec || disable_stdio) {
717 if (
error.Success()) {
719 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
724 if (!stdin_file_spec)
726 FileSpec::Style::native);
727 if (!stdout_file_spec)
729 FileSpec::Style::native);
730 if (!stderr_file_spec)
732 FileSpec::Style::native);
733 }
else if (platform_sp && platform_sp->IsHost()) {
738 if ((!stdin_file_spec || !stdout_file_spec || !stderr_file_spec) &&
742 if (!stdin_file_spec)
743 stdin_file_spec = secondary_name;
745 if (!stdout_file_spec)
746 stdout_file_spec = secondary_name;
748 if (!stderr_file_spec)
749 stderr_file_spec = secondary_name;
753 "ProcessGDBRemote::%s adjusted STDIO paths for local platform "
754 "(IsHost() is true) using secondary: stdin=%s, stdout=%s, "
757 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
758 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
759 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
763 "ProcessGDBRemote::%s final STDIO paths after all "
764 "adjustments: stdin=%s, stdout=%s, stderr=%s",
766 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
767 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
768 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
772 if (stdout_file_spec)
774 if (stderr_file_spec)
777 m_gdb_comm.SetDisableASLR(launch_flags & eLaunchFlagDisableASLR);
778 m_gdb_comm.SetDetachOnError(launch_flags & eLaunchFlagDetachOnError);
781 GetTarget().GetArchitecture().GetArchitectureName());
784 if (launch_event_data !=
nullptr && *launch_event_data !=
'\0')
785 m_gdb_comm.SendLaunchEventDataPacket(launch_event_data);
797 std::chrono::seconds(10));
804 if (llvm::Error err =
m_gdb_comm.LaunchProcess(args)) {
807 llvm::fmt_consume(std::move(err)));
814 LLDB_LOGF(log,
"failed to connect to debugserver: %s",
836 if (!disable_stdio) {
842 LLDB_LOGF(log,
"failed to connect to debugserver: %s",
error.AsCString());
852 if (!connect_url.empty()) {
853 LLDB_LOGF(log,
"ProcessGDBRemote::%s Connecting to %s", __FUNCTION__,
854 connect_url.str().c_str());
855 std::unique_ptr<ConnectionFileDescriptor> conn_up(
858 const uint32_t max_retry_count = 50;
859 uint32_t retry_count = 0;
868 if (retry_count >= max_retry_count)
871 std::this_thread::sleep_for(std::chrono::milliseconds(100));
895 m_gdb_comm.GetListThreadsInStopReplySupported();
902 auto handle_cmds = [&] (
const Args &args) ->
void {
906 entry.c_str(), response);
912 handle_cmds(platform_sp->GetExtraStartupCommands());
929 if (remote_process_arch.
IsValid()) {
930 process_arch = remote_process_arch;
931 LLDB_LOG(log,
"gdb-remote had process architecture, using {0} {1}",
935 process_arch =
m_gdb_comm.GetHostArchitecture();
937 "gdb-remote did not have process architecture, using gdb-remote "
938 "host architecture {0} {1}",
949 LLDB_LOG(log,
"analyzing target arch, currently {0} {1}",
961 if ((process_arch.
GetMachine() == llvm::Triple::arm ||
962 process_arch.
GetMachine() == llvm::Triple::thumb) &&
963 process_arch.
GetTriple().getVendor() == llvm::Triple::Apple) {
966 "remote process is ARM/Apple, "
967 "setting target arch to {0} {1}",
972 const llvm::Triple &remote_triple = process_arch.
GetTriple();
973 llvm::Triple new_target_triple = target_arch.
GetTriple();
974 if (new_target_triple.getVendorName().size() == 0) {
975 new_target_triple.setVendor(remote_triple.getVendor());
977 if (new_target_triple.getOSName().size() == 0) {
978 new_target_triple.setOS(remote_triple.getOS());
980 if (new_target_triple.getEnvironmentName().size() == 0)
981 new_target_triple.setEnvironment(remote_triple.getEnvironment());
984 ArchSpec new_target_arch = target_arch;
985 new_target_arch.
SetTriple(new_target_triple);
991 "final target arch after adjustments for remote architecture: "
1010 m_gdb_comm.GetSupportedStructuredDataPlugins())
1019 if (platform_sp && platform_sp->IsConnected())
1031 UUID standalone_uuid;
1033 bool standalone_value_is_offset;
1034 if (
m_gdb_comm.GetProcessStandaloneBinary(standalone_uuid, standalone_value,
1035 standalone_value_is_offset)) {
1038 if (standalone_uuid.
IsValid()) {
1039 const bool force_symbol_search =
true;
1040 const bool notify =
true;
1041 const bool set_address_in_target =
true;
1042 const bool allow_memory_image_last_resort =
false;
1044 this,
"", standalone_uuid, standalone_value,
1045 standalone_value_is_offset, force_symbol_search, notify,
1046 set_address_in_target, allow_memory_image_last_resort);
1058 std::vector<addr_t> bin_addrs =
m_gdb_comm.GetProcessStandaloneBinaries();
1059 if (bin_addrs.size()) {
1061 const bool value_is_slide =
false;
1062 for (
addr_t addr : bin_addrs) {
1063 const bool notify =
true;
1070 .LoadPlatformBinaryAndSetup(
this, addr, notify))
1073 const bool force_symbol_search =
true;
1074 const bool set_address_in_target =
true;
1075 const bool allow_memory_image_last_resort =
false;
1078 this, llvm::StringRef(), uuid, addr, value_is_slide,
1079 force_symbol_search, notify, set_address_in_target,
1080 allow_memory_image_last_resort);
1090 std::optional<QOffsets> offsets =
m_gdb_comm.GetQOffsets();
1095 size_t(llvm::count(offsets->offsets, offsets->offsets[0])) ==
1096 offsets->offsets.size();
1100 bool changed =
false;
1101 module_sp->SetLoadAddress(
GetTarget(), offsets->offsets[0],
1106 m_process->GetTarget().ModulesDidLoad(list);
1120 LLDB_LOGF(log,
"ProcessGDBRemote::%s()", __FUNCTION__);
1126 if (
error.Success()) {
1130 const int packet_len =
1131 ::snprintf(packet,
sizeof(packet),
"vAttach;%" PRIx64, attach_pid);
1134 std::make_shared<EventDataBytes>(llvm::StringRef(packet, packet_len));
1149 if (process_name && process_name[0]) {
1151 if (
error.Success()) {
1157 if (!
m_gdb_comm.GetVAttachOrWaitSupported()) {
1172 auto data_sp = std::make_shared<EventDataBytes>(packet.
GetString());
1193llvm::Expected<std::string>
1198llvm::Expected<std::vector<uint8_t>>
1210 process_arch.
Clear();
1225 return m_gdb_comm.GetReverseStepSupported() ||
1232 LLDB_LOGF(log,
"ProcessGDBRemote::Resume(%s)",
1237 if (listener_sp->StartListeningForEvents(
1239 listener_sp->StartListeningForEvents(
1246 bool continue_packet_error =
false;
1260 std::string pid_prefix;
1262 pid_prefix = llvm::formatv(
"p{0:x-}.",
GetID());
1264 if (num_continue_c_tids == num_threads ||
1269 continue_packet.
Format(
"vCont;c:{0}-1", pid_prefix);
1277 for (tid_collection::const_iterator
1280 t_pos != t_end; ++t_pos)
1281 continue_packet.
Format(
";c:{0}{1:x-}", pid_prefix, *t_pos);
1283 continue_packet_error =
true;
1288 for (tid_sig_collection::const_iterator
1291 s_pos != s_end; ++s_pos)
1292 continue_packet.
Format(
";C{0:x-2}:{1}{2:x-}", s_pos->second,
1293 pid_prefix, s_pos->first);
1295 continue_packet_error =
true;
1300 for (tid_collection::const_iterator
1303 t_pos != t_end; ++t_pos)
1304 continue_packet.
Format(
";s:{0}{1:x-}", pid_prefix, *t_pos);
1306 continue_packet_error =
true;
1311 for (tid_sig_collection::const_iterator
1314 s_pos != s_end; ++s_pos)
1315 continue_packet.
Format(
";S{0:x-2}:{1}{2:x-}", s_pos->second,
1316 pid_prefix, s_pos->first);
1318 continue_packet_error =
true;
1321 if (continue_packet_error)
1322 continue_packet.
Clear();
1325 continue_packet_error =
true;
1331 if (num_continue_c_tids > 0) {
1332 if (num_continue_c_tids == num_threads) {
1336 continue_packet_error =
false;
1337 }
else if (num_continue_c_tids == 1 && num_continue_C_tids == 0 &&
1338 num_continue_s_tids == 0 && num_continue_S_tids == 0) {
1342 continue_packet_error =
false;
1346 if (continue_packet_error && num_continue_C_tids > 0) {
1347 if ((num_continue_C_tids + num_continue_c_tids) == num_threads &&
1348 num_continue_C_tids > 0 && num_continue_s_tids == 0 &&
1349 num_continue_S_tids == 0) {
1352 if (num_continue_C_tids > 1) {
1357 if (num_continue_C_tids > 1) {
1358 continue_packet_error =
false;
1361 continue_packet_error =
true;
1364 if (!continue_packet_error)
1368 continue_packet_error =
false;
1371 if (!continue_packet_error) {
1373 continue_packet.
Printf(
"C%2.2x", continue_signo);
1378 if (continue_packet_error && num_continue_s_tids > 0) {
1379 if (num_continue_s_tids == num_threads) {
1385 continue_packet_error =
false;
1386 }
else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1387 num_continue_s_tids == 1 && num_continue_S_tids == 0) {
1391 continue_packet_error =
false;
1395 if (!continue_packet_error && num_continue_S_tids > 0) {
1396 if (num_continue_S_tids == num_threads) {
1399 continue_packet_error =
false;
1400 if (num_continue_S_tids > 1) {
1401 for (
size_t i = 1; i < num_threads; ++i) {
1403 continue_packet_error =
true;
1406 if (!continue_packet_error) {
1409 continue_packet.
Printf(
"S%2.2x", step_signo);
1411 }
else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1412 num_continue_s_tids == 0 && num_continue_S_tids == 1) {
1416 continue_packet_error =
false;
1422 if (num_continue_s_tids > 0 || num_continue_S_tids > 0) {
1424 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: target does not "
1425 "support reverse-stepping");
1427 "target does not support reverse-stepping");
1430 if (num_continue_S_tids > 0) {
1433 "ProcessGDBRemote::DoResume: Signals not supported in reverse");
1435 "can't deliver signals while running in reverse");
1438 if (num_continue_s_tids > 1) {
1439 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: can't step multiple "
1440 "threads in reverse");
1442 "can't step multiple threads while reverse-stepping");
1448 if (!
m_gdb_comm.GetReverseContinueSupported()) {
1449 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: target does not "
1450 "support reverse-continue");
1452 "target does not support reverse execution of processes");
1455 if (num_continue_C_tids > 0) {
1458 "ProcessGDBRemote::DoResume: Signals not supported in reverse");
1460 "can't deliver signals while running in reverse");
1468 continue_packet_error =
false;
1471 if (continue_packet_error) {
1473 "can't make continue packet for this resume");
1478 "Trying to resume but the async thread is dead.");
1479 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: Trying to resume but the "
1480 "async thread is dead.");
1485 std::make_shared<EventDataBytes>(continue_packet.
GetString());
1488 if (!listener_sp->GetEvent(event_sp, ResumeTimeout())) {
1490 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: Resume timed out.");
1493 "Broadcast continue, but the async thread was "
1494 "killed before we got an ack back.");
1496 "ProcessGDBRemote::DoResume: Broadcast continue, but the "
1497 "async thread was killed before we got an ack back.");
1513 llvm::StringRef value) {
1519 auto pid_tid = thread_ids.
GetPidTid(pid);
1520 if (pid_tid && pid_tid->first == pid) {
1526 }
while (thread_ids.
GetChar() ==
',');
1532 llvm::StringRef value) {
1534 for (llvm::StringRef x : llvm::split(value,
',')) {
1536 if (llvm::to_integer(x,
pc, 16))
1548 if (thread_infos && thread_infos->
GetSize() > 0) {
1572 const std::string &stop_info_str = std::string(stop_info.
GetStringRef());
1575 const size_t thread_pcs_pos = stop_info_str.find(
";thread-pcs:");
1576 if (thread_pcs_pos != std::string::npos) {
1577 const size_t start = thread_pcs_pos + strlen(
";thread-pcs:");
1578 const size_t end = stop_info_str.find(
';', start);
1579 if (end != std::string::npos) {
1580 std::string value = stop_info_str.substr(start, end - start);
1585 const size_t threads_pos = stop_info_str.find(
";threads:");
1586 if (threads_pos != std::string::npos) {
1587 const size_t start = threads_pos + strlen(
";threads:");
1588 const size_t end = stop_info_str.find(
';', start);
1589 if (end != std::string::npos) {
1590 std::string value = stop_info_str.substr(start, end - start);
1598 bool sequence_mutex_unavailable =
false;
1600 if (sequence_mutex_unavailable) {
1615 if (num_thread_ids == 0) {
1621 ThreadList old_thread_list_copy(old_thread_list);
1622 if (num_thread_ids > 0) {
1623 for (
size_t i = 0; i < num_thread_ids; ++i) {
1629 LLDB_LOGV(log,
"Making new thread: {0} for thread ID: {1:x}.",
1630 thread_sp.get(), thread_sp->GetID());
1632 LLDB_LOGV(log,
"Found old thread: {0} for thread ID: {1:x}.",
1633 thread_sp.get(), thread_sp->GetID());
1643 size_t old_num_thread_ids = old_thread_list_copy.
GetSize(
false);
1644 for (
size_t i = 0; i < old_num_thread_ids; i++) {
1646 if (old_thread_sp) {
1647 lldb::tid_t old_thread_id = old_thread_sp->GetProtocolID();
1662 uint32_t pc_regnum = reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1675 if (thread_infos_sp) {
1679 const size_t n = thread_infos->
GetSize();
1680 for (
size_t i = 0; i < n; ++i) {
1686 if (tid == thread->GetID())
1715 if (
GetGDBRemote().GetThreadStopInfo(thread->GetProtocolID(), stop_packet))
1725 for (
const auto &pair : expedited_register_map) {
1729 reg_value_extractor.
GetHexBytes(buffer_sp->GetData(),
'\xcc');
1730 uint32_t lldb_regnum = gdb_reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1738 uint8_t signo,
const std::string &thread_name,
const std::string &reason,
1739 const std::string &description, uint32_t exc_type,
1740 const std::vector<addr_t> &exc_data,
addr_t thread_dispatch_qaddr,
1741 bool queue_vars_valid,
1743 LazyBool associated_with_dispatch_queue,
addr_t dispatch_queue_t,
1744 std::string &queue_name,
QueueKind queue_kind, uint64_t queue_serial) {
1768 reg_ctx_sp->InvalidateIfNeeded(
true);
1776 if (reg_ctx_sp->ReconfigureRegisterInfo()) {
1779 reg_ctx_sp->InvalidateAllRegisters();
1786 thread_sp->SetName(thread_name.empty() ?
nullptr : thread_name.c_str());
1791 if (queue_vars_valid)
1792 gdb_thread->
SetQueueInfo(std::move(queue_name), queue_kind, queue_serial,
1793 dispatch_queue_t, associated_with_dispatch_queue);
1804 StopInfoSP current_stop_info_sp = thread_sp->GetPrivateStopInfo(
false);
1806 current_stop_info_sp) {
1807 thread_sp->SetStopInfo(current_stop_info_sp);
1811 if (!thread_sp->StopInfoIsUpToDate()) {
1814 addr_t pc = thread_sp->GetRegisterContext()->GetPC();
1816 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
pc);
1817 if (bp_site_sp && bp_site_sp->IsEnabled())
1818 thread_sp->SetThreadStoppedAtUnexecutedBP(
pc);
1820 if (exc_type != 0) {
1828 if (interrupt_thread)
1829 thread_sp = interrupt_thread;
1831 const size_t exc_data_size = exc_data.size();
1832 thread_sp->SetStopInfo(
1834 *thread_sp, exc_type, exc_data_size,
1835 exc_data_size >= 1 ? exc_data[0] : 0,
1836 exc_data_size >= 2 ? exc_data[1] : 0,
1837 exc_data_size >= 3 ? exc_data[2] : 0));
1840 bool handled =
false;
1841 bool did_exec =
false;
1844 if (!reason.empty() && reason !=
"none") {
1845 if (reason ==
"trace") {
1848 }
else if (reason ==
"breakpoint") {
1849 thread_sp->SetThreadHitBreakpointSite();
1857 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
1858 thread_sp->SetStopInfo(
1860 *thread_sp, bp_site_sp->GetID()));
1863 thread_sp->SetStopInfo(invalid_stop_info_sp);
1866 }
else if (reason ==
"trap") {
1868 }
else if (reason ==
"watchpoint") {
1904 bool silently_continue =
false;
1914 silently_continue =
true;
1918 if (!wp_resource_sp) {
1920 LLDB_LOGF(log,
"failed to find watchpoint");
1927 watch_id = wp_resource_sp->GetConstituentAtIndex(0)->GetID();
1930 *thread_sp, watch_id, silently_continue));
1932 }
else if (reason ==
"exception") {
1934 *thread_sp, description.c_str()));
1936 }
else if (reason ==
"history boundary") {
1938 *thread_sp, description.c_str()));
1940 }
else if (reason ==
"exec") {
1942 thread_sp->SetStopInfo(
1945 }
else if (reason ==
"processor trace") {
1947 *thread_sp, description.c_str()));
1948 }
else if (reason ==
"fork") {
1953 thread_sp->SetStopInfo(
1956 }
else if (reason ==
"vfork") {
1962 *thread_sp, child_pid, child_tid));
1964 }
else if (reason ==
"vforkdone") {
1965 thread_sp->SetStopInfo(
1971 if (!handled && signo && !did_exec) {
1992 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
2001 if (bp_site_sp->IsEnabled())
2002 thread_sp->SetThreadHitBreakpointSite();
2004 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
2006 thread_sp->GetRegisterContext()->SetPC(
pc);
2007 thread_sp->SetStopInfo(
2009 *thread_sp, bp_site_sp->GetID()));
2012 thread_sp->SetStopInfo(invalid_stop_info_sp);
2018 thread_sp->SetStopInfo(
2022 *thread_sp, signo, description.c_str()));
2033 if (interrupt_thread)
2034 thread_sp = interrupt_thread;
2037 *thread_sp, signo, description.c_str()));
2041 if (!description.empty()) {
2044 const char *stop_info_desc = stop_info_sp->GetDescription();
2045 if (!stop_info_desc || !stop_info_desc[0])
2046 stop_info_sp->SetDescription(description.c_str());
2049 *thread_sp, description.c_str()));
2059 const std::string &description) {
2068 *thread_sp, signo, description.c_str()));
2077 static constexpr llvm::StringLiteral g_key_tid(
"tid");
2078 static constexpr llvm::StringLiteral g_key_name(
"name");
2079 static constexpr llvm::StringLiteral g_key_reason(
"reason");
2080 static constexpr llvm::StringLiteral g_key_metype(
"metype");
2081 static constexpr llvm::StringLiteral g_key_medata(
"medata");
2082 static constexpr llvm::StringLiteral g_key_qaddr(
"qaddr");
2083 static constexpr llvm::StringLiteral g_key_dispatch_queue_t(
2084 "dispatch_queue_t");
2085 static constexpr llvm::StringLiteral g_key_associated_with_dispatch_queue(
2086 "associated_with_dispatch_queue");
2087 static constexpr llvm::StringLiteral g_key_queue_name(
"qname");
2088 static constexpr llvm::StringLiteral g_key_queue_kind(
"qkind");
2089 static constexpr llvm::StringLiteral g_key_queue_serial_number(
"qserialnum");
2090 static constexpr llvm::StringLiteral g_key_registers(
"registers");
2091 static constexpr llvm::StringLiteral g_key_memory(
"memory");
2092 static constexpr llvm::StringLiteral g_key_description(
"description");
2093 static constexpr llvm::StringLiteral g_key_signal(
"signal");
2098 std::string thread_name;
2100 std::string description;
2101 uint32_t exc_type = 0;
2102 std::vector<addr_t> exc_data;
2105 bool queue_vars_valid =
false;
2108 std::string queue_name;
2110 uint64_t queue_serial_number = 0;
2115 thread_dict->
ForEach([
this, &tid, &expedited_register_map, &thread_name,
2116 &signo, &reason, &description, &exc_type, &exc_data,
2117 &thread_dispatch_qaddr, &queue_vars_valid,
2118 &associated_with_dispatch_queue, &dispatch_queue_t,
2119 &queue_name, &queue_kind, &queue_serial_number](
2120 llvm::StringRef key,
2122 if (key == g_key_tid) {
2125 }
else if (key == g_key_metype) {
2127 exc_type =
object->GetUnsignedIntegerValue(0);
2128 }
else if (key == g_key_medata) {
2133 exc_data.push_back(object->GetUnsignedIntegerValue());
2137 }
else if (key == g_key_name) {
2138 thread_name = std::string(object->GetStringValue());
2139 }
else if (key == g_key_qaddr) {
2140 thread_dispatch_qaddr =
2142 }
else if (key == g_key_queue_name) {
2143 queue_vars_valid =
true;
2144 queue_name = std::string(object->GetStringValue());
2145 }
else if (key == g_key_queue_kind) {
2146 std::string queue_kind_str = std::string(object->GetStringValue());
2147 if (queue_kind_str ==
"serial") {
2148 queue_vars_valid =
true;
2150 }
else if (queue_kind_str ==
"concurrent") {
2151 queue_vars_valid =
true;
2154 }
else if (key == g_key_queue_serial_number) {
2155 queue_serial_number =
object->GetUnsignedIntegerValue(0);
2156 if (queue_serial_number != 0)
2157 queue_vars_valid =
true;
2158 }
else if (key == g_key_dispatch_queue_t) {
2159 dispatch_queue_t =
object->GetUnsignedIntegerValue(0);
2161 queue_vars_valid =
true;
2162 }
else if (key == g_key_associated_with_dispatch_queue) {
2163 queue_vars_valid =
true;
2164 bool associated =
object->GetBooleanValue();
2169 }
else if (key == g_key_reason) {
2170 reason = std::string(object->GetStringValue());
2171 }
else if (key == g_key_description) {
2172 description = std::string(object->GetStringValue());
2173 }
else if (key == g_key_registers) {
2176 if (registers_dict) {
2178 [&expedited_register_map](llvm::StringRef key,
2181 if (llvm::to_integer(key, reg))
2182 expedited_register_map[reg] =
2183 std::string(object->GetStringValue());
2187 }
else if (key == g_key_memory) {
2193 if (mem_cache_dict) {
2196 "address", mem_cache_addr)) {
2198 llvm::StringRef str;
2203 const size_t byte_size = bytes.
GetStringRef().size() / 2;
2206 const size_t bytes_copied =
2208 if (bytes_copied == byte_size)
2219 }
else if (key == g_key_signal)
2225 reason, description, exc_type, exc_data,
2226 thread_dispatch_qaddr, queue_vars_valid,
2227 associated_with_dispatch_queue, dispatch_queue_t,
2228 queue_name, queue_kind, queue_serial_number);
2234 const char stop_type = stop_packet.
GetChar();
2235 switch (stop_type) {
2254 const uint8_t signo = stop_packet.
GetHexU8();
2255 llvm::StringRef key;
2256 llvm::StringRef value;
2257 std::string thread_name;
2259 std::string description;
2260 uint32_t exc_type = 0;
2261 std::vector<addr_t> exc_data;
2263 bool queue_vars_valid =
2267 std::string queue_name;
2269 uint64_t queue_serial_number = 0;
2273 if (key.compare(
"metype") == 0) {
2275 value.getAsInteger(16, exc_type);
2276 }
else if (key.compare(
"medata") == 0) {
2279 value.getAsInteger(16, x);
2280 exc_data.push_back(x);
2281 }
else if (key.compare(
"thread") == 0) {
2284 auto pid_tid = thread_id.
GetPidTid(pid);
2286 stop_pid = pid_tid->first;
2287 tid = pid_tid->second;
2290 }
else if (key.compare(
"threads") == 0) {
2291 std::lock_guard<std::recursive_mutex> guard(
2294 }
else if (key.compare(
"thread-pcs") == 0) {
2299 while (!value.empty()) {
2300 llvm::StringRef pc_str;
2301 std::tie(pc_str, value) = value.split(
',');
2302 if (pc_str.getAsInteger(16,
pc))
2306 }
else if (key.compare(
"jstopinfo") == 0) {
2315 }
else if (key.compare(
"hexname") == 0) {
2319 }
else if (key.compare(
"name") == 0) {
2320 thread_name = std::string(value);
2321 }
else if (key.compare(
"qaddr") == 0) {
2322 value.getAsInteger(16, thread_dispatch_qaddr);
2323 }
else if (key.compare(
"dispatch_queue_t") == 0) {
2324 queue_vars_valid =
true;
2325 value.getAsInteger(16, dispatch_queue_t);
2326 }
else if (key.compare(
"qname") == 0) {
2327 queue_vars_valid =
true;
2331 }
else if (key.compare(
"qkind") == 0) {
2332 queue_kind = llvm::StringSwitch<QueueKind>(value)
2337 }
else if (key.compare(
"qserialnum") == 0) {
2338 if (!value.getAsInteger(0, queue_serial_number))
2339 queue_vars_valid =
true;
2340 }
else if (key.compare(
"reason") == 0) {
2341 reason = std::string(value);
2342 }
else if (key.compare(
"description") == 0) {
2346 }
else if (key.compare(
"memory") == 0) {
2360 llvm::StringRef addr_str, bytes_str;
2361 std::tie(addr_str, bytes_str) = value.split(
'=');
2362 if (!addr_str.empty() && !bytes_str.empty()) {
2364 if (!addr_str.getAsInteger(0, mem_cache_addr)) {
2369 const size_t bytes_copied =
2371 if (bytes_copied == byte_size)
2375 }
else if (key.compare(
"watch") == 0 || key.compare(
"rwatch") == 0 ||
2376 key.compare(
"awatch") == 0) {
2379 value.getAsInteger(16, wp_addr);
2387 reason =
"watchpoint";
2389 ostr.
Printf(
"%" PRIu64, wp_addr);
2390 description = std::string(ostr.
GetString());
2391 }
else if (key.compare(
"swbreak") == 0 || key.compare(
"hwbreak") == 0) {
2392 reason =
"breakpoint";
2393 }
else if (key.compare(
"replaylog") == 0) {
2394 reason =
"history boundary";
2395 }
else if (key.compare(
"library") == 0) {
2401 }
else if (key.compare(
"fork") == 0 || key.compare(
"vfork") == 0) {
2407 LLDB_LOG(log,
"Invalid PID/TID to fork: {0}", value);
2413 ostr.
Printf(
"%" PRIu64
" %" PRIu64, pid_tid->first, pid_tid->second);
2414 description = std::string(ostr.
GetString());
2415 }
else if (key.compare(
"addressing_bits") == 0) {
2416 uint64_t addressing_bits;
2417 if (!value.getAsInteger(0, addressing_bits)) {
2420 }
else if (key.compare(
"low_mem_addressing_bits") == 0) {
2421 uint64_t addressing_bits;
2422 if (!value.getAsInteger(0, addressing_bits)) {
2425 }
else if (key.compare(
"high_mem_addressing_bits") == 0) {
2426 uint64_t addressing_bits;
2427 if (!value.getAsInteger(0, addressing_bits)) {
2430 }
else if (key.size() == 2 && ::isxdigit(key[0]) && ::isxdigit(key[1])) {
2432 if (!key.getAsInteger(16, reg))
2433 expedited_register_map[reg] = std::string(std::move(value));
2443 "Received stop for incorrect PID = {0} (inferior PID = {1})",
2463 tid, expedited_register_map, signo, thread_name, reason, description,
2464 exc_type, exc_data, thread_dispatch_qaddr, queue_vars_valid,
2465 associated_with_dispatch_queue, dispatch_queue_t, queue_name,
2466 queue_kind, queue_serial_number);
2533 LLDB_LOGF(log,
"ProcessGDBRemote::DoDetach(keep_stopped: %i)", keep_stopped);
2537 if (
error.Success())
2539 "ProcessGDBRemote::DoDetach() detach packet sent successfully");
2542 "ProcessGDBRemote::DoDetach() detach packet send failed: %s",
2543 error.AsCString() ?
error.AsCString() :
"<unknown error>");
2546 if (!
error.Success())
2561 LLDB_LOGF(log,
"ProcessGDBRemote::DoDestroy()");
2564 int exit_status = SIGABRT;
2565 std::string exit_string;
2572 exit_status = kill_res.get();
2573#if defined(__APPLE__)
2585 if (platform_sp && platform_sp->IsHost()) {
2588 reap_pid = waitpid(
GetID(), &status, WNOHANG);
2589 LLDB_LOGF(log,
"Reaped pid: %d, status: %d.\n", reap_pid, status);
2593 exit_string.assign(
"killed");
2595 exit_string.assign(llvm::toString(kill_res.takeError()));
2598 exit_string.assign(
"killed or interrupted while attaching.");
2604 exit_string.assign(
"destroying when not connected to debugserver");
2625 const bool did_exec =
2626 response.
GetStringRef().find(
";reason:exec;") != std::string::npos;
2629 LLDB_LOGF(log,
"ProcessGDBRemote::SetLastStopPacket () - detected exec");
2634 m_gdb_comm.ResetDiscoverableSettings(did_exec);
2659 LLDB_LOG_ERROR(log, list.takeError(),
"Failed to read module list: {0}.");
2661 addr = list->m_link_map;
2681 const size_t n = thread_infos->
GetSize();
2682 for (
size_t i = 0; i < n; ++i) {
2698 xPacketState x_state =
m_gdb_comm.GetxPacketState();
2701 size_t max_memory_size = x_state != xPacketState::Unimplemented
2704 if (size > max_memory_size) {
2708 size = max_memory_size;
2713 packet_len = ::snprintf(packet,
sizeof(packet),
"%c%" PRIx64
",%" PRIx64,
2714 x_state != xPacketState::Unimplemented ?
'x' :
'm',
2715 (uint64_t)addr, (uint64_t)size);
2716 assert(packet_len + 1 < (
int)
sizeof(packet));
2719 if (
m_gdb_comm.SendPacketAndWaitForResponse(packet, response,
2724 if (x_state != xPacketState::Unimplemented) {
2729 llvm::StringRef data_received = response.
GetStringRef();
2730 if (x_state == xPacketState::Prefixed &&
2731 !data_received.consume_front(
"b")) {
2733 "unexpected response to GDB server memory read packet '{0}': "
2735 packet, data_received);
2740 size_t memcpy_size = std::min(size, data_received.size());
2741 memcpy(buf, data_received.data(), memcpy_size);
2745 llvm::MutableArrayRef<uint8_t>((uint8_t *)buf, size),
'\xdd');
2749 "memory read failed for 0x%" PRIx64, addr);
2752 "GDB server does not support reading memory");
2755 "unexpected response to GDB server memory read packet '%s': '%s'",
2764llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
2767 llvm::MutableArrayRef<uint8_t> buffer) {
2771 llvm::Expected<StringExtractorGDBRemote> response =
2775 "MultiMemRead error response: {0}");
2779 llvm::StringRef response_str = response->GetStringRef();
2780 const unsigned expected_num_ranges = ranges.size();
2781 llvm::Expected<llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>>
2784 if (!parsed_response) {
2786 "MultiMemRead error parsing response: {0}");
2789 return std::move(*parsed_response);
2792llvm::Expected<StringExtractorGDBRemote>
2795 std::string packet_str;
2796 llvm::raw_string_ostream stream(packet_str);
2797 stream <<
"MultiMemRead:ranges:";
2799 auto range_to_stream = [&](
auto range) {
2801 stream << llvm::formatv(
"{0:x-},{1:x-}", range.base, range.size);
2803 llvm::interleave(ranges, stream, range_to_stream,
",");
2808 m_gdb_comm.SendPacketAndWaitForResponse(packet_str.data(), response,
2811 return llvm::createStringError(
2812 llvm::formatv(
"MultiMemRead failed to send packet: '{0}'", packet_str));
2815 return llvm::createStringError(
2816 llvm::formatv(
"MultiMemRead failed: '{0}'", response.
GetStringRef()));
2819 return llvm::createStringError(llvm::formatv(
2820 "MultiMemRead unexpected response: '{0}'", response.
GetStringRef()));
2825llvm::Expected<llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>>
2827 llvm::MutableArrayRef<uint8_t> buffer,
2828 unsigned expected_num_ranges) {
2830 auto [sizes_str, memory_data] = response_str.split(
';');
2831 if (sizes_str.size() == response_str.size())
2832 return llvm::createStringError(llvm::formatv(
2833 "MultiMemRead response missing field separator ';' in: '{0}'",
2836 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> read_results;
2839 for (llvm::StringRef size_str : llvm::split(sizes_str,
',')) {
2841 if (size_str.getAsInteger(16, read_size))
2842 return llvm::createStringError(llvm::formatv(
2843 "MultiMemRead response has invalid size string: {0}", size_str));
2845 if (memory_data.size() < read_size)
2846 return llvm::createStringError(
2847 llvm::formatv(
"MultiMemRead response did not have enough data, "
2848 "requested sizes: {0}",
2851 llvm::StringRef region_to_read = memory_data.take_front(read_size);
2852 memory_data = memory_data.drop_front(read_size);
2854 assert(buffer.size() >= read_size);
2855 llvm::MutableArrayRef<uint8_t> region_to_write =
2856 buffer.take_front(read_size);
2857 buffer = buffer.drop_front(read_size);
2859 memcpy(region_to_write.data(), region_to_read.data(), read_size);
2860 read_results.push_back(region_to_write);
2863 return read_results;
2867 return m_gdb_comm.GetMemoryTaggingSupported();
2870llvm::Expected<std::vector<uint8_t>>
2877 return llvm::createStringError(llvm::inconvertibleErrorCode(),
2878 "Error reading memory tags from remote");
2882 llvm::ArrayRef<uint8_t> tag_data = buffer_sp->GetData();
2883 std::vector<uint8_t> got;
2884 got.reserve(tag_data.size());
2885 std::copy(tag_data.begin(), tag_data.end(), std::back_inserter(got));
2891 const std::vector<uint8_t> &tags) {
2894 return m_gdb_comm.WriteMemoryTags(addr, len, type, tags);
2898 std::vector<ObjectFile::LoadableData> entries) {
2908 if (
error.Success())
2922 for (
size_t i = 0; i < size; ++i)
2947 if (blocksize == 0) {
2955 lldb::addr_t block_start_addr = addr - (addr % blocksize);
2956 size += (addr - block_start_addr);
2957 if ((size % blocksize) != 0)
2958 size += (blocksize - size % blocksize);
2974 auto overlap = last_range.GetRangeEnd() - range.
GetRangeBase();
2995 "flash erase failed for 0x%" PRIx64, addr);
2998 "GDB server does not support flashing");
3001 "unexpected response to GDB server flash erase packet '%s': '%s'",
3018 if (
m_gdb_comm.SendPacketAndWaitForResponse(
"vFlashDone", response,
3028 "GDB server does not support flashing");
3031 "unexpected response to GDB server flash done packet: '%s'",
3046 if (size > max_memory_size) {
3050 size = max_memory_size;
3071 if (!
error.Success())
3073 packet.
Printf(
"vFlashWrite:%" PRIx64
":", addr);
3076 packet.
Printf(
"M%" PRIx64
",%" PRIx64
":", addr, (uint64_t)size);
3089 "memory write failed for 0x%" PRIx64, addr);
3092 "GDB server does not support writing memory");
3095 "unexpected response to GDB server memory write packet '%s': '%s'",
3105 uint32_t permissions,
3111 allocated_addr =
m_gdb_comm.AllocateMemory(size, permissions);
3114 return allocated_addr;
3120 if (permissions & lldb::ePermissionsReadable)
3122 if (permissions & lldb::ePermissionsWritable)
3124 if (permissions & lldb::ePermissionsExecutable)
3133 "ProcessGDBRemote::%s no direct stub support for memory "
3134 "allocation, and InferiorCallMmap also failed - is stub "
3135 "missing register context save/restore capability?",
3142 "unable to allocate %" PRIu64
" bytes of memory with permissions %s",
3146 return allocated_addr;
3161 return m_gdb_comm.GetWatchpointReportedAfter();
3168 switch (supported) {
3173 "tried to deallocate memory without ever allocating memory");
3179 "unable to deallocate memory at 0x%" PRIx64, addr);
3191 "unable to deallocate memory at 0x%" PRIx64, addr);
3206 m_gdb_comm.SendStdinNotification(src, src_len);
3213 assert(bp_site !=
nullptr);
3224 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3225 ") address = 0x%" PRIx64,
3226 site_id, (uint64_t)addr);
3231 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3232 ") address = 0x%" PRIx64
" -- SUCCESS (already enabled)",
3233 site_id, (uint64_t)addr);
3252 uint8_t error_no =
m_gdb_comm.SendGDBStoppointTypePacket(
3254 if (error_no == 0) {
3270 if (error_no != UINT8_MAX)
3272 "error: %d sending the breakpoint request", error_no);
3281 LLDB_LOGF(log,
"Software breakpoints are unsupported");
3292 uint8_t error_no =
m_gdb_comm.SendGDBStoppointTypePacket(
3294 if (error_no == 0) {
3305 if (error_no != UINT8_MAX)
3307 "error: %d sending the hardware breakpoint request "
3308 "(hardware breakpoint resources might be exhausted or unavailable)",
3312 "error sending the hardware breakpoint request "
3313 "(hardware breakpoint resources "
3314 "might be exhausted or unavailable)");
3320 LLDB_LOGF(log,
"Hardware breakpoints are unsupported");
3338 assert(bp_site !=
nullptr);
3343 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3344 ") addr = 0x%8.8" PRIx64,
3345 site_id, (uint64_t)addr);
3370 if (
error.Success())
3374 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3375 ") addr = 0x%8.8" PRIx64
" -- SUCCESS (already disabled)",
3376 site_id, (uint64_t)addr);
3380 if (
error.Success())
3389 bool read = wp_res_sp->WatchpointResourceRead();
3390 bool write = wp_res_sp->WatchpointResourceWrite();
3392 assert((read || write) &&
3393 "WatchpointResource type is neither read nor write");
3409 addr_t addr = wp_sp->GetLoadAddress();
3411 LLDB_LOGF(log,
"ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
")",
3413 if (wp_sp->IsEnabled()) {
3415 "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
3416 ") addr = 0x%8.8" PRIx64
": watchpoint already enabled.",
3417 watchID, (uint64_t)addr);
3421 bool read = wp_sp->WatchpointRead();
3422 bool write = wp_sp->WatchpointWrite() || wp_sp->WatchpointModify();
3423 size_t size = wp_sp->GetByteSize();
3426 WatchpointHardwareFeature supported_features =
3429 std::vector<WatchpointResourceSP> resources =
3431 addr, size, read, write, supported_features, target_arch);
3456 bool set_all_resources =
true;
3457 std::vector<WatchpointResourceSP> succesfully_set_resources;
3458 for (
const auto &wp_res_sp : resources) {
3459 addr_t addr = wp_res_sp->GetLoadAddress();
3460 size_t size = wp_res_sp->GetByteSize();
3462 if (!
m_gdb_comm.SupportsGDBStoppointPacket(type) ||
3463 m_gdb_comm.SendGDBStoppointTypePacket(type,
true, addr, size,
3465 set_all_resources =
false;
3468 succesfully_set_resources.push_back(wp_res_sp);
3471 if (set_all_resources) {
3472 wp_sp->SetEnabled(
true, notify);
3473 for (
const auto &wp_res_sp : resources) {
3476 wp_res_sp->AddConstituent(wp_sp);
3484 for (
const auto &wp_res_sp : succesfully_set_resources) {
3485 addr_t addr = wp_res_sp->GetLoadAddress();
3486 size_t size = wp_res_sp->GetByteSize();
3488 m_gdb_comm.SendGDBStoppointTypePacket(type,
false, addr, size,
3492 "Setting one of the watchpoint resources failed");
3508 addr_t addr = wp_sp->GetLoadAddress();
3511 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3512 ") addr = 0x%8.8" PRIx64,
3513 watchID, (uint64_t)addr);
3515 if (!wp_sp->IsEnabled()) {
3517 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3518 ") addr = 0x%8.8" PRIx64
" -- SUCCESS (already disabled)",
3519 watchID, (uint64_t)addr);
3523 wp_sp->SetEnabled(
false, notify);
3527 if (wp_sp->IsHardware()) {
3528 bool disabled_all =
true;
3530 std::vector<WatchpointResourceSP> unused_resources;
3532 if (wp_res_sp->ConstituentsContains(wp_sp)) {
3534 addr_t addr = wp_res_sp->GetLoadAddress();
3535 size_t size = wp_res_sp->GetByteSize();
3536 if (
m_gdb_comm.SendGDBStoppointTypePacket(type,
false, addr, size,
3538 disabled_all =
false;
3540 wp_res_sp->RemoveConstituent(wp_sp);
3541 if (wp_res_sp->GetNumberOfConstituents() == 0)
3542 unused_resources.push_back(wp_res_sp);
3546 for (
auto &wp_res_sp : unused_resources)
3549 wp_sp->SetEnabled(
false, notify);
3552 "Failure disabling one of the watchpoint locations");
3565 LLDB_LOGF(log,
"ProcessGDBRemote::DoSignal (signal = %d)", signo);
3580 if (platform_sp && !platform_sp->IsHost())
3585 const char *error_string =
error.AsCString();
3586 if (error_string ==
nullptr)
3595 static FileSpec g_debugserver_file_spec;
3602 std::string env_debugserver_path = host_env.lookup(
"LLDB_DEBUGSERVER_PATH");
3603 if (!env_debugserver_path.empty()) {
3604 debugserver_file_spec.
SetFile(env_debugserver_path,
3605 FileSpec::Style::native);
3606 LLDB_LOG(log,
"gdb-remote stub exe path set from environment variable: {0}",
3607 env_debugserver_path);
3609 debugserver_file_spec = g_debugserver_file_spec;
3611 return debugserver_file_spec;
3614 debugserver_file_spec = HostInfo::GetSupportExeDir();
3615 if (debugserver_file_spec) {
3618 LLDB_LOG(log,
"found gdb-remote stub exe '{0}'", debugserver_file_spec);
3620 g_debugserver_file_spec = debugserver_file_spec;
3623 if (!debugserver_file_spec) {
3626 LLDB_LOG(log,
"could not find gdb-remote stub exe '{0}'",
3627 debugserver_file_spec);
3631 g_debugserver_file_spec.
Clear();
3634 return debugserver_file_spec;
3639 using namespace std::placeholders;
3649 const std::weak_ptr<ProcessGDBRemote> this_wp =
3650 std::static_pointer_cast<ProcessGDBRemote>(shared_from_this());
3657#if defined(__APPLE__)
3661 int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID,
3663 struct kinfo_proc processInfo;
3664 size_t bufsize =
sizeof(processInfo);
3665 if (sysctl(mib, (
unsigned)(
sizeof(mib) /
sizeof(
int)), &processInfo, &bufsize,
3668 if (processInfo.kp_proc.p_flag & P_TRANSLATED) {
3669 debugserver_path =
FileSpec(
"/Library/Apple/usr/libexec/oah/debugserver");
3676 "'. Please ensure it is properly installed "
3677 "and available in your PATH");
3692 debugserver_launch_info,
nullptr);
3697 LLDB_LOGF(log,
"failed to start debugserver process: %s",
3707 m_gdb_comm.SetConnection(std::make_unique<ConnectionFileDescriptor>(
3708 std::move(socket_pair->second)));
3722 std::weak_ptr<ProcessGDBRemote> process_wp,
lldb::pid_t debugserver_pid,
3731 "ProcessGDBRemote::%s(process_wp, pid=%" PRIu64
3732 ", signo=%i (0x%x), exit_status=%i)",
3733 __FUNCTION__, debugserver_pid, signo, signo, exit_status);
3735 std::shared_ptr<ProcessGDBRemote> process_sp = process_wp.lock();
3736 LLDB_LOGF(log,
"ProcessGDBRemote::%s(process = %p)", __FUNCTION__,
3737 static_cast<void *
>(process_sp.get()));
3738 if (!process_sp || process_sp->m_debugserver_pid != debugserver_pid)
3744 std::this_thread::sleep_for(std::chrono::milliseconds(500));
3748 const StateType state = process_sp->GetState();
3757 llvm::StringRef signal_name =
3758 process_sp->GetUnixSignals()->GetSignalAsStringRef(signo);
3760 if (!signal_name.empty())
3761 stream.
Format(format_str, signal_name);
3763 stream.
Format(format_str, signo);
3765 process_sp->SetExitStatus(-1, stream.
GetString());
3781 static llvm::once_flag g_once_flag;
3783 llvm::call_once(g_once_flag, []() {
3792 debugger, PluginProperties::GetSettingName())) {
3793 const bool is_global_setting =
true;
3796 "Properties for the gdb-remote process plug-in.", is_global_setting);
3803 LLDB_LOGF(log,
"ProcessGDBRemote::%s ()", __FUNCTION__);
3810 llvm::Expected<HostThread> async_thread =
3814 if (!async_thread) {
3816 "failed to launch host thread: {0}");
3822 "ProcessGDBRemote::%s () - Called when Async thread was "
3832 LLDB_LOGF(log,
"ProcessGDBRemote::%s ()", __FUNCTION__);
3847 "ProcessGDBRemote::%s () - Called when Async thread was not running.",
3853 LLDB_LOGF(log,
"ProcessGDBRemote::%s(pid = %" PRIu64
") thread starting...",
3854 __FUNCTION__,
GetID());
3872 "ProcessGDBRemote::%s(pid = %" PRIu64
3873 ") listener.WaitForEvent (NULL, event_sp)...",
3874 __FUNCTION__,
GetID());
3877 const uint32_t event_type = event_sp->GetType();
3880 "ProcessGDBRemote::%s(pid = %" PRIu64
3881 ") Got an event of type: %d...",
3882 __FUNCTION__,
GetID(), event_type);
3884 switch (event_type) {
3889 if (continue_packet) {
3890 const char *continue_cstr =
3891 (
const char *)continue_packet->
GetBytes();
3892 const size_t continue_cstr_len = continue_packet->
GetByteSize();
3894 "ProcessGDBRemote::%s(pid = %" PRIu64
3895 ") got eBroadcastBitAsyncContinue: %s",
3896 __FUNCTION__,
GetID(), continue_cstr);
3898 if (::strstr(continue_cstr,
"vAttach") ==
nullptr)
3905 llvm::StringRef(continue_cstr, continue_cstr_len),
3916 switch (stop_state) {
3929 int exit_status = response.
GetHexU8();
3930 std::string desc_string;
3932 llvm::StringRef desc_str;
3933 llvm::StringRef desc_token;
3935 if (desc_token !=
"description")
3950 if (::strstr(continue_cstr,
"vAttach") !=
nullptr &&
3953 "System Integrity Protection");
3954 }
else if (::strstr(continue_cstr,
"vAttach") !=
nullptr &&
3974 "ProcessGDBRemote::%s(pid = %" PRIu64
3975 ") got eBroadcastBitAsyncThreadShouldExit...",
3976 __FUNCTION__,
GetID());
3982 "ProcessGDBRemote::%s(pid = %" PRIu64
3983 ") got unknown event 0x%8.8x",
3984 __FUNCTION__,
GetID(), event_type);
3991 "ProcessGDBRemote::%s(pid = %" PRIu64
3992 ") listener.WaitForEvent (NULL, event_sp) => false",
3993 __FUNCTION__,
GetID());
3998 LLDB_LOGF(log,
"ProcessGDBRemote::%s(pid = %" PRIu64
") thread exiting...",
3999 __FUNCTION__,
GetID());
4031 LLDB_LOGF(log,
"Hit New Thread Notification breakpoint.");
4037 LLDB_LOG(log,
"Check if need to update ignored signals");
4051 LLDB_LOG(log,
"Signals' version hasn't changed. version={0}",
4056 auto signals_to_ignore =
4061 "Signals' version changed. old version={0}, new version={1}, "
4062 "signals ignored={2}, update result={3}",
4064 signals_to_ignore.size(),
error);
4066 if (
error.Success())
4076 LLDB_LOGF(log,
"Enabled noticing new thread breakpoint.");
4082 platform_sp->SetThreadCreationBreakpoint(
GetTarget());
4086 log,
"Successfully created new thread notification breakpoint %i",
4091 LLDB_LOGF(log,
"Failed to create new thread notification breakpoint.");
4101 LLDB_LOGF(log,
"Disabling new thread notification breakpoint.");
4121 return_value =
m_gdb_comm.SendLaunchEventDataPacket(data, &was_supported);
4122 if (return_value != 0) {
4125 "Sending events is not supported for this process.");
4135 if (
m_gdb_comm.GetQXferAuxvReadSupported()) {
4136 llvm::Expected<std::string> response =
m_gdb_comm.ReadExtFeature(
"auxv",
"");
4138 buf = std::make_shared<DataBufferHeap>(response->c_str(),
4139 response->length());
4150 if (
m_gdb_comm.GetThreadExtendedInfoSupported()) {
4156 args_dict->GetAsDictionary()->AddIntegerItem(
"thread", tid);
4159 packet <<
"jThreadExtendedInfo:";
4160 args_dict->Dump(packet,
false);
4167 packet << (char)(0x7d ^ 0x20);
4176 if (!response.
Empty()) {
4189 args_dict->GetAsDictionary()->AddIntegerItem(
"image_list_address",
4190 image_list_address);
4191 args_dict->GetAsDictionary()->AddIntegerItem(
"image_count", image_count);
4199 args_dict->GetAsDictionary()->AddBooleanItem(
"fetch_all_solibs",
true);
4205 const std::vector<lldb::addr_t> &load_addresses) {
4209 for (
auto addr : load_addresses)
4210 addresses->AddIntegerItem(addr);
4212 args_dict->GetAsDictionary()->AddItem(
"solib_addresses", addresses);
4222 if (
m_gdb_comm.GetLoadedDynamicLibrariesInfosSupported()) {
4225 std::chrono::seconds(10));
4228 packet <<
"jGetLoadedDynamicLibrariesInfos:";
4229 args_dict->Dump(packet,
false);
4236 packet << (char)(0x7d ^ 0x20);
4245 if (!response.
Empty()) {
4258 if (
m_gdb_comm.GetDynamicLoaderProcessStateSupported()) {
4261 if (
m_gdb_comm.SendPacketAndWaitForResponse(
"jGetDyldProcessState",
4267 if (!response.
Empty()) {
4280 if (
m_gdb_comm.GetSharedCacheInfoSupported()) {
4282 packet <<
"jGetSharedCacheInfo:";
4283 args_dict->Dump(packet,
false);
4290 packet << (char)(0x7d ^ 0x20);
4299 if (!response.
Empty()) {
4310 return m_gdb_comm.ConfigureRemoteStructuredData(type_name, config_sp);
4323 const uint64_t reasonable_largeish_default = 128 * 1024;
4324 const uint64_t conservative_default = 512;
4327 uint64_t stub_max_size =
m_gdb_comm.GetRemoteMaxPacketSize();
4328 if (stub_max_size !=
UINT64_MAX && stub_max_size != 0) {
4334 if (stub_max_size > reasonable_largeish_default) {
4335 stub_max_size = reasonable_largeish_default;
4341 if (stub_max_size > 70)
4342 stub_max_size -= 32 + 32 + 6;
4348 log->
Warning(
"Packet size is too small. "
4349 "LLDB may face problems while writing memory");
4360 uint64_t user_specified_max) {
4361 if (user_specified_max != 0) {
4389 module_spec = cached->second;
4390 return bool(module_spec);
4393 if (!
m_gdb_comm.GetModuleInfo(module_file_spec, arch, module_spec)) {
4394 LLDB_LOGF(log,
"ProcessGDBRemote::%s - failed to get module info for %s:%s",
4395 __FUNCTION__, module_file_spec.
GetPath().c_str(),
4402 module_spec.
Dump(stream);
4403 LLDB_LOGF(log,
"ProcessGDBRemote::%s - got module info for (%s:%s) : %s",
4404 __FUNCTION__, module_file_spec.
GetPath().c_str(),
4413 llvm::ArrayRef<FileSpec> module_file_specs,
const llvm::Triple &triple) {
4414 auto module_specs =
m_gdb_comm.GetModulesInfo(module_file_specs, triple);
4416 for (
const FileSpec &spec : module_file_specs)
4421 triple.getTriple())] = spec;
4435typedef std::vector<std::string> stringVec;
4437typedef std::vector<struct GdbServerRegisterInfo> GDBServerRegisterVec;
4438struct RegisterSetInfo {
4442typedef std::map<uint32_t, RegisterSetInfo> RegisterSetMap;
4444struct GdbServerTargetInfo {
4448 RegisterSetMap reg_set_map;
4465 std::map<uint64_t, FieldEnum::Enumerator> enumerators;
4468 "evalue", [&enumerators, &log](
const XMLNode &enumerator_node) {
4469 std::optional<llvm::StringRef> name;
4470 std::optional<uint64_t> value;
4473 [&name, &value, &log](
const llvm::StringRef &attr_name,
4474 const llvm::StringRef &attr_value) {
4475 if (attr_name ==
"name") {
4476 if (attr_value.size())
4479 LLDB_LOG(log,
"ProcessGDBRemote::ParseEnumEvalues "
4480 "Ignoring empty name in evalue");
4481 }
else if (attr_name ==
"value") {
4482 uint64_t parsed_value = 0;
4483 if (llvm::to_integer(attr_value, parsed_value))
4484 value = parsed_value;
4487 "ProcessGDBRemote::ParseEnumEvalues "
4488 "Invalid value \"{0}\" in "
4493 "ProcessGDBRemote::ParseEnumEvalues Ignoring "
4494 "unknown attribute "
4495 "\"{0}\" in evalue",
4503 enumerators.insert_or_assign(
4504 *value, FieldEnum::Enumerator(*value, name->str()));
4511 for (
auto [_, enumerator] : enumerators)
4512 final_enumerators.push_back(enumerator);
4514 return final_enumerators;
4518ParseEnums(XMLNode feature_node,
4519 llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4520 Log *log(
GetLog(GDBRLog::Process));
4524 "enum", [log, ®isters_enum_types](
const XMLNode &enum_node) {
4528 const llvm::StringRef &attr_value) {
4529 if (attr_name ==
"id")
4547 if (!enumerators.empty()) {
4549 "ProcessGDBRemote::ParseEnums Found enum type \"{0}\"",
4551 registers_enum_types.insert_or_assign(
4552 id, std::make_unique<FieldEnum>(
id, enumerators));
4561static std::vector<RegisterFlags::Field> ParseFlagsFields(
4562 XMLNode flags_node,
unsigned size,
4563 const llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4564 Log *log(
GetLog(GDBRLog::Process));
4565 const unsigned max_start_bit = size * 8 - 1;
4568 std::vector<RegisterFlags::Field> fields;
4570 ®isters_enum_types](
4573 std::optional<llvm::StringRef> name;
4574 std::optional<unsigned> start;
4575 std::optional<unsigned> end;
4576 std::optional<llvm::StringRef> type;
4579 &log](
const llvm::StringRef &attr_name,
4580 const llvm::StringRef &attr_value) {
4583 if (attr_name ==
"name") {
4586 "ProcessGDBRemote::ParseFlagsFields Found field node name \"{0}\"",
4589 }
else if (attr_name ==
"start") {
4590 unsigned parsed_start = 0;
4591 if (llvm::to_integer(attr_value, parsed_start)) {
4592 if (parsed_start > max_start_bit) {
4594 "ProcessGDBRemote::ParseFlagsFields Invalid start {0} in "
4597 parsed_start, max_start_bit);
4599 start = parsed_start;
4603 "ProcessGDBRemote::ParseFlagsFields Invalid start \"{0}\" in "
4607 }
else if (attr_name ==
"end") {
4608 unsigned parsed_end = 0;
4609 if (llvm::to_integer(attr_value, parsed_end))
4610 if (parsed_end > max_start_bit) {
4612 "ProcessGDBRemote::ParseFlagsFields Invalid end {0} in "
4615 parsed_end, max_start_bit);
4620 "ProcessGDBRemote::ParseFlagsFields Invalid end \"{0}\" in "
4624 }
else if (attr_name ==
"type") {
4629 "ProcessGDBRemote::ParseFlagsFields Ignoring unknown attribute "
4630 "\"{0}\" in field node",
4637 if (name && start && end) {
4641 "ProcessGDBRemote::ParseFlagsFields Start {0} > end {1} in field "
4642 "\"{2}\", ignoring",
4643 *start, *end, name->data());
4647 "ProcessGDBRemote::ParseFlagsFields Ignoring field \"{2}\" "
4649 "size > 64 bits, this is not supported",
4653 const FieldEnum *enum_type =
nullptr;
4654 if (type && !type->empty()) {
4655 auto found = registers_enum_types.find(*type);
4656 if (found != registers_enum_types.end()) {
4657 enum_type = found->second.get();
4660 uint64_t max_value =
4663 if (enumerator.m_value > max_value) {
4664 enum_type =
nullptr;
4667 "ProcessGDBRemote::ParseFlagsFields In enum \"{0}\" "
4668 "evalue \"{1}\" with value {2} exceeds the maximum value "
4669 "of field \"{3}\" ({4}), ignoring enum",
4670 type->data(), enumerator.m_name, enumerator.m_value,
4671 name->data(), max_value);
4677 "ProcessGDBRemote::ParseFlagsFields Could not find type "
4679 "for field \"{1}\", ignoring",
4680 type->data(), name->data());
4685 RegisterFlags::Field(name->str(), *start, *end, enum_type));
4696 XMLNode feature_node,
4697 llvm::StringMap<std::unique_ptr<RegisterFlags>> ®isters_flags_types,
4698 const llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4699 Log *log(
GetLog(GDBRLog::Process));
4703 [&log, ®isters_flags_types,
4704 ®isters_enum_types](
const XMLNode &flags_node) ->
bool {
4705 LLDB_LOG(log,
"ProcessGDBRemote::ParseFlags Found flags node \"{0}\"",
4708 std::optional<llvm::StringRef>
id;
4709 std::optional<unsigned> size;
4711 [&
id, &size, &log](
const llvm::StringRef &name,
4712 const llvm::StringRef &value) {
4715 }
else if (name ==
"size") {
4716 unsigned parsed_size = 0;
4717 if (llvm::to_integer(value, parsed_size))
4721 "ProcessGDBRemote::ParseFlags Invalid size \"{0}\" "
4727 "ProcessGDBRemote::ParseFlags Ignoring unknown "
4728 "attribute \"{0}\" in flags node",
4736 std::vector<RegisterFlags::Field> fields =
4737 ParseFlagsFields(flags_node, *size, registers_enum_types);
4738 if (fields.size()) {
4740 std::sort(fields.rbegin(), fields.rend());
4741 std::vector<RegisterFlags::Field>::const_iterator overlap =
4742 std::adjacent_find(fields.begin(), fields.end(),
4743 [](
const RegisterFlags::Field &lhs,
4744 const RegisterFlags::Field &rhs) {
4745 return lhs.Overlaps(rhs);
4749 if (overlap == fields.end()) {
4750 if (registers_flags_types.contains(*
id)) {
4764 "ProcessGDBRemote::ParseFlags Definition of flags "
4766 "previous definition, using original definition instead.",
4769 registers_flags_types.insert_or_assign(
4770 *
id, std::make_unique<RegisterFlags>(
id->str(), *size,
4771 std::move(fields)));
4775 std::vector<RegisterFlags::Field>::const_iterator next =
4779 "ProcessGDBRemote::ParseFlags Ignoring flags because fields "
4780 "{0} (start: {1} end: {2}) and {3} (start: {4} end: {5}) "
4782 overlap->GetName().c_str(), overlap->GetStart(),
4783 overlap->GetEnd(), next->GetName().c_str(), next->GetStart(),
4789 "ProcessGDBRemote::ParseFlags Ignoring definition of flags "
4790 "\"{0}\" because it contains no fields.",
4800 XMLNode feature_node, GdbServerTargetInfo &target_info,
4801 std::vector<DynamicRegisterInfo::Register> ®isters,
4802 llvm::StringMap<std::unique_ptr<RegisterFlags>> ®isters_flags_types,
4803 llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4807 Log *log(
GetLog(GDBRLog::Process));
4810 ParseEnums(feature_node, registers_enum_types);
4811 for (
const auto &enum_type : registers_enum_types)
4814 ParseFlags(feature_node, registers_flags_types, registers_enum_types);
4815 for (
const auto &flags : registers_flags_types)
4816 flags.second->DumpToLog(log);
4820 [&target_info, ®isters, ®isters_flags_types,
4821 log](
const XMLNode ®_node) ->
bool {
4822 std::string gdb_group;
4823 std::string gdb_type;
4824 DynamicRegisterInfo::Register reg_info;
4825 bool encoding_set =
false;
4826 bool format_set =
false;
4830 &encoding_set, &format_set, ®_info,
4831 log](
const llvm::StringRef &name,
4832 const llvm::StringRef &value) ->
bool {
4833 if (name ==
"name") {
4835 }
else if (name ==
"bitsize") {
4836 if (llvm::to_integer(value, reg_info.
byte_size))
4838 llvm::divideCeil(reg_info.
byte_size, CHAR_BIT);
4839 }
else if (name ==
"type") {
4840 gdb_type = value.str();
4841 }
else if (name ==
"group") {
4842 gdb_group = value.str();
4843 }
else if (name ==
"regnum") {
4845 }
else if (name ==
"offset") {
4847 }
else if (name ==
"altname") {
4849 }
else if (name ==
"encoding") {
4850 encoding_set =
true;
4852 }
else if (name ==
"format") {
4858 llvm::StringSwitch<lldb::Format>(value)
4869 }
else if (name ==
"group_id") {
4871 llvm::to_integer(value, set_id);
4872 RegisterSetMap::const_iterator pos =
4873 target_info.reg_set_map.find(set_id);
4874 if (pos != target_info.reg_set_map.end())
4875 reg_info.
set_name = pos->second.name;
4876 }
else if (name ==
"gcc_regnum" || name ==
"ehframe_regnum") {
4878 }
else if (name ==
"dwarf_regnum") {
4880 }
else if (name ==
"generic") {
4882 }
else if (name ==
"value_regnums") {
4885 }
else if (name ==
"invalidate_regnums") {
4890 "ProcessGDBRemote::ParseRegisters unhandled reg "
4891 "attribute %s = %s",
4892 name.data(), value.data());
4897 if (!gdb_type.empty()) {
4899 llvm::StringMap<std::unique_ptr<RegisterFlags>>::iterator it =
4900 registers_flags_types.find(gdb_type);
4901 if (it != registers_flags_types.end()) {
4902 auto flags_type = it->second.get();
4903 if (reg_info.
byte_size == flags_type->GetSize())
4907 "ProcessGDBRemote::ParseRegisters Size of register "
4908 "flags %s (%d bytes) for "
4909 "register %s does not match the register size (%d "
4910 "bytes). Ignoring this set of flags.",
4911 flags_type->GetID().c_str(), flags_type->GetSize(),
4918 if (!gdb_type.empty() && !(encoding_set || format_set)) {
4919 if (llvm::StringRef(gdb_type).starts_with(
"int")) {
4922 }
else if (gdb_type ==
"data_ptr" || gdb_type ==
"code_ptr") {
4925 }
else if (gdb_type ==
"float" || gdb_type ==
"ieee_single" ||
4926 gdb_type ==
"ieee_double") {
4929 }
else if (gdb_type ==
"aarch64v" ||
4930 llvm::StringRef(gdb_type).starts_with(
"vec") ||
4931 gdb_type ==
"i387_ext" || gdb_type ==
"uint128" ||
4944 "ProcessGDBRemote::ParseRegisters Could not determine lldb"
4945 "format and encoding for gdb type %s",
4955 if (!gdb_group.empty()) {
4966 "ProcessGDBRemote::%s Skipping zero bitsize register %s",
4969 registers.push_back(reg_info);
4984 ArchSpec &arch_to_use, std::string xml_filename,
4985 std::vector<DynamicRegisterInfo::Register> ®isters) {
4987 llvm::Expected<std::string> raw =
m_gdb_comm.ReadExtFeature(
"features", xml_filename);
4988 if (errorToBool(raw.takeError()))
4993 if (xml_document.
ParseMemory(raw->c_str(), raw->size(),
4994 xml_filename.c_str())) {
4995 GdbServerTargetInfo target_info;
4996 std::vector<XMLNode> feature_nodes;
5002 const XMLNode &node) ->
bool {
5003 llvm::StringRef name = node.
GetName();
5004 if (name ==
"architecture") {
5006 }
else if (name ==
"osabi") {
5008 }
else if (name ==
"xi:include" || name ==
"include") {
5011 target_info.includes.push_back(href);
5012 }
else if (name ==
"feature") {
5013 feature_nodes.push_back(node);
5014 }
else if (name ==
"groups") {
5016 "group", [&target_info](
const XMLNode &node) ->
bool {
5018 RegisterSetInfo set_info;
5021 [&set_id, &set_info](
const llvm::StringRef &name,
5022 const llvm::StringRef &value) ->
bool {
5025 llvm::to_integer(value, set_id);
5032 target_info.reg_set_map[set_id] = set_info;
5045 feature_nodes.push_back(feature_node);
5047 const XMLNode &node) ->
bool {
5048 llvm::StringRef name = node.
GetName();
5049 if (name ==
"xi:include" || name ==
"include") {
5052 target_info.includes.push_back(href);
5066 if (!arch_to_use.
IsValid() && !target_info.arch.empty()) {
5068 arch_to_use.
SetTriple(llvm::StringSwitch<std::string>(target_info.arch)
5069 .Case(
"i386:x86-64",
"x86_64")
5070 .Case(
"riscv:rv64",
"riscv64")
5071 .Case(
"riscv:rv32",
"riscv32")
5072 .Default(target_info.arch) +
5080 for (
auto &feature_node : feature_nodes) {
5081 ParseRegisters(feature_node, target_info, registers,
5085 for (
const auto &include : target_info.includes) {
5097 std::vector<DynamicRegisterInfo::Register> ®isters,
5099 std::map<uint32_t, uint32_t> remote_to_local_map;
5100 uint32_t remote_regnum = 0;
5101 for (
auto it : llvm::enumerate(registers)) {
5109 remote_to_local_map[remote_reg_info.
regnum_remote] = it.index();
5115 auto proc_to_lldb = [&remote_to_local_map](uint32_t process_regnum) {
5116 auto lldb_regit = remote_to_local_map.find(process_regnum);
5117 return lldb_regit != remote_to_local_map.end() ? lldb_regit->second
5121 llvm::transform(remote_reg_info.value_regs,
5122 remote_reg_info.value_regs.begin(), proc_to_lldb);
5123 llvm::transform(remote_reg_info.invalidate_regs,
5124 remote_reg_info.invalidate_regs.begin(), proc_to_lldb);
5131 abi_sp->AugmentRegisterInfo(registers);
5144 if (!
m_gdb_comm.GetQXferFeaturesReadSupported())
5155 std::vector<DynamicRegisterInfo::Register> registers;
5168 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5169 "XML parsing not available");
5172 LLDB_LOGF(log,
"ProcessGDBRemote::%s", __FUNCTION__);
5181 llvm::Expected<std::string> raw = comm.
ReadExtFeature(
"libraries-svr4",
"");
5183 return raw.takeError();
5186 LLDB_LOGF(log,
"parsing: %s", raw->c_str());
5189 if (!doc.
ParseMemory(raw->c_str(), raw->size(),
"noname.xml"))
5190 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5191 "Error reading noname.xml");
5195 return llvm::createStringError(
5196 llvm::inconvertibleErrorCode(),
5197 "Error finding library-list-svr4 xml element");
5202 if (!main_lm.empty())
5206 "library", [log, &list](
const XMLNode &library) ->
bool {
5211 [&module](
const llvm::StringRef &name,
5212 const llvm::StringRef &value) ->
bool {
5215 module.set_name(value.str());
5216 else if (name ==
"lm") {
5218 llvm::to_integer(value, uint_value);
5219 module.set_link_map(uint_value);
5220 }
else if (name ==
"l_addr") {
5223 llvm::to_integer(value, uint_value);
5224 module.set_base(uint_value);
5227 module.set_base_is_offset(true);
5228 }
else if (name ==
"l_ld") {
5230 llvm::to_integer(value, uint_value);
5231 module.set_dynamic(uint_value);
5240 bool base_is_offset;
5242 module.get_name(name);
5243 module.get_link_map(lm);
5244 module.get_base(base);
5245 module.get_base_is_offset(base_is_offset);
5246 module.get_dynamic(ld);
5249 "found (link_map:0x%08" PRIx64
", base:0x%08" PRIx64
5250 "[%s], ld:0x%08" PRIx64
", name:'%s')",
5251 lm, base, (base_is_offset ?
"offset" :
"absolute"), ld,
5261 LLDB_LOGF(log,
"found %" PRId32
" modules in total",
5262 (
int)list.
m_list.size());
5266 llvm::Expected<std::string> raw = comm.
ReadExtFeature(
"libraries",
"");
5269 return raw.takeError();
5271 LLDB_LOGF(log,
"parsing: %s", raw->c_str());
5274 if (!doc.
ParseMemory(raw->c_str(), raw->size(),
"noname.xml"))
5275 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5276 "Error reading noname.xml");
5280 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5281 "Error finding library-list xml element");
5285 "library", [log, &list](
const XMLNode &library) ->
bool {
5289 module.set_name(name);
5298 llvm::to_integer(address, address_value);
5299 module.set_base(address_value);
5301 module.set_base_is_offset(false);
5306 bool base_is_offset;
5307 module.get_name(name);
5308 module.get_base(base);
5309 module.get_base_is_offset(base_is_offset);
5311 LLDB_LOGF(log,
"found (base:0x%08" PRIx64
"[%s], name:'%s')", base,
5312 (base_is_offset ?
"offset" :
"absolute"), name.c_str());
5321 LLDB_LOGF(log,
"found %" PRId32
" modules in total",
5322 (
int)list.
m_list.size());
5325 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5326 "Remote libraries not supported");
5333 bool value_is_offset) {
5348 return module_list.takeError();
5354 std::string mod_name;
5357 bool mod_base_is_offset;
5360 valid &= modInfo.
get_name(mod_name);
5361 valid &= modInfo.
get_base(mod_base);
5374 if (module_sp.get())
5375 new_modules.
Append(module_sp);
5378 if (new_modules.
GetSize() > 0) {
5383 for (
size_t i = 0; i < loaded_modules.
GetSize(); ++i) {
5387 for (
size_t j = 0; j < new_modules.
GetSize(); ++j) {
5396 removed_modules.
Append(loaded_module);
5400 loaded_modules.
Remove(removed_modules);
5401 m_process->GetTarget().ModulesDidUnload(removed_modules,
false);
5417 m_process->GetTarget().ModulesDidLoad(new_modules);
5420 return llvm::ErrorSuccess();
5429 std::string file_path = file.
GetPath(
false);
5430 if (file_path.empty())
5451 "Fetching file load address from remote server returned an error");
5461 "Unknown error happened during sending the load address packet");
5482 std::string input = data.str();
5489 size_t found, pos = 0, len = input.length();
5490 while ((found = input.find(
end_delimiter, pos)) != std::string::npos) {
5492 input.substr(pos, found).c_str());
5493 std::string profile_data =
5508 std::map<uint64_t, uint32_t> new_thread_id_to_used_usec_map;
5510 llvm::raw_string_ostream output_stream(output);
5511 llvm::StringRef name, value;
5515 if (name.compare(
"thread_used_id") == 0) {
5517 uint64_t thread_id = threadIDHexExtractor.
GetHexMaxU64(
false, 0);
5519 bool has_used_usec =
false;
5520 uint32_t curr_used_usec = 0;
5521 llvm::StringRef usec_name, usec_value;
5522 uint32_t input_file_pos = profileDataExtractor.
GetFilePos();
5524 if (usec_name ==
"thread_used_usec") {
5525 has_used_usec =
true;
5526 usec_value.getAsInteger(0, curr_used_usec);
5530 profileDataExtractor.
SetFilePos(input_file_pos);
5534 if (has_used_usec) {
5535 uint32_t prev_used_usec = 0;
5536 std::map<uint64_t, uint32_t>::iterator iterator =
5539 prev_used_usec = iterator->second;
5541 uint32_t real_used_usec = curr_used_usec - prev_used_usec;
5543 bool good_first_time =
5544 (prev_used_usec == 0) && (real_used_usec > 250000);
5545 bool good_subsequent_time =
5546 (prev_used_usec > 0) &&
5549 if (good_first_time || good_subsequent_time) {
5553 output_stream << name <<
":";
5555 output_stream << index_id <<
";";
5557 output_stream << usec_name <<
":" << usec_value <<
";";
5560 llvm::StringRef local_name, local_value;
5566 new_thread_id_to_used_usec_map[thread_id] = curr_used_usec;
5569 output_stream << name <<
":" << value <<
";";
5572 output_stream << name <<
":" << value <<
";";
5607 return llvm::createStringError(
5608 llvm::inconvertibleErrorCode(),
5609 llvm::formatv(
"qSaveCore returned an error"));
5614 for (
auto x : llvm::split(response.
GetStringRef(),
';')) {
5615 if (x.consume_front(
"core-path:"))
5621 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5622 "qSaveCore returned no core path");
5625 FileSpec remote_core{llvm::StringRef(path)};
5631 platform.
Unlink(remote_core);
5633 return error.ToError();
5639 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5640 "Unable to send qSaveCore");
5653 "GDBRemoteCommunicationClientBase::%s() received $J packet "
5654 "but was not a StructuredData packet: packet starts with "
5667 json_sp->Dump(json_str,
true);
5670 "ProcessGDBRemote::%s() "
5671 "received Async StructuredData packet: %s",
5672 __FUNCTION__, json_str.
GetData());
5675 "ProcessGDBRemote::%s"
5676 "() received StructuredData packet:"
5686 if (structured_data_sp)
5694 "Tests packet speeds of various sizes to determine "
5695 "the performance characteristics of the GDB remote "
5700 "The number of packets to send of each varying size "
5701 "(default is 1000).",
5704 "The maximum number of bytes to send in a packet. Sizes "
5705 "increase in powers of 2 while the size is less than or "
5706 "equal to this option value. (default 1024).",
5709 "The maximum number of bytes to receive in a packet. Sizes "
5710 "increase in powers of 2 while the size is less than or "
5711 "equal to this option value. (default 1024).",
5714 "Print the output as JSON data for easy parsing.", false, true) {
5734 if (!output_stream_sp)
5735 output_stream_sp =
m_interpreter.GetDebugger().GetAsyncOutputStream();
5738 const uint32_t num_packets =
5740 const uint64_t max_send =
m_max_send.GetOptionValue().GetCurrentValue();
5741 const uint64_t max_recv =
m_max_recv.GetOptionValue().GetCurrentValue();
5742 const bool json =
m_json.GetOptionValue().GetCurrentValue();
5743 const uint64_t k_recv_amount =
5746 num_packets, max_send, max_recv, k_recv_amount, json,
5771 "Dumps the packet history buffer. ", nullptr) {}
5792 interpreter,
"process plugin packet xfer-size",
5793 "Maximum size that lldb will try to read/write one one chunk.",
5804 "amount to be transferred when "
5815 uint64_t user_specified_max = strtoul(packet_size,
nullptr, 10);
5816 if (errno == 0 && user_specified_max != 0) {
5831 "Send a custom packet through the GDB remote "
5832 "protocol and print the answer. "
5833 "The packet header and footer will automatically "
5834 "be added to the packet prior to sending and "
5835 "stripped from the result.",
5846 "'%s' takes a one or more packet content arguments",
5854 for (
size_t i = 0; i < argc; ++i) {
5861 output_strm.
Printf(
" packet: %s\n", packet_cstr);
5862 std::string response_str = std::string(response.
GetStringRef());
5864 if (strstr(packet_cstr,
"qGetProfileData") !=
nullptr) {
5868 if (response_str.empty())
5869 output_strm.
PutCString(
"response: \nerror: UNIMPLEMENTED\n");
5882 "Send a qRcmd packet through the GDB remote protocol "
5883 "and print the response. "
5884 "The argument passed to this command will be hex "
5885 "encoded into a valid 'qRcmd' packet, sent and the "
5886 "response will be printed.") {}
5892 if (command.empty()) {
5909 [&output_strm](llvm::StringRef output) { output_strm << output; });
5912 const std::string &response_str = std::string(response.
GetStringRef());
5914 if (response_str.empty())
5915 output_strm.
PutCString(
"response: \nerror: UNIMPLEMENTED\n");
5927 "Commands that deal with GDB remote packets.",
5956 interpreter,
"process plugin",
5957 "Commands for operating on a ProcessGDBRemote process.",
5958 "process plugin <subcommand> [<subcommand-options>]") {
5969 m_command_sp = std::make_shared<CommandObjectMultiwordProcessGDBRemote>(
5970 GetTarget().GetDebugger().GetCommandInterpreter());
5999 addr_t addr = wp_res_sp->GetLoadAddress();
6000 size_t size = wp_res_sp->GetByteSize();
6002 m_gdb_comm.SendGDBStoppointTypePacket(type, enable, addr, size,
6020 follow_pid = parent_pid;
6021 follow_tid = parent_tid;
6022 detach_pid = child_pid;
6023 detach_tid = child_tid;
6026 follow_pid = child_pid;
6027 follow_tid = child_tid;
6028 detach_pid = parent_pid;
6029 detach_tid = parent_tid;
6034 if (!
m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
6035 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to set pid/tid");
6049 if (!
m_gdb_comm.SetCurrentThread(follow_tid, follow_pid) ||
6050 !
m_gdb_comm.SetCurrentThreadForRun(follow_tid, follow_pid)) {
6051 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to reset pid/tid");
6055 LLDB_LOG(log,
"Detaching process {0}", detach_pid);
6058 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() detach packet send failed: {0}",
6059 error.AsCString() ?
error.AsCString() :
"<unknown error>");
6077 "ProcessGDBRemote::DidFork() called for child_pid: {0}, child_tid {1}",
6078 child_pid, child_tid);
6090 detach_pid = child_pid;
6091 detach_tid = child_tid;
6094 detach_pid =
m_gdb_comm.GetCurrentProcessID();
6100 if (!
m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
6101 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to set pid/tid");
6109 if (!
m_gdb_comm.SetCurrentThread(child_tid, child_pid) ||
6110 !
m_gdb_comm.SetCurrentThreadForRun(child_tid, child_pid)) {
6111 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to reset pid/tid");
6117 LLDB_LOG(log,
"Detaching process {0}", detach_pid);
6121 "ProcessGDBRemote::DidFork() detach packet send failed: {0}",
6122 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)
Associates a file descriptor with the process' STDIO handling and configures an asynchronous reading ...
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
ThreadList m_thread_list
The threads for this process as the user will see them.
const lldb::UnixSignalsSP & GetUnixSignals()
std::weak_ptr< Target > m_target_wp
The target that owns this process.
virtual llvm::SmallVector< llvm::MutableArrayRef< uint8_t > > ReadMemoryRanges(llvm::ArrayRef< Range< lldb::addr_t, size_t > > ranges, llvm::MutableArrayRef< uint8_t > buffer)
Read from multiple memory ranges and write the results into buffer.
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
Locate the memory region that contains load_addr.
friend class DynamicLoader
size_t GetSoftwareBreakpointTrapOpcode(BreakpointSite *bp_site)
ThreadedCommunication m_stdio_communication
Target & GetTarget()
Get the target object pointer for this module.
lldb::OptionValuePropertiesSP GetValueProperties() const
A pseudo terminal helper class.
llvm::Error OpenFirstAvailablePrimary(int oflag)
Open the first available pseudo terminal.
@ invalid_fd
Invalid file descriptor value.
int GetPrimaryFileDescriptor() const
The primary file descriptor accessor.
int ReleasePrimaryFileDescriptor()
Release the primary file descriptor.
std::string GetSecondaryName() const
Get the name of the secondary pseudo terminal.
uint64_t GetMaxValue() const
The maximum unsigned value that could be contained in this field.
unsigned GetSizeInBits() const
Get size of the field in bits. Will always be at least 1.
virtual StructuredData::DictionarySP GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, const char *setting_name, lldb_private::Status &error)
virtual StructuredData::ObjectSP LoadPluginModule(const FileSpec &file_spec, lldb_private::Status &error)
Status CompleteSending(lldb::pid_t child_pid)
shared_fd_t GetSendableFD()
static llvm::Expected< Pair > CreatePair(std::optional< SocketProtocol > protocol=std::nullopt)
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
bool Success() const
Test for success condition.
static lldb::StopInfoSP CreateStopReasonWithMachException(Thread &thread, uint32_t exc_type, uint32_t exc_data_count, uint64_t exc_code, uint64_t exc_sub_code, uint64_t exc_sub_sub_code, bool pc_already_adjusted=true, bool adjust_pc_if_needed=false)
static lldb::StopInfoSP CreateStopReasonToTrace(Thread &thread)
static lldb::StopInfoSP CreateStopReasonVFork(Thread &thread, lldb::pid_t child_pid, lldb::tid_t child_tid)
static lldb::StopInfoSP CreateStopReasonWithInterrupt(Thread &thread, int signo, const char *description)
static lldb::StopInfoSP CreateStopReasonWithSignal(Thread &thread, int signo, const char *description=nullptr, std::optional< int > code=std::nullopt)
static lldb::StopInfoSP CreateStopReasonFork(Thread &thread, lldb::pid_t child_pid, lldb::tid_t child_tid)
static lldb::StopInfoSP CreateStopReasonVForkDone(Thread &thread)
static lldb::StopInfoSP CreateStopReasonWithWatchpointID(Thread &thread, lldb::break_id_t watch_id, bool silently_continue=false)
static lldb::StopInfoSP CreateStopReasonWithException(Thread &thread, const char *description)
static lldb::StopInfoSP CreateStopReasonWithBreakpointSiteID(Thread &thread, lldb::break_id_t break_id)
static lldb::StopInfoSP CreateStopReasonHistoryBoundary(Thread &thread, const char *description)
static lldb::StopInfoSP CreateStopReasonProcessorTrace(Thread &thread, const char *description)
static lldb::StopInfoSP CreateStopReasonWithExec(Thread &thread)
void ForEach(std::function< void(StopPointSite *)> const &callback)
General Outline: When we hit a breakpoint we need to package up whatever information is needed to eva...
lldb::break_id_t GetID() const
virtual lldb::addr_t GetLoadAddress() const
bool HardwareRequired() const
int PutEscapedBytes(const void *s, size_t src_len)
Output a block of data to the stream performing GDB-remote escaping.
const char * GetData() const
void Flush() override
Flush the stream.
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
void Format(const char *format, Args &&... args)
size_t PutStringAsRawHex8(llvm::StringRef s)
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
size_t PutBytesAsRawHex8(const void *src, size_t src_len, lldb::ByteOrder src_byte_order=lldb::eByteOrderInvalid, lldb::ByteOrder dst_byte_order=lldb::eByteOrderInvalid)
ObjectSP GetItemAtIndex(size_t idx) const
bool ForEach(std::function< bool(Object *object)> const &foreach_callback) const
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result) const
void ForEach(std::function< bool(llvm::StringRef key, Object *object)> const &callback) const
Dictionary * GetAsDictionary()
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
static ObjectSP ParseJSON(llvm::StringRef json_text)
std::shared_ptr< Array > ArraySP
A plug-in interface definition class for system runtimes.
virtual void AddThreadExtendedInfoPacketHints(lldb_private::StructuredData::ObjectSP dict)
Add key-value pairs to the StructuredData dictionary object with information debugserver may need whe...
Module * GetExecutableModulePointer()
Debugger & GetDebugger() const
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
lldb::PlatformSP GetPlatform()
const ArchSpec & GetArchitecture() const
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
bool MergeArchitecture(const ArchSpec &arch_spec)
void AddThreadSortedByIndexID(const lldb::ThreadSP &thread_sp)
static llvm::Expected< HostThread > LaunchThread(llvm::StringRef name, std::function< lldb::thread_result_t()> thread_function, size_t min_stack_byte_size=0)
uint32_t GetSize(bool can_update=true)
lldb::ThreadSP GetThreadAtIndex(uint32_t idx, bool can_update=true)
lldb::ThreadSP RemoveThreadByProtocolID(lldb::tid_t tid, bool can_update=true)
Represents UUID's of various sizes.
static lldb::UnixSignalsSP Create(const ArchSpec &arch)
static std::vector< lldb::WatchpointResourceSP > AtomizeWatchpointRequest(lldb::addr_t addr, size_t size, bool read, bool write, WatchpointHardwareFeature supported_features, ArchSpec &arch)
Convert a user's watchpoint request into an array of memory regions, each region watched by one hardw...
XMLNode GetRootElement(const char *required_name=nullptr)
bool ParseMemory(const char *xml, size_t xml_length, const char *url="untitled.xml")
void ForEachChildElement(NodeCallback const &callback) const
llvm::StringRef GetName() const
bool GetElementText(std::string &text) const
std::string GetAttributeValue(const char *name, const char *fail_value=nullptr) const
void ForEachChildElementWithName(const char *name, NodeCallback const &callback) const
XMLNode FindFirstChildElementWithName(const char *name) const
void ForEachAttribute(AttributeCallback const &callback) const
@ eBroadcastBitRunPacketSent
PacketResult SendPacketAndReceiveResponseWithOutputSupport(llvm::StringRef payload, StringExtractorGDBRemote &response, std::chrono::seconds interrupt_timeout, llvm::function_ref< void(llvm::StringRef)> output_callback)
PacketResult SendPacketAndWaitForResponse(llvm::StringRef payload, StringExtractorGDBRemote &response, std::chrono::seconds interrupt_timeout=std::chrono::seconds(0), bool sync_on_timeout=true)
lldb::StateType SendContinuePacketAndWaitForResponse(ContinueDelegate &delegate, const UnixSignals &signals, llvm::StringRef payload, std::chrono::seconds interrupt_timeout, StringExtractorGDBRemote &response)
llvm::Expected< std::string > ReadExtFeature(llvm::StringRef object, llvm::StringRef annex)
void TestPacketSpeed(const uint32_t num_packets, uint32_t max_send, uint32_t max_recv, uint64_t recv_amount, bool json, Stream &strm)
bool GetQXferLibrariesSVR4ReadSupported()
bool GetQXferLibrariesReadSupported()
void DumpHistory(Stream &strm)
Status FlashErase(lldb::addr_t addr, size_t size)
Status DisableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true) override
friend class ThreadGDBRemote
DataExtractor GetAuxvData() override
GDBRemoteCommunicationClient & GetGDBRemote()
Status DoConnectRemote(llvm::StringRef remote_url) override
Attach to a remote system via a URL.
void HandleAsyncStructuredDataPacket(llvm::StringRef data) override
Process asynchronously-received structured data.
void KillDebugserverProcess()
Status DoDestroy() override
Status LaunchAndConnectToDebugserver(const ProcessInfo &process_info)
StructuredData::ObjectSP m_jstopinfo_sp
virtual std::shared_ptr< ThreadGDBRemote > CreateThread(lldb::tid_t tid)
StructuredData::ObjectSP m_jthreadsinfo_sp
lldb::StateType SetThreadStopInfo(StringExtractor &stop_packet)
static void MonitorDebugserverProcess(std::weak_ptr< ProcessGDBRemote > process_wp, lldb::pid_t pid, int signo, int exit_status)
StructuredData::ObjectSP GetSharedCacheInfo() override
Status DisableBreakpointSite(BreakpointSite *bp_site) override
Status EnableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true) override
Status DoSignal(int signal) override
Sends a process a UNIX signal signal.
Status DoDeallocateMemory(lldb::addr_t ptr) override
Actually deallocate memory in the process.
Broadcaster m_async_broadcaster
bool ParsePythonTargetDefinition(const FileSpec &target_definition_fspec)
bool StopNoticingNewThreads() override
Call this to turn off the stop & notice new threads mode.
static bool NewThreadNotifyBreakpointHit(void *baton, StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id)
void DumpPluginHistory(Stream &s) override
The underlying plugin might store the low-level communication history for this session.
FlashRangeVector m_erased_flash_ranges
Status DoDetach(bool keep_stopped) override
Detaches from a running or stopped process.
lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions, Status &error) override
Actually allocate memory in the process.
tid_sig_collection m_continue_C_tids
bool HasErased(FlashRange range)
std::optional< bool > DoGetWatchpointReportedAfter() override
Provide an override value in the subclass for lldb's CPU-based logic for whether watchpoint exception...
Status WillLaunchOrAttach()
std::optional< uint32_t > GetWatchpointSlotCount() override
Get the number of watchpoints supported by this target.
GDBRemoteCommunicationClient m_gdb_comm
llvm::Expected< std::vector< uint8_t > > DoReadMemoryTags(lldb::addr_t addr, size_t len, int32_t type) override
Does the final operation to read memory tags.
llvm::DenseMap< ModuleCacheKey, ModuleSpec, ModuleCacheInfo > m_cached_module_specs
Status DoWillAttachToProcessWithID(lldb::pid_t pid) override
Called before attaching to a process.
friend class GDBRemoteCommunicationClient
Status DoResume(lldb::RunDirection direction) override
Resumes all of a process's threads as configured using the Thread run control functions.
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo ®ion_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
void DidForkSwitchSoftwareBreakpoints(bool enable)
void DidLaunchOrAttach(ArchSpec &process_arch)
size_t UpdateThreadIDsFromStopReplyThreadsValue(llvm::StringRef value)
FlashRangeVector::Entry FlashRange
Status GetFileLoadAddress(const FileSpec &file, bool &is_loaded, lldb::addr_t &load_addr) override
Try to find the load address of a file.
MMapMap m_addr_to_mmap_size
bool GetThreadStopInfoFromJSON(ThreadGDBRemote *thread, const StructuredData::ObjectSP &thread_infos_sp)
void DidLaunch() override
Called after launching a process.
void SetUserSpecifiedMaxMemoryTransferSize(uint64_t user_specified_max)
void AddRemoteRegisters(std::vector< DynamicRegisterInfo::Register > ®isters, const ArchSpec &arch_to_use)
Status UpdateAutomaticSignalFiltering() override
void HandleAsyncStdout(llvm::StringRef out) override
static llvm::StringRef GetPluginDescriptionStatic()
tid_sig_collection m_continue_S_tids
bool m_allow_flash_writes
lldb::BreakpointSP m_thread_create_bp_sp
std::map< uint32_t, std::string > ExpeditedRegisterMap
llvm::Error TraceStop(const TraceStopRequest &request) override
Stop tracing a live process or its threads.
StructuredData::ObjectSP GetExtendedInfoForThread(lldb::tid_t tid)
lldb::ThreadSP HandleThreadAsyncInterrupt(uint8_t signo, const std::string &description) override
Handle thread specific async interrupt and return the original thread that requested the async interr...
llvm::Expected< LoadedModuleInfoList > GetLoadedModuleList() override
Query remote GDBServer for a detailed loaded library list.
bool m_waiting_for_attach
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