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/ErrorExtras.h"
94#include "llvm/Support/FormatAdapters.h"
95#include "llvm/Support/Threading.h"
96#include "llvm/Support/raw_ostream.h"
99#define DEBUGSERVER_BASENAME "debugserver"
101#define DEBUGSERVER_BASENAME "lldb-server.exe"
103#define DEBUGSERVER_BASENAME "lldb-server"
123 llvm::consumeError(file.takeError());
127 ((
Process *)p)->DumpPluginHistory(stream);
133#define LLDB_PROPERTIES_processgdbremote
134#include "ProcessGDBRemoteProperties.inc"
137#define LLDB_PROPERTIES_processgdbremote
138#include "ProcessGDBRemotePropertiesEnum.inc"
143 static llvm::StringRef GetSettingName() {
147 PluginProperties() : Properties() {
148 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
149 m_collection_sp->Initialize(g_processgdbremote_properties_def);
152 ~PluginProperties()
override =
default;
154 uint64_t GetPacketTimeout() {
155 const uint32_t idx = ePropertyPacketTimeout;
156 return GetPropertyAtIndexAs<uint64_t>(
157 idx, g_processgdbremote_properties[idx].default_uint_value);
160 bool SetPacketTimeout(uint64_t timeout) {
161 const uint32_t idx = ePropertyPacketTimeout;
162 return SetPropertyAtIndex(idx, timeout);
165 FileSpec GetTargetDefinitionFile()
const {
166 const uint32_t idx = ePropertyTargetDefinitionFile;
167 return GetPropertyAtIndexAs<FileSpec>(idx, {});
170 bool GetUseSVR4()
const {
171 const uint32_t idx = ePropertyUseSVR4;
172 return GetPropertyAtIndexAs<bool>(
173 idx, g_processgdbremote_properties[idx].default_uint_value != 0);
176 bool GetUseGPacketForReading()
const {
177 const uint32_t idx = ePropertyUseGPacketForReading;
178 return GetPropertyAtIndexAs<bool>(idx,
true);
182std::chrono::seconds ResumeTimeout() {
return std::chrono::seconds(5); }
187 static PluginProperties g_settings;
195#if defined(__APPLE__)
196#define LOW_PORT (IPPORT_RESERVED)
197#define HIGH_PORT (IPPORT_HIFIRSTAUTO)
199#define LOW_PORT (1024u)
200#define HIGH_PORT (49151u)
204 return "GDB Remote protocol based debugging plug-in.";
213 const FileSpec *crash_file_path,
bool can_connect) {
233 bool plugin_specified_by_name) {
234 if (plugin_specified_by_name)
238 Module *exe_module = target_sp->GetExecutableModulePointer();
242 switch (exe_objfile->
GetType()) {
266 :
Process(target_sp, listener_sp),
270 Listener::MakeListener(
"lldb.process.gdb-remote.async-listener")),
281 "async thread should exit");
283 "async thread continue");
285 "async thread did exit");
289 const uint32_t async_event_mask =
295 "ProcessGDBRemote::%s failed to listen for "
296 "m_async_broadcaster events",
300 const uint64_t timeout_seconds =
302 if (timeout_seconds > 0)
303 m_gdb_comm.SetPacketTimeout(std::chrono::seconds(timeout_seconds));
327std::shared_ptr<ThreadGDBRemote>
329 return std::make_shared<ThreadGDBRemote>(*
this, tid);
333 const FileSpec &target_definition_fspec) {
339 if (module_object_sp) {
342 "gdb-server-target-definition",
error));
344 if (target_definition_sp) {
346 target_definition_sp->GetValueForKey(
"host-info"));
348 if (
auto host_info_dict = target_object->GetAsDictionary()) {
350 host_info_dict->GetValueForKey(
"triple");
351 if (
auto triple_string_value = triple_value->GetAsString()) {
352 std::string triple_string =
353 std::string(triple_string_value->GetValue());
354 ArchSpec host_arch(triple_string.c_str());
363 target_definition_sp->GetValueForKey(
"breakpoint-pc-offset");
364 if (breakpoint_pc_offset_value) {
365 if (
auto breakpoint_pc_int_value =
366 breakpoint_pc_offset_value->GetAsSignedInteger())
371 *target_definition_sp,
GetTarget().GetArchitecture()) > 0) {
380 const llvm::StringRef &comma_separated_register_numbers,
381 std::vector<uint32_t> ®nums,
int base) {
383 for (llvm::StringRef x : llvm::split(comma_separated_register_numbers,
',')) {
385 if (llvm::to_integer(x, reg, base))
386 regnums.push_back(reg);
388 return regnums.size();
400 const auto host_packet_timeout =
m_gdb_comm.GetHostDefaultPacketTimeout();
401 if (host_packet_timeout > std::chrono::seconds(0)) {
419 if (target_definition_fspec) {
425 target_definition_fspec.
GetPath() +
436 if (remote_process_arch.
IsValid())
437 arch_to_use = remote_process_arch;
439 arch_to_use = remote_host_arch;
442 arch_to_use = target_arch;
445 if (!register_info_err) {
452 "Failed to read register information from target XML: {0}");
453 LLDB_LOG(log,
"Now trying to use qRegisterInfo instead.");
456 std::vector<DynamicRegisterInfo::Register> registers;
457 uint32_t reg_num = 0;
461 const int packet_len =
462 ::snprintf(packet,
sizeof(packet),
"qRegisterInfo%x", reg_num);
463 assert(packet_len < (
int)
sizeof(packet));
466 if (
m_gdb_comm.SendPacketAndWaitForResponse(packet, response) ==
470 llvm::StringRef name;
471 llvm::StringRef value;
475 if (name ==
"name") {
477 }
else if (name ==
"alt-name") {
479 }
else if (name ==
"bitsize") {
480 if (!value.getAsInteger(0, reg_info.
byte_size))
482 }
else if (name ==
"offset") {
484 }
else if (name ==
"encoding") {
488 }
else if (name ==
"format") {
492 llvm::StringSwitch<Format>(value)
534 }
else if (name ==
"set") {
536 }
else if (name ==
"gcc" || name ==
"ehframe") {
538 }
else if (name ==
"dwarf") {
540 }
else if (name ==
"generic") {
542 }
else if (name ==
"container-regs") {
544 }
else if (name ==
"invalidate-regs") {
550 registers.push_back(reg_info);
563 "the debug server supports Target Description XML but LLDB does "
564 "not have XML parsing enabled. Using \"qRegisterInfo\" was also "
565 "not possible. Register information may be incorrect or missing.",
575 if (registers.empty()) {
577 if (!registers.empty())
580 "All other methods failed, using fallback register information.");
595 bool wait_for_launch) {
627 if (
m_gdb_comm.GetProcessArchitecture().IsValid()) {
630 if (
m_gdb_comm.GetHostArchitecture().IsValid()) {
641 "Process %" PRIu64
" was reported after connecting to "
642 "'%s', but state was not stopped: %s",
646 "Process %" PRIu64
" was reported after connecting to '%s', "
647 "but no stop reply packet was received",
648 pid, remote_url.str().c_str());
652 "ProcessGDBRemote::%s pid %" PRIu64
653 ": normalizing target architecture initial triple: %s "
654 "(GetTarget().GetArchitecture().IsValid() %s, "
655 "m_gdb_comm.GetHostArchitecture().IsValid(): %s)",
656 __FUNCTION__,
GetID(),
657 GetTarget().GetArchitecture().GetTriple().getTriple().c_str(),
659 m_gdb_comm.GetHostArchitecture().IsValid() ?
"true" :
"false");
665 if (
m_gdb_comm.GetProcessArchitecture().IsValid())
672 "ProcessGDBRemote::%s pid %" PRIu64
673 ": normalized target architecture triple: %s",
674 __FUNCTION__,
GetID(),
675 GetTarget().GetArchitecture().GetTriple().getTriple().c_str());
692 LLDB_LOGF(log,
"ProcessGDBRemote::%s() entered", __FUNCTION__);
694 uint32_t launch_flags = launch_info.
GetFlags().
Get();
718 if (stdin_file_spec || stdout_file_spec || stderr_file_spec)
720 "ProcessGDBRemote::%s provided with STDIO paths via "
721 "launch_info: stdin=%s, stdout=%s, stderr=%s",
723 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
724 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
725 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
728 "ProcessGDBRemote::%s no STDIO paths given via launch_info",
732 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
733 if (stdin_file_spec || disable_stdio) {
748 if (
error.Success()) {
750 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
755 if (!stdin_file_spec)
757 FileSpec::Style::native);
758 if (!stdout_file_spec)
760 FileSpec::Style::native);
761 if (!stderr_file_spec)
763 FileSpec::Style::native);
764 }
else if (platform_sp && platform_sp->IsHost()) {
769 if ((!stdin_file_spec || !stdout_file_spec || !stderr_file_spec) &&
773 if (!stdin_file_spec)
774 stdin_file_spec = secondary_name;
776 if (!stdout_file_spec)
777 stdout_file_spec = secondary_name;
779 if (!stderr_file_spec)
780 stderr_file_spec = secondary_name;
784 "ProcessGDBRemote::%s adjusted STDIO paths for local platform "
785 "(IsHost() is true) using secondary: stdin=%s, stdout=%s, "
788 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
789 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
790 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
794 "ProcessGDBRemote::%s final STDIO paths after all "
795 "adjustments: stdin=%s, stdout=%s, stderr=%s",
797 stdin_file_spec ? stdin_file_spec.
GetPath().c_str() :
"<null>",
798 stdout_file_spec ? stdout_file_spec.
GetPath().c_str() :
"<null>",
799 stderr_file_spec ? stderr_file_spec.
GetPath().c_str() :
"<null>");
803 if (stdout_file_spec)
805 if (stderr_file_spec)
808 m_gdb_comm.SetDisableASLR(launch_flags & eLaunchFlagDisableASLR);
809 m_gdb_comm.SetDetachOnError(launch_flags & eLaunchFlagDetachOnError);
812 GetTarget().GetArchitecture().GetArchitectureName());
815 if (launch_event_data !=
nullptr && *launch_event_data !=
'\0')
816 m_gdb_comm.SendLaunchEventDataPacket(launch_event_data);
828 std::chrono::seconds(10));
835 if (llvm::Error err =
m_gdb_comm.LaunchProcess(args)) {
838 llvm::fmt_consume(std::move(err)));
845 LLDB_LOGF(log,
"failed to connect to debugserver: %s",
867 if (!disable_stdio) {
873 LLDB_LOGF(log,
"failed to connect to debugserver: %s",
error.AsCString());
883 if (!connect_url.empty()) {
884 LLDB_LOGF(log,
"ProcessGDBRemote::%s Connecting to %s", __FUNCTION__,
885 connect_url.str().c_str());
886 std::unique_ptr<ConnectionFileDescriptor> conn_up(
889 const uint32_t max_retry_count = 50;
890 uint32_t retry_count = 0;
899 if (retry_count >= max_retry_count)
902 std::this_thread::sleep_for(std::chrono::milliseconds(100));
926 m_gdb_comm.GetListThreadsInStopReplySupported();
933 auto handle_cmds = [&] (
const Args &args) ->
void {
937 entry.c_str(), response);
943 handle_cmds(platform_sp->GetExtraStartupCommands());
960 if (remote_process_arch.
IsValid()) {
961 process_arch = remote_process_arch;
962 LLDB_LOG(log,
"gdb-remote had process architecture, using {0} {1}",
966 process_arch =
m_gdb_comm.GetHostArchitecture();
968 "gdb-remote did not have process architecture, using gdb-remote "
969 "host architecture {0} {1}",
980 LLDB_LOG(log,
"analyzing target arch, currently {0} {1}",
992 if ((process_arch.
GetMachine() == llvm::Triple::arm ||
993 process_arch.
GetMachine() == llvm::Triple::thumb) &&
994 process_arch.
GetTriple().getVendor() == llvm::Triple::Apple) {
997 "remote process is ARM/Apple, "
998 "setting target arch to {0} {1}",
1003 const llvm::Triple &remote_triple = process_arch.
GetTriple();
1004 llvm::Triple new_target_triple = target_arch.
GetTriple();
1005 if (new_target_triple.getVendorName().size() == 0) {
1006 new_target_triple.setVendor(remote_triple.getVendor());
1008 if (new_target_triple.getOSName().size() == 0) {
1009 new_target_triple.setOS(remote_triple.getOS());
1011 if (new_target_triple.getEnvironmentName().size() == 0)
1012 new_target_triple.setEnvironment(remote_triple.getEnvironment());
1015 ArchSpec new_target_arch = target_arch;
1016 new_target_arch.
SetTriple(new_target_triple);
1022 "final target arch after adjustments for remote architecture: "
1041 m_gdb_comm.GetSupportedStructuredDataPlugins())
1050 if (platform_sp && platform_sp->IsConnected())
1062 UUID standalone_uuid;
1064 bool standalone_value_is_offset;
1065 if (
m_gdb_comm.GetProcessStandaloneBinary(standalone_uuid, standalone_value,
1066 standalone_value_is_offset)) {
1069 if (standalone_uuid.
IsValid()) {
1070 const bool force_symbol_search =
true;
1071 const bool notify =
true;
1072 const bool set_address_in_target =
true;
1073 const bool allow_memory_image_last_resort =
false;
1075 this,
"", standalone_uuid, standalone_value,
1076 standalone_value_is_offset, force_symbol_search, notify,
1077 set_address_in_target, allow_memory_image_last_resort);
1089 std::vector<addr_t> bin_addrs =
m_gdb_comm.GetProcessStandaloneBinaries();
1090 if (bin_addrs.size()) {
1092 const bool value_is_slide =
false;
1093 for (
addr_t addr : bin_addrs) {
1094 const bool notify =
true;
1101 .LoadPlatformBinaryAndSetup(
this, addr, notify))
1104 const bool force_symbol_search =
true;
1105 const bool set_address_in_target =
true;
1106 const bool allow_memory_image_last_resort =
false;
1109 this, llvm::StringRef(), uuid, addr, value_is_slide,
1110 force_symbol_search, notify, set_address_in_target,
1111 allow_memory_image_last_resort);
1121 std::optional<QOffsets> offsets =
m_gdb_comm.GetQOffsets();
1126 size_t(llvm::count(offsets->offsets, offsets->offsets[0])) ==
1127 offsets->offsets.size();
1131 bool changed =
false;
1132 module_sp->SetLoadAddress(
GetTarget(), offsets->offsets[0],
1137 m_process->GetTarget().ModulesDidLoad(list);
1151 LLDB_LOGF(log,
"ProcessGDBRemote::%s()", __FUNCTION__);
1157 if (
error.Success()) {
1161 const int packet_len =
1162 ::snprintf(packet,
sizeof(packet),
"vAttach;%" PRIx64, attach_pid);
1165 std::make_shared<EventDataBytes>(llvm::StringRef(packet, packet_len));
1180 if (process_name && process_name[0]) {
1182 if (
error.Success()) {
1188 if (!
m_gdb_comm.GetVAttachOrWaitSupported()) {
1203 auto data_sp = std::make_shared<EventDataBytes>(packet.
GetString());
1224llvm::Expected<std::string>
1229llvm::Expected<std::vector<uint8_t>>
1241 process_arch.
Clear();
1257 return m_gdb_comm.GetReverseStepSupported() ||
1264 LLDB_LOGF(log,
"ProcessGDBRemote::Resume(%s)",
1269 if (listener_sp->StartListeningForEvents(
1271 listener_sp->StartListeningForEvents(
1278 bool continue_packet_error =
false;
1292 std::string pid_prefix;
1294 pid_prefix = llvm::formatv(
"p{0:x-}.",
GetID());
1296 if (num_continue_c_tids == num_threads ||
1301 continue_packet.
Format(
"vCont;c:{0}-1", pid_prefix);
1309 for (tid_collection::const_iterator
1312 t_pos != t_end; ++t_pos)
1313 continue_packet.
Format(
";c:{0}{1:x-}", pid_prefix, *t_pos);
1315 continue_packet_error =
true;
1320 for (tid_sig_collection::const_iterator
1323 s_pos != s_end; ++s_pos)
1324 continue_packet.
Format(
";C{0:x-2}:{1}{2:x-}", s_pos->second,
1325 pid_prefix, s_pos->first);
1327 continue_packet_error =
true;
1332 for (tid_collection::const_iterator
1335 t_pos != t_end; ++t_pos)
1336 continue_packet.
Format(
";s:{0}{1:x-}", pid_prefix, *t_pos);
1338 continue_packet_error =
true;
1343 for (tid_sig_collection::const_iterator
1346 s_pos != s_end; ++s_pos)
1347 continue_packet.
Format(
";S{0:x-2}:{1}{2:x-}", s_pos->second,
1348 pid_prefix, s_pos->first);
1350 continue_packet_error =
true;
1353 if (continue_packet_error)
1354 continue_packet.
Clear();
1357 continue_packet_error =
true;
1363 if (num_continue_c_tids > 0) {
1364 if (num_continue_c_tids == num_threads) {
1368 continue_packet_error =
false;
1369 }
else if (num_continue_c_tids == 1 && num_continue_C_tids == 0 &&
1370 num_continue_s_tids == 0 && num_continue_S_tids == 0) {
1374 continue_packet_error =
false;
1378 if (continue_packet_error && num_continue_C_tids > 0) {
1379 if ((num_continue_C_tids + num_continue_c_tids) == num_threads &&
1380 num_continue_C_tids > 0 && num_continue_s_tids == 0 &&
1381 num_continue_S_tids == 0) {
1384 if (num_continue_C_tids > 1) {
1389 if (num_continue_C_tids > 1) {
1390 continue_packet_error =
false;
1393 continue_packet_error =
true;
1396 if (!continue_packet_error)
1400 continue_packet_error =
false;
1403 if (!continue_packet_error) {
1405 continue_packet.
Printf(
"C%2.2x", continue_signo);
1410 if (continue_packet_error && num_continue_s_tids > 0) {
1411 if (num_continue_s_tids == num_threads) {
1417 continue_packet_error =
false;
1418 }
else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1419 num_continue_s_tids == 1 && num_continue_S_tids == 0) {
1423 continue_packet_error =
false;
1427 if (!continue_packet_error && num_continue_S_tids > 0) {
1428 if (num_continue_S_tids == num_threads) {
1431 continue_packet_error =
false;
1432 if (num_continue_S_tids > 1) {
1433 for (
size_t i = 1; i < num_threads; ++i) {
1435 continue_packet_error =
true;
1438 if (!continue_packet_error) {
1441 continue_packet.
Printf(
"S%2.2x", step_signo);
1443 }
else if (num_continue_c_tids == 0 && num_continue_C_tids == 0 &&
1444 num_continue_s_tids == 0 && num_continue_S_tids == 1) {
1448 continue_packet_error =
false;
1454 if (num_continue_s_tids > 0 || num_continue_S_tids > 0) {
1456 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: target does not "
1457 "support reverse-stepping");
1459 "target does not support reverse-stepping");
1462 if (num_continue_S_tids > 0) {
1465 "ProcessGDBRemote::DoResume: Signals not supported in reverse");
1467 "can't deliver signals while running in reverse");
1470 if (num_continue_s_tids > 1) {
1471 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: can't step multiple "
1472 "threads in reverse");
1474 "can't step multiple threads while reverse-stepping");
1480 if (!
m_gdb_comm.GetReverseContinueSupported()) {
1481 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: target does not "
1482 "support reverse-continue");
1484 "target does not support reverse execution of processes");
1487 if (num_continue_C_tids > 0) {
1490 "ProcessGDBRemote::DoResume: Signals not supported in reverse");
1492 "can't deliver signals while running in reverse");
1500 continue_packet_error =
false;
1503 if (continue_packet_error) {
1505 "can't make continue packet for this resume");
1510 "Trying to resume but the async thread is dead.");
1511 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: Trying to resume but the "
1512 "async thread is dead.");
1517 std::make_shared<EventDataBytes>(continue_packet.
GetString());
1520 if (!listener_sp->GetEvent(event_sp, ResumeTimeout())) {
1522 LLDB_LOGF(log,
"ProcessGDBRemote::DoResume: Resume timed out.");
1525 "Broadcast continue, but the async thread was "
1526 "killed before we got an ack back.");
1528 "ProcessGDBRemote::DoResume: Broadcast continue, but the "
1529 "async thread was killed before we got an ack back.");
1545 llvm::StringRef value) {
1551 auto pid_tid = thread_ids.
GetPidTid(pid);
1552 if (pid_tid && pid_tid->first == pid) {
1558 }
while (thread_ids.
GetChar() ==
',');
1564 llvm::StringRef value) {
1566 for (llvm::StringRef x : llvm::split(value,
',')) {
1568 if (llvm::to_integer(x,
pc, 16))
1580 if (thread_infos && thread_infos->
GetSize() > 0) {
1604 const llvm::StringRef stop_info_str = stop_info.
GetStringRef();
1607 const size_t thread_pcs_pos = stop_info_str.find(
";thread-pcs:");
1608 if (thread_pcs_pos != llvm::StringRef::npos) {
1609 const size_t start = thread_pcs_pos + strlen(
";thread-pcs:");
1610 const size_t end = stop_info_str.find(
';', start);
1611 if (end != llvm::StringRef::npos) {
1612 llvm::StringRef value = stop_info_str.substr(start, end - start);
1617 const size_t threads_pos = stop_info_str.find(
";threads:");
1618 if (threads_pos != llvm::StringRef::npos) {
1619 const size_t start = threads_pos + strlen(
";threads:");
1620 const size_t end = stop_info_str.find(
';', start);
1621 if (end != llvm::StringRef::npos) {
1622 llvm::StringRef value = stop_info_str.substr(start, end - start);
1630 bool sequence_mutex_unavailable =
false;
1632 if (sequence_mutex_unavailable) {
1647 if (num_thread_ids == 0) {
1653 ThreadList old_thread_list_copy(old_thread_list);
1654 if (num_thread_ids > 0) {
1655 for (
size_t i = 0; i < num_thread_ids; ++i) {
1661 LLDB_LOGV(log,
"Making new thread: {0} for thread ID: {1:x}.",
1662 thread_sp.get(), thread_sp->GetID());
1664 LLDB_LOGV(log,
"Found old thread: {0} for thread ID: {1:x}.",
1665 thread_sp.get(), thread_sp->GetID());
1675 size_t old_num_thread_ids = old_thread_list_copy.
GetSize(
false);
1676 for (
size_t i = 0; i < old_num_thread_ids; i++) {
1678 if (old_thread_sp) {
1679 lldb::tid_t old_thread_id = old_thread_sp->GetProtocolID();
1694 uint32_t pc_regnum = reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1707 if (thread_infos_sp) {
1711 const size_t n = thread_infos->
GetSize();
1712 for (
size_t i = 0; i < n; ++i) {
1718 if (tid == thread->GetID())
1747 if (
GetGDBRemote().GetThreadStopInfo(thread->GetProtocolID(), stop_packet))
1757 for (
const auto &pair : expedited_register_map) {
1761 reg_value_extractor.
GetHexBytes(buffer_sp->GetData(),
'\xcc');
1762 uint32_t lldb_regnum = gdb_reg_ctx_sp->ConvertRegisterKindToRegisterNumber(
1770 uint8_t signo,
const std::string &thread_name,
const std::string &reason,
1771 const std::string &description, uint32_t exc_type,
1772 const std::vector<addr_t> &exc_data,
addr_t thread_dispatch_qaddr,
1773 bool queue_vars_valid,
1775 LazyBool associated_with_dispatch_queue,
addr_t dispatch_queue_t,
1776 std::string &queue_name,
QueueKind queue_kind, uint64_t queue_serial) {
1800 reg_ctx_sp->InvalidateIfNeeded(
true);
1808 if (reg_ctx_sp->ReconfigureRegisterInfo()) {
1811 reg_ctx_sp->InvalidateAllRegisters();
1818 thread_sp->SetName(thread_name.empty() ?
nullptr : thread_name.c_str());
1823 if (queue_vars_valid)
1824 gdb_thread->
SetQueueInfo(std::move(queue_name), queue_kind, queue_serial,
1825 dispatch_queue_t, associated_with_dispatch_queue);
1836 StopInfoSP current_stop_info_sp = thread_sp->GetPrivateStopInfo(
false);
1838 current_stop_info_sp) {
1839 thread_sp->SetStopInfo(current_stop_info_sp);
1843 if (!thread_sp->StopInfoIsUpToDate()) {
1846 addr_t pc = thread_sp->GetRegisterContext()->GetPC();
1848 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
pc);
1849 if (bp_site_sp && bp_site_sp->IsEnabled())
1850 thread_sp->SetThreadStoppedAtUnexecutedBP(
pc);
1852 if (exc_type != 0) {
1860 if (interrupt_thread)
1861 thread_sp = interrupt_thread;
1863 const size_t exc_data_size = exc_data.size();
1864 thread_sp->SetStopInfo(
1866 *thread_sp, exc_type, exc_data_size,
1867 exc_data_size >= 1 ? exc_data[0] : 0,
1868 exc_data_size >= 2 ? exc_data[1] : 0,
1869 exc_data_size >= 3 ? exc_data[2] : 0));
1872 bool handled =
false;
1873 bool did_exec =
false;
1876 if (!reason.empty() && reason !=
"none") {
1877 if (reason ==
"trace") {
1880 }
else if (reason ==
"breakpoint") {
1881 thread_sp->SetThreadHitBreakpointSite();
1889 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
1890 thread_sp->SetStopInfo(
1892 *thread_sp, bp_site_sp->GetID()));
1895 thread_sp->SetStopInfo(invalid_stop_info_sp);
1898 }
else if (reason ==
"trap") {
1900 }
else if (reason ==
"watchpoint") {
1936 bool silently_continue =
false;
1946 silently_continue =
true;
1950 if (!wp_resource_sp) {
1952 LLDB_LOGF(log,
"failed to find watchpoint");
1959 watch_id = wp_resource_sp->GetConstituentAtIndex(0)->GetID();
1962 *thread_sp, watch_id, silently_continue));
1964 }
else if (reason ==
"exception") {
1966 *thread_sp, description.c_str()));
1968 }
else if (reason ==
"history boundary") {
1970 *thread_sp, description.c_str()));
1972 }
else if (reason ==
"exec") {
1974 thread_sp->SetStopInfo(
1977 }
else if (reason ==
"processor trace") {
1979 *thread_sp, description.c_str()));
1980 }
else if (reason ==
"fork") {
1985 thread_sp->SetStopInfo(
1988 }
else if (reason ==
"vfork") {
1994 *thread_sp, child_pid, child_tid));
1996 }
else if (reason ==
"vforkdone") {
1997 thread_sp->SetStopInfo(
2003 if (!handled && signo && !did_exec) {
2024 thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(
2033 if (bp_site_sp->IsEnabled())
2034 thread_sp->SetThreadHitBreakpointSite();
2036 if (bp_site_sp->ValidForThisThread(*thread_sp)) {
2038 thread_sp->GetRegisterContext()->SetPC(
pc);
2039 thread_sp->SetStopInfo(
2041 *thread_sp, bp_site_sp->GetID()));
2044 thread_sp->SetStopInfo(invalid_stop_info_sp);
2050 thread_sp->SetStopInfo(
2054 *thread_sp, signo, description.c_str()));
2065 if (interrupt_thread)
2066 thread_sp = interrupt_thread;
2069 *thread_sp, signo, description.c_str()));
2073 if (!description.empty()) {
2076 const char *stop_info_desc = stop_info_sp->GetDescription();
2077 if (!stop_info_desc || !stop_info_desc[0])
2078 stop_info_sp->SetDescription(description.c_str());
2081 *thread_sp, description.c_str()));
2091 const std::string &description) {
2100 *thread_sp, signo, description.c_str()));
2109 static constexpr llvm::StringLiteral g_key_tid(
"tid");
2110 static constexpr llvm::StringLiteral g_key_name(
"name");
2111 static constexpr llvm::StringLiteral g_key_reason(
"reason");
2112 static constexpr llvm::StringLiteral g_key_metype(
"metype");
2113 static constexpr llvm::StringLiteral g_key_medata(
"medata");
2114 static constexpr llvm::StringLiteral g_key_qaddr(
"qaddr");
2115 static constexpr llvm::StringLiteral g_key_dispatch_queue_t(
2116 "dispatch_queue_t");
2117 static constexpr llvm::StringLiteral g_key_associated_with_dispatch_queue(
2118 "associated_with_dispatch_queue");
2119 static constexpr llvm::StringLiteral g_key_queue_name(
"qname");
2120 static constexpr llvm::StringLiteral g_key_queue_kind(
"qkind");
2121 static constexpr llvm::StringLiteral g_key_queue_serial_number(
"qserialnum");
2122 static constexpr llvm::StringLiteral g_key_registers(
"registers");
2123 static constexpr llvm::StringLiteral g_key_memory(
"memory");
2124 static constexpr llvm::StringLiteral g_key_description(
"description");
2125 static constexpr llvm::StringLiteral g_key_signal(
"signal");
2130 std::string thread_name;
2132 std::string description;
2133 uint32_t exc_type = 0;
2134 std::vector<addr_t> exc_data;
2137 bool queue_vars_valid =
false;
2140 std::string queue_name;
2142 uint64_t queue_serial_number = 0;
2147 thread_dict->
ForEach([
this, &tid, &expedited_register_map, &thread_name,
2148 &signo, &reason, &description, &exc_type, &exc_data,
2149 &thread_dispatch_qaddr, &queue_vars_valid,
2150 &associated_with_dispatch_queue, &dispatch_queue_t,
2151 &queue_name, &queue_kind, &queue_serial_number](
2152 llvm::StringRef key,
2154 if (key == g_key_tid) {
2157 }
else if (key == g_key_metype) {
2159 exc_type =
object->GetUnsignedIntegerValue(0);
2160 }
else if (key == g_key_medata) {
2165 exc_data.push_back(object->GetUnsignedIntegerValue());
2169 }
else if (key == g_key_name) {
2170 thread_name = std::string(object->GetStringValue());
2171 }
else if (key == g_key_qaddr) {
2172 thread_dispatch_qaddr =
2174 }
else if (key == g_key_queue_name) {
2175 queue_vars_valid =
true;
2176 queue_name = std::string(object->GetStringValue());
2177 }
else if (key == g_key_queue_kind) {
2178 std::string queue_kind_str = std::string(object->GetStringValue());
2179 if (queue_kind_str ==
"serial") {
2180 queue_vars_valid =
true;
2182 }
else if (queue_kind_str ==
"concurrent") {
2183 queue_vars_valid =
true;
2186 }
else if (key == g_key_queue_serial_number) {
2187 queue_serial_number =
object->GetUnsignedIntegerValue(0);
2188 if (queue_serial_number != 0)
2189 queue_vars_valid =
true;
2190 }
else if (key == g_key_dispatch_queue_t) {
2191 dispatch_queue_t =
object->GetUnsignedIntegerValue(0);
2193 queue_vars_valid =
true;
2194 }
else if (key == g_key_associated_with_dispatch_queue) {
2195 queue_vars_valid =
true;
2196 bool associated =
object->GetBooleanValue();
2201 }
else if (key == g_key_reason) {
2202 reason = std::string(object->GetStringValue());
2203 }
else if (key == g_key_description) {
2204 description = std::string(object->GetStringValue());
2205 }
else if (key == g_key_registers) {
2208 if (registers_dict) {
2210 [&expedited_register_map](llvm::StringRef key,
2213 if (llvm::to_integer(key, reg))
2214 expedited_register_map[reg] =
2215 std::string(object->GetStringValue());
2219 }
else if (key == g_key_memory) {
2225 if (mem_cache_dict) {
2228 "address", mem_cache_addr)) {
2230 llvm::StringRef str;
2235 const size_t byte_size = bytes.
GetStringRef().size() / 2;
2238 const size_t bytes_copied =
2240 if (bytes_copied == byte_size)
2251 }
else if (key == g_key_signal)
2257 reason, description, exc_type, exc_data,
2258 thread_dispatch_qaddr, queue_vars_valid,
2259 associated_with_dispatch_queue, dispatch_queue_t,
2260 queue_name, queue_kind, queue_serial_number);
2266 const char stop_type = stop_packet.
GetChar();
2267 switch (stop_type) {
2286 const uint8_t signo = stop_packet.
GetHexU8();
2287 llvm::StringRef key;
2288 llvm::StringRef value;
2289 std::string thread_name;
2291 std::string description;
2292 uint32_t exc_type = 0;
2293 std::vector<addr_t> exc_data;
2295 bool queue_vars_valid =
2299 std::string queue_name;
2301 uint64_t queue_serial_number = 0;
2305 if (key.compare(
"metype") == 0) {
2307 value.getAsInteger(16, exc_type);
2308 }
else if (key.compare(
"medata") == 0) {
2311 value.getAsInteger(16, x);
2312 exc_data.push_back(x);
2313 }
else if (key.compare(
"thread") == 0) {
2316 auto pid_tid = thread_id.
GetPidTid(pid);
2318 stop_pid = pid_tid->first;
2319 tid = pid_tid->second;
2322 }
else if (key.compare(
"threads") == 0) {
2323 std::lock_guard<std::recursive_mutex> guard(
2326 }
else if (key.compare(
"thread-pcs") == 0) {
2331 while (!value.empty()) {
2332 llvm::StringRef pc_str;
2333 std::tie(pc_str, value) = value.split(
',');
2334 if (pc_str.getAsInteger(16,
pc))
2338 }
else if (key.compare(
"jstopinfo") == 0) {
2347 }
else if (key.compare(
"hexname") == 0) {
2351 }
else if (key.compare(
"name") == 0) {
2352 thread_name = std::string(value);
2353 }
else if (key.compare(
"qaddr") == 0) {
2354 value.getAsInteger(16, thread_dispatch_qaddr);
2355 }
else if (key.compare(
"dispatch_queue_t") == 0) {
2356 queue_vars_valid =
true;
2357 value.getAsInteger(16, dispatch_queue_t);
2358 }
else if (key.compare(
"qname") == 0) {
2359 queue_vars_valid =
true;
2363 }
else if (key.compare(
"qkind") == 0) {
2364 queue_kind = llvm::StringSwitch<QueueKind>(value)
2369 }
else if (key.compare(
"qserialnum") == 0) {
2370 if (!value.getAsInteger(0, queue_serial_number))
2371 queue_vars_valid =
true;
2372 }
else if (key.compare(
"reason") == 0) {
2373 reason = std::string(value);
2374 }
else if (key.compare(
"description") == 0) {
2378 }
else if (key.compare(
"memory") == 0) {
2392 llvm::StringRef addr_str, bytes_str;
2393 std::tie(addr_str, bytes_str) = value.split(
'=');
2394 if (!addr_str.empty() && !bytes_str.empty()) {
2396 if (!addr_str.getAsInteger(0, mem_cache_addr)) {
2401 const size_t bytes_copied =
2403 if (bytes_copied == byte_size)
2407 }
else if (key.compare(
"watch") == 0 || key.compare(
"rwatch") == 0 ||
2408 key.compare(
"awatch") == 0) {
2411 value.getAsInteger(16, wp_addr);
2419 reason =
"watchpoint";
2421 ostr.
Printf(
"%" PRIu64, wp_addr);
2422 description = std::string(ostr.
GetString());
2423 }
else if (key.compare(
"swbreak") == 0 || key.compare(
"hwbreak") == 0) {
2424 reason =
"breakpoint";
2425 }
else if (key.compare(
"replaylog") == 0) {
2426 reason =
"history boundary";
2427 }
else if (key.compare(
"library") == 0) {
2433 }
else if (key.compare(
"fork") == 0 || key.compare(
"vfork") == 0) {
2439 LLDB_LOG(log,
"Invalid PID/TID to fork: {0}", value);
2445 ostr.
Printf(
"%" PRIu64
" %" PRIu64, pid_tid->first, pid_tid->second);
2446 description = std::string(ostr.
GetString());
2447 }
else if (key.compare(
"addressing_bits") == 0) {
2448 uint64_t addressing_bits;
2449 if (!value.getAsInteger(0, addressing_bits)) {
2452 }
else if (key.compare(
"low_mem_addressing_bits") == 0) {
2453 uint64_t addressing_bits;
2454 if (!value.getAsInteger(0, addressing_bits)) {
2457 }
else if (key.compare(
"high_mem_addressing_bits") == 0) {
2458 uint64_t addressing_bits;
2459 if (!value.getAsInteger(0, addressing_bits)) {
2462 }
else if (key.size() == 2 && ::isxdigit(key[0]) && ::isxdigit(key[1])) {
2464 if (!key.getAsInteger(16, reg))
2465 expedited_register_map[reg] = std::string(std::move(value));
2475 "Received stop for incorrect PID = {0} (inferior PID = {1})",
2495 tid, expedited_register_map, signo, thread_name, reason, description,
2496 exc_type, exc_data, thread_dispatch_qaddr, queue_vars_valid,
2497 associated_with_dispatch_queue, dispatch_queue_t, queue_name,
2498 queue_kind, queue_serial_number);
2565 LLDB_LOGF(log,
"ProcessGDBRemote::DoDetach(keep_stopped: %i)", keep_stopped);
2569 if (
error.Success())
2571 "ProcessGDBRemote::DoDetach() detach packet sent successfully");
2574 "ProcessGDBRemote::DoDetach() detach packet send failed: %s",
2575 error.AsCString() ?
error.AsCString() :
"<unknown error>");
2578 if (!
error.Success())
2593 LLDB_LOGF(log,
"ProcessGDBRemote::DoDestroy()");
2596 int exit_status = SIGABRT;
2597 std::string exit_string;
2604 exit_status = kill_res.get();
2605#if defined(__APPLE__)
2617 if (platform_sp && platform_sp->IsHost()) {
2620 reap_pid = waitpid(
GetID(), &status, WNOHANG);
2621 LLDB_LOGF(log,
"Reaped pid: %d, status: %d.\n", reap_pid, status);
2625 exit_string.assign(
"killed");
2627 exit_string.assign(llvm::toString(kill_res.takeError()));
2630 exit_string.assign(
"killed or interrupted while attaching.");
2636 exit_string.assign(
"destroying when not connected to debugserver");
2657 const bool did_exec =
2658 response.
GetStringRef().find(
";reason:exec;") != std::string::npos;
2661 LLDB_LOGF(log,
"ProcessGDBRemote::SetLastStopPacket () - detected exec");
2666 m_gdb_comm.ResetDiscoverableSettings(did_exec);
2691 LLDB_LOG_ERROR(log, list.takeError(),
"Failed to read module list: {0}.");
2693 addr = list->m_link_map;
2713 const size_t n = thread_infos->
GetSize();
2714 for (
size_t i = 0; i < n; ++i) {
2730 xPacketState x_state =
m_gdb_comm.GetxPacketState();
2733 size_t max_memory_size = x_state != xPacketState::Unimplemented
2736 if (size > max_memory_size) {
2740 size = max_memory_size;
2745 packet_len = ::snprintf(packet,
sizeof(packet),
"%c%" PRIx64
",%" PRIx64,
2746 x_state != xPacketState::Unimplemented ?
'x' :
'm',
2747 (uint64_t)addr, (uint64_t)size);
2748 assert(packet_len + 1 < (
int)
sizeof(packet));
2751 if (
m_gdb_comm.SendPacketAndWaitForResponse(packet, response,
2756 if (x_state != xPacketState::Unimplemented) {
2761 llvm::StringRef data_received = response.
GetStringRef();
2762 if (x_state == xPacketState::Prefixed &&
2763 !data_received.consume_front(
"b")) {
2765 "unexpected response to GDB server memory read packet '{0}': "
2767 packet, data_received);
2772 size_t memcpy_size = std::min(size, data_received.size());
2773 memcpy(buf, data_received.data(), memcpy_size);
2777 llvm::MutableArrayRef<uint8_t>((uint8_t *)buf, size),
'\xdd');
2781 "memory read failed for 0x%" PRIx64, addr);
2784 "GDB server does not support reading memory");
2787 "unexpected response to GDB server memory read packet '%s': '%s'",
2799 uint64_t max_packet_size,
2803 constexpr uint64_t range_overhead = 33;
2804 uint64_t current_size = 0;
2805 for (
auto [idx, range] : llvm::enumerate(ranges)) {
2806 uint64_t potential_size = current_size + range.size + range_overhead;
2807 if (potential_size > max_packet_size) {
2810 "MultiMemRead input has a range (base = {0:x}, size = {1}) "
2811 "bigger than the maximum allowed by remote",
2812 range.base, range.size);
2816 return ranges.size();
2819llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
2822 llvm::MutableArrayRef<uint8_t> buffer) {
2826 const llvm::ArrayRef<Range<lldb::addr_t, size_t>> original_ranges = ranges;
2827 llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> memory_regions;
2829 while (!ranges.empty()) {
2830 uint64_t num_ranges =
2832 if (num_ranges == 0)
2835 auto ranges_for_request = ranges.take_front(num_ranges);
2836 ranges = ranges.drop_front(num_ranges);
2838 llvm::Expected<StringExtractorGDBRemote> response =
2842 "MultiMemRead error response: {0}");
2846 llvm::StringRef response_str = response->GetStringRef();
2847 const unsigned expected_num_ranges = ranges_for_request.size();
2849 response_str, buffer, expected_num_ranges, memory_regions)) {
2851 "MultiMemRead error parsing response: {0}");
2855 return memory_regions;
2858llvm::Expected<StringExtractorGDBRemote>
2861 std::string packet_str;
2862 llvm::raw_string_ostream stream(packet_str);
2863 stream <<
"MultiMemRead:ranges:";
2865 auto range_to_stream = [&](
auto range) {
2867 stream << llvm::formatv(
"{0:x-},{1:x-}", range.base, range.size);
2869 llvm::interleave(ranges, stream, range_to_stream,
",");
2874 m_gdb_comm.SendPacketAndWaitForResponse(packet_str.data(), response,
2877 return llvm::createStringErrorV(
"MultiMemRead failed to send packet: '{0}'",
2881 return llvm::createStringErrorV(
"MultiMemRead failed: '{0}'",
2885 return llvm::createStringErrorV(
"MultiMemRead unexpected response: '{0}'",
2892 llvm::StringRef response_str, llvm::MutableArrayRef<uint8_t> buffer,
2893 unsigned expected_num_ranges,
2896 auto [sizes_str, memory_data] = response_str.split(
';');
2897 if (sizes_str.size() == response_str.size())
2898 return llvm::createStringErrorV(
2899 "MultiMemRead response missing field separator ';' in: '{0}'",
2903 for (llvm::StringRef size_str : llvm::split(sizes_str,
',')) {
2905 if (size_str.getAsInteger(16, read_size))
2906 return llvm::createStringErrorV(
2907 "MultiMemRead response has invalid size string: {0}", size_str);
2909 if (memory_data.size() < read_size)
2910 return llvm::createStringErrorV(
"MultiMemRead response did not have "
2911 "enough data, requested sizes: {0}",
2914 llvm::StringRef region_to_read = memory_data.take_front(read_size);
2915 memory_data = memory_data.drop_front(read_size);
2917 assert(buffer.size() >= read_size);
2918 llvm::MutableArrayRef<uint8_t> region_to_write =
2919 buffer.take_front(read_size);
2920 buffer = buffer.drop_front(read_size);
2922 memcpy(region_to_write.data(), region_to_read.data(), read_size);
2923 memory_regions.push_back(region_to_write);
2926 return llvm::Error::success();
2930 return m_gdb_comm.GetMemoryTaggingSupported();
2933llvm::Expected<std::vector<uint8_t>>
2940 return llvm::createStringError(llvm::inconvertibleErrorCode(),
2941 "Error reading memory tags from remote");
2945 llvm::ArrayRef<uint8_t> tag_data = buffer_sp->GetData();
2946 std::vector<uint8_t> got;
2947 got.reserve(tag_data.size());
2948 std::copy(tag_data.begin(), tag_data.end(), std::back_inserter(got));
2954 const std::vector<uint8_t> &tags) {
2957 return m_gdb_comm.WriteMemoryTags(addr, len, type, tags);
2961 std::vector<ObjectFile::LoadableData> entries) {
2971 if (
error.Success())
2985 for (
size_t i = 0; i < size; ++i)
3010 if (blocksize == 0) {
3018 lldb::addr_t block_start_addr = addr - (addr % blocksize);
3019 size += (addr - block_start_addr);
3020 if ((size % blocksize) != 0)
3021 size += (blocksize - size % blocksize);
3037 auto overlap = last_range.GetRangeEnd() - range.
GetRangeBase();
3058 "flash erase failed for 0x%" PRIx64, addr);
3061 "GDB server does not support flashing");
3064 "unexpected response to GDB server flash erase packet '%s': '%s'",
3081 if (
m_gdb_comm.SendPacketAndWaitForResponse(
"vFlashDone", response,
3091 "GDB server does not support flashing");
3094 "unexpected response to GDB server flash done packet: '%s'",
3109 if (size > max_memory_size) {
3113 size = max_memory_size;
3134 if (!
error.Success())
3136 packet.
Printf(
"vFlashWrite:%" PRIx64
":", addr);
3139 packet.
Printf(
"M%" PRIx64
",%" PRIx64
":", addr, (uint64_t)size);
3152 "memory write failed for 0x%" PRIx64, addr);
3155 "GDB server does not support writing memory");
3158 "unexpected response to GDB server memory write packet '%s': '%s'",
3168 uint32_t permissions,
3174 allocated_addr =
m_gdb_comm.AllocateMemory(size, permissions);
3177 return allocated_addr;
3183 if (permissions & lldb::ePermissionsReadable)
3185 if (permissions & lldb::ePermissionsWritable)
3187 if (permissions & lldb::ePermissionsExecutable)
3196 "ProcessGDBRemote::%s no direct stub support for memory "
3197 "allocation, and InferiorCallMmap also failed - is stub "
3198 "missing register context save/restore capability?",
3205 "unable to allocate %" PRIu64
" bytes of memory with permissions %s",
3209 return allocated_addr;
3224 return m_gdb_comm.GetWatchpointReportedAfter();
3231 switch (supported) {
3236 "tried to deallocate memory without ever allocating memory");
3242 "unable to deallocate memory at 0x%" PRIx64, addr);
3254 "unable to deallocate memory at 0x%" PRIx64, addr);
3269 m_gdb_comm.SendStdinNotification(src, src_len);
3276 assert(bp_site !=
nullptr);
3287 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3288 ") address = 0x%" PRIx64,
3289 site_id, (uint64_t)addr);
3294 "ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
3295 ") address = 0x%" PRIx64
" -- SUCCESS (already enabled)",
3296 site_id, (uint64_t)addr);
3315 uint8_t error_no =
m_gdb_comm.SendGDBStoppointTypePacket(
3317 if (error_no == 0) {
3333 if (error_no != UINT8_MAX)
3335 "error: %d sending the breakpoint request", error_no);
3344 LLDB_LOGF(log,
"Software breakpoints are unsupported");
3355 uint8_t error_no =
m_gdb_comm.SendGDBStoppointTypePacket(
3357 if (error_no == 0) {
3368 if (error_no != UINT8_MAX)
3370 "error: %d sending the hardware breakpoint request "
3371 "(hardware breakpoint resources might be exhausted or unavailable)",
3375 "error sending the hardware breakpoint request "
3376 "(hardware breakpoint resources "
3377 "might be exhausted or unavailable)");
3383 LLDB_LOGF(log,
"Hardware breakpoints are unsupported");
3401 assert(bp_site !=
nullptr);
3406 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3407 ") addr = 0x%8.8" PRIx64,
3408 site_id, (uint64_t)addr);
3433 if (
error.Success())
3437 "ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
3438 ") addr = 0x%8.8" PRIx64
" -- SUCCESS (already disabled)",
3439 site_id, (uint64_t)addr);
3443 if (
error.Success())
3452 bool read = wp_res_sp->WatchpointResourceRead();
3453 bool write = wp_res_sp->WatchpointResourceWrite();
3455 assert((read || write) &&
3456 "WatchpointResource type is neither read nor write");
3472 addr_t addr = wp_sp->GetLoadAddress();
3474 LLDB_LOGF(log,
"ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
")",
3476 if (wp_sp->IsEnabled()) {
3478 "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
3479 ") addr = 0x%8.8" PRIx64
": watchpoint already enabled.",
3480 watchID, (uint64_t)addr);
3484 bool read = wp_sp->WatchpointRead();
3485 bool write = wp_sp->WatchpointWrite() || wp_sp->WatchpointModify();
3486 size_t size = wp_sp->GetByteSize();
3489 WatchpointHardwareFeature supported_features =
3492 std::vector<WatchpointResourceSP> resources =
3494 addr, size, read, write, supported_features, target_arch);
3519 bool set_all_resources =
true;
3520 std::vector<WatchpointResourceSP> succesfully_set_resources;
3521 for (
const auto &wp_res_sp : resources) {
3522 addr_t addr = wp_res_sp->GetLoadAddress();
3523 size_t size = wp_res_sp->GetByteSize();
3525 if (!
m_gdb_comm.SupportsGDBStoppointPacket(type) ||
3526 m_gdb_comm.SendGDBStoppointTypePacket(type,
true, addr, size,
3528 set_all_resources =
false;
3531 succesfully_set_resources.push_back(wp_res_sp);
3534 if (set_all_resources) {
3535 wp_sp->SetEnabled(
true, notify);
3536 for (
const auto &wp_res_sp : resources) {
3539 wp_res_sp->AddConstituent(wp_sp);
3547 for (
const auto &wp_res_sp : succesfully_set_resources) {
3548 addr_t addr = wp_res_sp->GetLoadAddress();
3549 size_t size = wp_res_sp->GetByteSize();
3551 m_gdb_comm.SendGDBStoppointTypePacket(type,
false, addr, size,
3555 "Setting one of the watchpoint resources failed");
3571 addr_t addr = wp_sp->GetLoadAddress();
3574 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3575 ") addr = 0x%8.8" PRIx64,
3576 watchID, (uint64_t)addr);
3578 if (!wp_sp->IsEnabled()) {
3580 "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
3581 ") addr = 0x%8.8" PRIx64
" -- SUCCESS (already disabled)",
3582 watchID, (uint64_t)addr);
3586 wp_sp->SetEnabled(
false, notify);
3590 if (wp_sp->IsHardware()) {
3591 bool disabled_all =
true;
3593 std::vector<WatchpointResourceSP> unused_resources;
3595 if (wp_res_sp->ConstituentsContains(wp_sp)) {
3597 addr_t addr = wp_res_sp->GetLoadAddress();
3598 size_t size = wp_res_sp->GetByteSize();
3599 if (
m_gdb_comm.SendGDBStoppointTypePacket(type,
false, addr, size,
3601 disabled_all =
false;
3603 wp_res_sp->RemoveConstituent(wp_sp);
3604 if (wp_res_sp->GetNumberOfConstituents() == 0)
3605 unused_resources.push_back(wp_res_sp);
3609 for (
auto &wp_res_sp : unused_resources)
3612 wp_sp->SetEnabled(
false, notify);
3615 "Failure disabling one of the watchpoint locations");
3628 LLDB_LOGF(log,
"ProcessGDBRemote::DoSignal (signal = %d)", signo);
3643 if (platform_sp && !platform_sp->IsHost())
3648 const char *error_string =
error.AsCString();
3649 if (error_string ==
nullptr)
3658 static FileSpec g_debugserver_file_spec;
3665 std::string env_debugserver_path = host_env.lookup(
"LLDB_DEBUGSERVER_PATH");
3666 if (!env_debugserver_path.empty()) {
3667 debugserver_file_spec.
SetFile(env_debugserver_path,
3668 FileSpec::Style::native);
3669 LLDB_LOG(log,
"gdb-remote stub exe path set from environment variable: {0}",
3670 env_debugserver_path);
3672 debugserver_file_spec = g_debugserver_file_spec;
3674 return debugserver_file_spec;
3677 debugserver_file_spec = HostInfo::GetSupportExeDir();
3678 if (debugserver_file_spec) {
3681 LLDB_LOG(log,
"found gdb-remote stub exe '{0}'", debugserver_file_spec);
3683 g_debugserver_file_spec = debugserver_file_spec;
3686 if (!debugserver_file_spec) {
3689 LLDB_LOG(log,
"could not find gdb-remote stub exe '{0}'",
3690 debugserver_file_spec);
3694 g_debugserver_file_spec.
Clear();
3697 return debugserver_file_spec;
3702 using namespace std::placeholders;
3712 const std::weak_ptr<ProcessGDBRemote> this_wp =
3713 std::static_pointer_cast<ProcessGDBRemote>(shared_from_this());
3720#if defined(__APPLE__)
3724 int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID,
3726 struct kinfo_proc processInfo;
3727 size_t bufsize =
sizeof(processInfo);
3728 if (sysctl(mib, (
unsigned)(
sizeof(mib) /
sizeof(
int)), &processInfo, &bufsize,
3731 if (processInfo.kp_proc.p_flag & P_TRANSLATED) {
3732 debugserver_path =
FileSpec(
"/Library/Apple/usr/libexec/oah/debugserver");
3739 "'. Please ensure it is properly installed "
3740 "and available in your PATH");
3755 debugserver_launch_info,
nullptr);
3760 LLDB_LOGF(log,
"failed to start debugserver process: %s",
3770 m_gdb_comm.SetConnection(std::make_unique<ConnectionFileDescriptor>(
3771 std::move(socket_pair->second)));
3785 std::weak_ptr<ProcessGDBRemote> process_wp,
lldb::pid_t debugserver_pid,
3794 "ProcessGDBRemote::%s(process_wp, pid=%" PRIu64
3795 ", signo=%i (0x%x), exit_status=%i)",
3796 __FUNCTION__, debugserver_pid, signo, signo, exit_status);
3798 std::shared_ptr<ProcessGDBRemote> process_sp = process_wp.lock();
3799 LLDB_LOGF(log,
"ProcessGDBRemote::%s(process = %p)", __FUNCTION__,
3800 static_cast<void *
>(process_sp.get()));
3801 if (!process_sp || process_sp->m_debugserver_pid != debugserver_pid)
3807 std::this_thread::sleep_for(std::chrono::milliseconds(500));
3811 const StateType state = process_sp->GetState();
3820 llvm::StringRef signal_name =
3821 process_sp->GetUnixSignals()->GetSignalAsStringRef(signo);
3823 if (!signal_name.empty())
3824 stream.
Format(format_str, signal_name);
3826 stream.
Format(format_str, signo);
3828 process_sp->SetExitStatus(-1, stream.
GetString());
3851 debugger, PluginProperties::GetSettingName())) {
3852 const bool is_global_setting =
true;
3855 "Properties for the gdb-remote process plug-in.", is_global_setting);
3862 LLDB_LOGF(log,
"ProcessGDBRemote::%s ()", __FUNCTION__);
3869 llvm::Expected<HostThread> async_thread =
3873 if (!async_thread) {
3875 "failed to launch host thread: {0}");
3881 "ProcessGDBRemote::%s () - Called when Async thread was "
3891 LLDB_LOGF(log,
"ProcessGDBRemote::%s ()", __FUNCTION__);
3906 "ProcessGDBRemote::%s () - Called when Async thread was not running.",
3912 LLDB_LOGF(log,
"ProcessGDBRemote::%s(pid = %" PRIu64
") thread starting...",
3913 __FUNCTION__,
GetID());
3931 "ProcessGDBRemote::%s(pid = %" PRIu64
3932 ") listener.WaitForEvent (NULL, event_sp)...",
3933 __FUNCTION__,
GetID());
3936 const uint32_t event_type = event_sp->GetType();
3939 "ProcessGDBRemote::%s(pid = %" PRIu64
3940 ") Got an event of type: %d...",
3941 __FUNCTION__,
GetID(), event_type);
3943 switch (event_type) {
3948 if (continue_packet) {
3949 const char *continue_cstr =
3950 (
const char *)continue_packet->
GetBytes();
3951 const size_t continue_cstr_len = continue_packet->
GetByteSize();
3953 "ProcessGDBRemote::%s(pid = %" PRIu64
3954 ") got eBroadcastBitAsyncContinue: %s",
3955 __FUNCTION__,
GetID(), continue_cstr);
3957 if (::strstr(continue_cstr,
"vAttach") ==
nullptr)
3964 llvm::StringRef(continue_cstr, continue_cstr_len),
3975 switch (stop_state) {
3988 int exit_status = response.
GetHexU8();
3989 std::string desc_string;
3991 llvm::StringRef desc_str;
3992 llvm::StringRef desc_token;
3994 if (desc_token !=
"description")
4009 if (::strstr(continue_cstr,
"vAttach") !=
nullptr &&
4012 "System Integrity Protection");
4013 }
else if (::strstr(continue_cstr,
"vAttach") !=
nullptr &&
4033 "ProcessGDBRemote::%s(pid = %" PRIu64
4034 ") got eBroadcastBitAsyncThreadShouldExit...",
4035 __FUNCTION__,
GetID());
4041 "ProcessGDBRemote::%s(pid = %" PRIu64
4042 ") got unknown event 0x%8.8x",
4043 __FUNCTION__,
GetID(), event_type);
4050 "ProcessGDBRemote::%s(pid = %" PRIu64
4051 ") listener.WaitForEvent (NULL, event_sp) => false",
4052 __FUNCTION__,
GetID());
4057 LLDB_LOGF(log,
"ProcessGDBRemote::%s(pid = %" PRIu64
") thread exiting...",
4058 __FUNCTION__,
GetID());
4090 LLDB_LOGF(log,
"Hit New Thread Notification breakpoint.");
4096 LLDB_LOG(log,
"Check if need to update ignored signals");
4110 LLDB_LOG(log,
"Signals' version hasn't changed. version={0}",
4115 auto signals_to_ignore =
4120 "Signals' version changed. old version={0}, new version={1}, "
4121 "signals ignored={2}, update result={3}",
4123 signals_to_ignore.size(),
error);
4125 if (
error.Success())
4135 LLDB_LOGF(log,
"Enabled noticing new thread breakpoint.");
4141 platform_sp->SetThreadCreationBreakpoint(
GetTarget());
4145 log,
"Successfully created new thread notification breakpoint %i",
4150 LLDB_LOGF(log,
"Failed to create new thread notification breakpoint.");
4160 LLDB_LOGF(log,
"Disabling new thread notification breakpoint.");
4180 return_value =
m_gdb_comm.SendLaunchEventDataPacket(data, &was_supported);
4181 if (return_value != 0) {
4184 "Sending events is not supported for this process.");
4194 if (
m_gdb_comm.GetQXferAuxvReadSupported()) {
4195 llvm::Expected<std::string> response =
m_gdb_comm.ReadExtFeature(
"auxv",
"");
4197 buf = std::make_shared<DataBufferHeap>(response->c_str(),
4198 response->length());
4209 if (
m_gdb_comm.GetThreadExtendedInfoSupported()) {
4215 args_dict->GetAsDictionary()->AddIntegerItem(
"thread", tid);
4218 packet <<
"jThreadExtendedInfo:";
4219 args_dict->Dump(packet,
false);
4226 packet << (char)(0x7d ^ 0x20);
4235 if (!response.
Empty()) {
4248 args_dict->GetAsDictionary()->AddIntegerItem(
"image_list_address",
4249 image_list_address);
4250 args_dict->GetAsDictionary()->AddIntegerItem(
"image_count", image_count);
4258 args_dict->GetAsDictionary()->AddBooleanItem(
"fetch_all_solibs",
true);
4264 const std::vector<lldb::addr_t> &load_addresses) {
4268 for (
auto addr : load_addresses)
4269 addresses->AddIntegerItem(addr);
4271 args_dict->GetAsDictionary()->AddItem(
"solib_addresses", addresses);
4281 if (
m_gdb_comm.GetLoadedDynamicLibrariesInfosSupported()) {
4284 std::chrono::seconds(10));
4287 packet <<
"jGetLoadedDynamicLibrariesInfos:";
4288 args_dict->Dump(packet,
false);
4295 packet << (char)(0x7d ^ 0x20);
4304 if (!response.
Empty()) {
4317 if (
m_gdb_comm.GetDynamicLoaderProcessStateSupported()) {
4320 if (
m_gdb_comm.SendPacketAndWaitForResponse(
"jGetDyldProcessState",
4326 if (!response.
Empty()) {
4343 packet <<
"jGetSharedCacheInfo:";
4344 args_dict->Dump(packet,
false);
4353 if (response.
Empty())
4362 if (!dict->
HasKey(
"shared_cache_uuid"))
4364 llvm::StringRef uuid_str;
4366 uuid_str ==
"00000000-0000-0000-0000-000000000000")
4368 if (dict->
HasKey(
"shared_cache_path")) {
4382 HostInfo::SharedCacheIndexFiles(sc_path, uuid, sc_mode);
4393 return m_gdb_comm.ConfigureRemoteStructuredData(type_name, config_sp);
4406 const uint64_t reasonable_largeish_default = 128 * 1024;
4407 const uint64_t conservative_default = 512;
4410 uint64_t stub_max_size =
m_gdb_comm.GetRemoteMaxPacketSize();
4411 if (stub_max_size !=
UINT64_MAX && stub_max_size != 0) {
4417 if (stub_max_size > reasonable_largeish_default) {
4418 stub_max_size = reasonable_largeish_default;
4424 if (stub_max_size > 70)
4425 stub_max_size -= 32 + 32 + 6;
4431 log->
Warning(
"Packet size is too small. "
4432 "LLDB may face problems while writing memory");
4443 uint64_t user_specified_max) {
4444 if (user_specified_max != 0) {
4472 module_spec = cached->second;
4473 return bool(module_spec);
4476 if (!
m_gdb_comm.GetModuleInfo(module_file_spec, arch, module_spec)) {
4477 LLDB_LOGF(log,
"ProcessGDBRemote::%s - failed to get module info for %s:%s",
4478 __FUNCTION__, module_file_spec.
GetPath().c_str(),
4485 module_spec.
Dump(stream);
4486 LLDB_LOGF(log,
"ProcessGDBRemote::%s - got module info for (%s:%s) : %s",
4487 __FUNCTION__, module_file_spec.
GetPath().c_str(),
4496 llvm::ArrayRef<FileSpec> module_file_specs,
const llvm::Triple &triple) {
4497 auto module_specs =
m_gdb_comm.GetModulesInfo(module_file_specs, triple);
4499 for (
const FileSpec &spec : module_file_specs)
4504 triple.getTriple())] = spec;
4518typedef std::vector<std::string> stringVec;
4520typedef std::vector<struct GdbServerRegisterInfo> GDBServerRegisterVec;
4521struct RegisterSetInfo {
4525typedef std::map<uint32_t, RegisterSetInfo> RegisterSetMap;
4527struct GdbServerTargetInfo {
4531 RegisterSetMap reg_set_map;
4548 std::map<uint64_t, FieldEnum::Enumerator> enumerators;
4551 "evalue", [&enumerators, &log](
const XMLNode &enumerator_node) {
4552 std::optional<llvm::StringRef> name;
4553 std::optional<uint64_t> value;
4556 [&name, &value, &log](
const llvm::StringRef &attr_name,
4557 const llvm::StringRef &attr_value) {
4558 if (attr_name ==
"name") {
4559 if (attr_value.size())
4562 LLDB_LOG(log,
"ProcessGDBRemote::ParseEnumEvalues "
4563 "Ignoring empty name in evalue");
4564 }
else if (attr_name ==
"value") {
4565 uint64_t parsed_value = 0;
4566 if (llvm::to_integer(attr_value, parsed_value))
4567 value = parsed_value;
4570 "ProcessGDBRemote::ParseEnumEvalues "
4571 "Invalid value \"{0}\" in "
4576 "ProcessGDBRemote::ParseEnumEvalues Ignoring "
4577 "unknown attribute "
4578 "\"{0}\" in evalue",
4586 enumerators.insert_or_assign(
4587 *value, FieldEnum::Enumerator(*value, name->str()));
4594 for (
auto [_, enumerator] : enumerators)
4595 final_enumerators.push_back(enumerator);
4597 return final_enumerators;
4601ParseEnums(XMLNode feature_node,
4602 llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4603 Log *log(
GetLog(GDBRLog::Process));
4607 "enum", [log, ®isters_enum_types](
const XMLNode &enum_node) {
4611 const llvm::StringRef &attr_value) {
4612 if (attr_name ==
"id")
4630 if (!enumerators.empty()) {
4632 "ProcessGDBRemote::ParseEnums Found enum type \"{0}\"",
4634 registers_enum_types.insert_or_assign(
4635 id, std::make_unique<FieldEnum>(
id, enumerators));
4644static std::vector<RegisterFlags::Field> ParseFlagsFields(
4645 XMLNode flags_node,
unsigned size,
4646 const llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4647 Log *log(
GetLog(GDBRLog::Process));
4648 const unsigned max_start_bit = size * 8 - 1;
4651 std::vector<RegisterFlags::Field> fields;
4653 ®isters_enum_types](
4656 std::optional<llvm::StringRef> name;
4657 std::optional<unsigned> start;
4658 std::optional<unsigned> end;
4659 std::optional<llvm::StringRef> type;
4662 &log](
const llvm::StringRef &attr_name,
4663 const llvm::StringRef &attr_value) {
4666 if (attr_name ==
"name") {
4669 "ProcessGDBRemote::ParseFlagsFields Found field node name \"{0}\"",
4672 }
else if (attr_name ==
"start") {
4673 unsigned parsed_start = 0;
4674 if (llvm::to_integer(attr_value, parsed_start)) {
4675 if (parsed_start > max_start_bit) {
4677 "ProcessGDBRemote::ParseFlagsFields Invalid start {0} in "
4680 parsed_start, max_start_bit);
4682 start = parsed_start;
4686 "ProcessGDBRemote::ParseFlagsFields Invalid start \"{0}\" in "
4690 }
else if (attr_name ==
"end") {
4691 unsigned parsed_end = 0;
4692 if (llvm::to_integer(attr_value, parsed_end))
4693 if (parsed_end > max_start_bit) {
4695 "ProcessGDBRemote::ParseFlagsFields Invalid end {0} in "
4698 parsed_end, max_start_bit);
4703 "ProcessGDBRemote::ParseFlagsFields Invalid end \"{0}\" in "
4707 }
else if (attr_name ==
"type") {
4712 "ProcessGDBRemote::ParseFlagsFields Ignoring unknown attribute "
4713 "\"{0}\" in field node",
4720 if (name && start && end) {
4724 "ProcessGDBRemote::ParseFlagsFields Start {0} > end {1} in field "
4725 "\"{2}\", ignoring",
4726 *start, *end, name->data());
4730 "ProcessGDBRemote::ParseFlagsFields Ignoring field \"{2}\" "
4732 "size > 64 bits, this is not supported",
4736 const FieldEnum *enum_type =
nullptr;
4737 if (type && !type->empty()) {
4738 auto found = registers_enum_types.find(*type);
4739 if (found != registers_enum_types.end()) {
4740 enum_type = found->second.get();
4743 uint64_t max_value =
4746 if (enumerator.m_value > max_value) {
4747 enum_type =
nullptr;
4750 "ProcessGDBRemote::ParseFlagsFields In enum \"{0}\" "
4751 "evalue \"{1}\" with value {2} exceeds the maximum value "
4752 "of field \"{3}\" ({4}), ignoring enum",
4753 type->data(), enumerator.m_name, enumerator.m_value,
4754 name->data(), max_value);
4760 "ProcessGDBRemote::ParseFlagsFields Could not find type "
4762 "for field \"{1}\", ignoring",
4763 type->data(), name->data());
4768 RegisterFlags::Field(name->str(), *start, *end, enum_type));
4779 XMLNode feature_node,
4780 llvm::StringMap<std::unique_ptr<RegisterFlags>> ®isters_flags_types,
4781 const llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4782 Log *log(
GetLog(GDBRLog::Process));
4786 [&log, ®isters_flags_types,
4787 ®isters_enum_types](
const XMLNode &flags_node) ->
bool {
4788 LLDB_LOG(log,
"ProcessGDBRemote::ParseFlags Found flags node \"{0}\"",
4791 std::optional<llvm::StringRef>
id;
4792 std::optional<unsigned> size;
4794 [&
id, &size, &log](
const llvm::StringRef &name,
4795 const llvm::StringRef &value) {
4798 }
else if (name ==
"size") {
4799 unsigned parsed_size = 0;
4800 if (llvm::to_integer(value, parsed_size))
4804 "ProcessGDBRemote::ParseFlags Invalid size \"{0}\" "
4810 "ProcessGDBRemote::ParseFlags Ignoring unknown "
4811 "attribute \"{0}\" in flags node",
4819 std::vector<RegisterFlags::Field> fields =
4820 ParseFlagsFields(flags_node, *size, registers_enum_types);
4821 if (fields.size()) {
4823 std::sort(fields.rbegin(), fields.rend());
4824 std::vector<RegisterFlags::Field>::const_iterator overlap =
4825 std::adjacent_find(fields.begin(), fields.end(),
4826 [](
const RegisterFlags::Field &lhs,
4827 const RegisterFlags::Field &rhs) {
4828 return lhs.Overlaps(rhs);
4832 if (overlap == fields.end()) {
4833 if (registers_flags_types.contains(*
id)) {
4847 "ProcessGDBRemote::ParseFlags Definition of flags "
4849 "previous definition, using original definition instead.",
4852 registers_flags_types.insert_or_assign(
4853 *
id, std::make_unique<RegisterFlags>(
id->str(), *size,
4854 std::move(fields)));
4858 std::vector<RegisterFlags::Field>::const_iterator next =
4862 "ProcessGDBRemote::ParseFlags Ignoring flags because fields "
4863 "{0} (start: {1} end: {2}) and {3} (start: {4} end: {5}) "
4865 overlap->GetName().c_str(), overlap->GetStart(),
4866 overlap->GetEnd(), next->GetName().c_str(), next->GetStart(),
4872 "ProcessGDBRemote::ParseFlags Ignoring definition of flags "
4873 "\"{0}\" because it contains no fields.",
4883 XMLNode feature_node, GdbServerTargetInfo &target_info,
4884 std::vector<DynamicRegisterInfo::Register> ®isters,
4885 llvm::StringMap<std::unique_ptr<RegisterFlags>> ®isters_flags_types,
4886 llvm::StringMap<std::unique_ptr<FieldEnum>> ®isters_enum_types) {
4890 Log *log(
GetLog(GDBRLog::Process));
4893 ParseEnums(feature_node, registers_enum_types);
4894 for (
const auto &enum_type : registers_enum_types)
4897 ParseFlags(feature_node, registers_flags_types, registers_enum_types);
4898 for (
const auto &flags : registers_flags_types)
4899 flags.second->DumpToLog(log);
4903 [&target_info, ®isters, ®isters_flags_types,
4904 log](
const XMLNode ®_node) ->
bool {
4905 std::string gdb_group;
4906 std::string gdb_type;
4907 DynamicRegisterInfo::Register reg_info;
4908 bool encoding_set =
false;
4909 bool format_set =
false;
4913 &encoding_set, &format_set, ®_info,
4914 log](
const llvm::StringRef &name,
4915 const llvm::StringRef &value) ->
bool {
4916 if (name ==
"name") {
4918 }
else if (name ==
"bitsize") {
4919 if (llvm::to_integer(value, reg_info.
byte_size))
4921 llvm::divideCeil(reg_info.
byte_size, CHAR_BIT);
4922 }
else if (name ==
"type") {
4923 gdb_type = value.str();
4924 }
else if (name ==
"group") {
4925 gdb_group = value.str();
4926 }
else if (name ==
"regnum") {
4928 }
else if (name ==
"offset") {
4930 }
else if (name ==
"altname") {
4932 }
else if (name ==
"encoding") {
4933 encoding_set =
true;
4935 }
else if (name ==
"format") {
4941 llvm::StringSwitch<lldb::Format>(value)
4952 }
else if (name ==
"group_id") {
4954 llvm::to_integer(value, set_id);
4955 RegisterSetMap::const_iterator pos =
4956 target_info.reg_set_map.find(set_id);
4957 if (pos != target_info.reg_set_map.end())
4958 reg_info.
set_name = pos->second.name;
4959 }
else if (name ==
"gcc_regnum" || name ==
"ehframe_regnum") {
4961 }
else if (name ==
"dwarf_regnum") {
4963 }
else if (name ==
"generic") {
4965 }
else if (name ==
"value_regnums") {
4968 }
else if (name ==
"invalidate_regnums") {
4973 "ProcessGDBRemote::ParseRegisters unhandled reg "
4974 "attribute %s = %s",
4975 name.data(), value.data());
4980 if (!gdb_type.empty()) {
4982 llvm::StringMap<std::unique_ptr<RegisterFlags>>::iterator it =
4983 registers_flags_types.find(gdb_type);
4984 if (it != registers_flags_types.end()) {
4985 auto flags_type = it->second.get();
4986 if (reg_info.
byte_size == flags_type->GetSize())
4990 "ProcessGDBRemote::ParseRegisters Size of register "
4991 "flags %s (%d bytes) for "
4992 "register %s does not match the register size (%d "
4993 "bytes). Ignoring this set of flags.",
4994 flags_type->GetID().c_str(), flags_type->GetSize(),
5001 if (!gdb_type.empty() && !(encoding_set || format_set)) {
5002 if (llvm::StringRef(gdb_type).starts_with(
"int")) {
5005 }
else if (gdb_type ==
"data_ptr" || gdb_type ==
"code_ptr") {
5008 }
else if (gdb_type ==
"float" || gdb_type ==
"ieee_single" ||
5009 gdb_type ==
"ieee_double") {
5012 }
else if (gdb_type ==
"aarch64v" ||
5013 llvm::StringRef(gdb_type).starts_with(
"vec") ||
5014 gdb_type ==
"i387_ext" || gdb_type ==
"uint128" ||
5027 "ProcessGDBRemote::ParseRegisters Could not determine lldb"
5028 "format and encoding for gdb type %s",
5038 if (!gdb_group.empty()) {
5049 "ProcessGDBRemote::%s Skipping zero bitsize register %s",
5052 registers.push_back(reg_info);
5067 ArchSpec &arch_to_use, std::string xml_filename,
5068 std::vector<DynamicRegisterInfo::Register> ®isters) {
5070 llvm::Expected<std::string> raw =
m_gdb_comm.ReadExtFeature(
"features", xml_filename);
5071 if (errorToBool(raw.takeError()))
5076 if (xml_document.
ParseMemory(raw->c_str(), raw->size(),
5077 xml_filename.c_str())) {
5078 GdbServerTargetInfo target_info;
5079 std::vector<XMLNode> feature_nodes;
5085 const XMLNode &node) ->
bool {
5086 llvm::StringRef name = node.
GetName();
5087 if (name ==
"architecture") {
5089 }
else if (name ==
"osabi") {
5091 }
else if (name ==
"xi:include" || name ==
"include") {
5094 target_info.includes.push_back(href);
5095 }
else if (name ==
"feature") {
5096 feature_nodes.push_back(node);
5097 }
else if (name ==
"groups") {
5099 "group", [&target_info](
const XMLNode &node) ->
bool {
5101 RegisterSetInfo set_info;
5104 [&set_id, &set_info](
const llvm::StringRef &name,
5105 const llvm::StringRef &value) ->
bool {
5108 llvm::to_integer(value, set_id);
5115 target_info.reg_set_map[set_id] = set_info;
5128 feature_nodes.push_back(feature_node);
5130 const XMLNode &node) ->
bool {
5131 llvm::StringRef name = node.
GetName();
5132 if (name ==
"xi:include" || name ==
"include") {
5135 target_info.includes.push_back(href);
5149 if (!arch_to_use.
IsValid() && !target_info.arch.empty()) {
5151 arch_to_use.
SetTriple(llvm::StringSwitch<std::string>(target_info.arch)
5152 .Case(
"i386:x86-64",
"x86_64")
5153 .Case(
"riscv:rv64",
"riscv64")
5154 .Case(
"riscv:rv32",
"riscv32")
5155 .Default(target_info.arch) +
5163 for (
auto &feature_node : feature_nodes) {
5164 ParseRegisters(feature_node, target_info, registers,
5168 for (
const auto &include : target_info.includes) {
5180 std::vector<DynamicRegisterInfo::Register> ®isters,
5182 std::map<uint32_t, uint32_t> remote_to_local_map;
5183 uint32_t remote_regnum = 0;
5184 for (
auto it : llvm::enumerate(registers)) {
5192 remote_to_local_map[remote_reg_info.
regnum_remote] = it.index();
5198 auto proc_to_lldb = [&remote_to_local_map](uint32_t process_regnum) {
5199 auto lldb_regit = remote_to_local_map.find(process_regnum);
5200 return lldb_regit != remote_to_local_map.end() ? lldb_regit->second
5204 llvm::transform(remote_reg_info.value_regs,
5205 remote_reg_info.value_regs.begin(), proc_to_lldb);
5206 llvm::transform(remote_reg_info.invalidate_regs,
5207 remote_reg_info.invalidate_regs.begin(), proc_to_lldb);
5214 abi_sp->AugmentRegisterInfo(registers);
5224 if (!
m_gdb_comm.GetQXferFeaturesReadSupported())
5225 return llvm::createStringError(
5226 llvm::inconvertibleErrorCode(),
5227 "the debug server does not support \"qXfer:features:read\"");
5230 return llvm::createStringError(
5231 llvm::inconvertibleErrorCode(),
5232 "the debug server supports \"qXfer:features:read\", but LLDB does not "
5233 "have XML parsing enabled (check LLLDB_ENABLE_LIBXML2)");
5243 std::vector<DynamicRegisterInfo::Register> registers;
5251 ? llvm::ErrorSuccess()
5252 : llvm::createStringError(
5253 llvm::inconvertibleErrorCode(),
5254 "the debug server did not describe any registers");
5260 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5261 "XML parsing not available");
5264 LLDB_LOGF(log,
"ProcessGDBRemote::%s", __FUNCTION__);
5273 llvm::Expected<std::string> raw = comm.
ReadExtFeature(
"libraries-svr4",
"");
5275 return raw.takeError();
5278 LLDB_LOGF(log,
"parsing: %s", raw->c_str());
5281 if (!doc.
ParseMemory(raw->c_str(), raw->size(),
"noname.xml"))
5282 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5283 "Error reading noname.xml");
5287 return llvm::createStringError(
5288 llvm::inconvertibleErrorCode(),
5289 "Error finding library-list-svr4 xml element");
5294 if (!main_lm.empty())
5298 "library", [log, &list](
const XMLNode &library) ->
bool {
5303 [&module](
const llvm::StringRef &name,
5304 const llvm::StringRef &value) ->
bool {
5307 module.set_name(value.str());
5308 else if (name ==
"lm") {
5310 llvm::to_integer(value, uint_value);
5311 module.set_link_map(uint_value);
5312 }
else if (name ==
"l_addr") {
5315 llvm::to_integer(value, uint_value);
5316 module.set_base(uint_value);
5319 module.set_base_is_offset(true);
5320 }
else if (name ==
"l_ld") {
5322 llvm::to_integer(value, uint_value);
5323 module.set_dynamic(uint_value);
5332 bool base_is_offset;
5334 module.get_name(name);
5335 module.get_link_map(lm);
5336 module.get_base(base);
5337 module.get_base_is_offset(base_is_offset);
5338 module.get_dynamic(ld);
5341 "found (link_map:0x%08" PRIx64
", base:0x%08" PRIx64
5342 "[%s], ld:0x%08" PRIx64
", name:'%s')",
5343 lm, base, (base_is_offset ?
"offset" :
"absolute"), ld,
5353 LLDB_LOGF(log,
"found %" PRId32
" modules in total",
5354 (
int)list.
m_list.size());
5358 llvm::Expected<std::string> raw = comm.
ReadExtFeature(
"libraries",
"");
5361 return raw.takeError();
5363 LLDB_LOGF(log,
"parsing: %s", raw->c_str());
5366 if (!doc.
ParseMemory(raw->c_str(), raw->size(),
"noname.xml"))
5367 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5368 "Error reading noname.xml");
5372 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5373 "Error finding library-list xml element");
5377 "library", [log, &list](
const XMLNode &library) ->
bool {
5381 module.set_name(name);
5390 llvm::to_integer(address, address_value);
5391 module.set_base(address_value);
5393 module.set_base_is_offset(false);
5398 bool base_is_offset;
5399 module.get_name(name);
5400 module.get_base(base);
5401 module.get_base_is_offset(base_is_offset);
5403 LLDB_LOGF(log,
"found (base:0x%08" PRIx64
"[%s], name:'%s')", base,
5404 (base_is_offset ?
"offset" :
"absolute"), name.c_str());
5413 LLDB_LOGF(log,
"found %" PRId32
" modules in total",
5414 (
int)list.
m_list.size());
5417 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5418 "Remote libraries not supported");
5425 bool value_is_offset) {
5440 return module_list.takeError();
5446 std::string mod_name;
5449 bool mod_base_is_offset;
5452 valid &= modInfo.
get_name(mod_name);
5453 valid &= modInfo.
get_base(mod_base);
5466 if (module_sp.get())
5467 new_modules.
Append(module_sp);
5470 if (new_modules.
GetSize() > 0) {
5475 for (
size_t i = 0; i < loaded_modules.
GetSize(); ++i) {
5479 for (
size_t j = 0; j < new_modules.
GetSize(); ++j) {
5488 removed_modules.
Append(loaded_module);
5492 loaded_modules.
Remove(removed_modules);
5493 m_process->GetTarget().ModulesDidUnload(removed_modules,
false);
5509 m_process->GetTarget().ModulesDidLoad(new_modules);
5512 return llvm::ErrorSuccess();
5521 std::string file_path = file.
GetPath(
false);
5522 if (file_path.empty())
5543 "Fetching file load address from remote server returned an error");
5553 "Unknown error happened during sending the load address packet");
5574 std::string input = data.str();
5581 size_t found, pos = 0, len = input.length();
5582 while ((found = input.find(
end_delimiter, pos)) != std::string::npos) {
5584 input.substr(pos, found).c_str());
5585 std::string profile_data =
5600 std::map<uint64_t, uint32_t> new_thread_id_to_used_usec_map;
5602 llvm::raw_string_ostream output_stream(output);
5603 llvm::StringRef name, value;
5607 if (name.compare(
"thread_used_id") == 0) {
5609 uint64_t thread_id = threadIDHexExtractor.
GetHexMaxU64(
false, 0);
5611 bool has_used_usec =
false;
5612 uint32_t curr_used_usec = 0;
5613 llvm::StringRef usec_name, usec_value;
5614 uint32_t input_file_pos = profileDataExtractor.
GetFilePos();
5616 if (usec_name ==
"thread_used_usec") {
5617 has_used_usec =
true;
5618 usec_value.getAsInteger(0, curr_used_usec);
5622 profileDataExtractor.
SetFilePos(input_file_pos);
5626 if (has_used_usec) {
5627 uint32_t prev_used_usec = 0;
5628 std::map<uint64_t, uint32_t>::iterator iterator =
5631 prev_used_usec = iterator->second;
5633 uint32_t real_used_usec = curr_used_usec - prev_used_usec;
5635 bool good_first_time =
5636 (prev_used_usec == 0) && (real_used_usec > 250000);
5637 bool good_subsequent_time =
5638 (prev_used_usec > 0) &&
5641 if (good_first_time || good_subsequent_time) {
5645 output_stream << name <<
":";
5647 output_stream << index_id <<
";";
5649 output_stream << usec_name <<
":" << usec_value <<
";";
5652 llvm::StringRef local_name, local_value;
5658 new_thread_id_to_used_usec_map[thread_id] = curr_used_usec;
5661 output_stream << name <<
":" << value <<
";";
5664 output_stream << name <<
":" << value <<
";";
5699 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5700 "qSaveCore returned an error");
5705 for (
auto x : llvm::split(response.
GetStringRef(),
';')) {
5706 if (x.consume_front(
"core-path:"))
5712 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5713 "qSaveCore returned no core path");
5716 FileSpec remote_core{llvm::StringRef(path)};
5722 platform.
Unlink(remote_core);
5724 return error.ToError();
5730 return llvm::createStringError(llvm::inconvertibleErrorCode(),
5731 "Unable to send qSaveCore");
5744 "GDBRemoteCommunicationClientBase::%s() received $J packet "
5745 "but was not a StructuredData packet: packet starts with "
5758 json_sp->Dump(json_str,
true);
5761 "ProcessGDBRemote::%s() "
5762 "received Async StructuredData packet: %s",
5763 __FUNCTION__, json_str.
GetData());
5766 "ProcessGDBRemote::%s"
5767 "() received StructuredData packet:"
5777 if (structured_data_sp)
5785 "Tests packet speeds of various sizes to determine "
5786 "the performance characteristics of the GDB remote "
5791 "The number of packets to send of each varying size "
5792 "(default is 1000).",
5795 "The maximum number of bytes to send in a packet. Sizes "
5796 "increase in powers of 2 while the size is less than or "
5797 "equal to this option value. (default 1024).",
5800 "The maximum number of bytes to receive in a packet. Sizes "
5801 "increase in powers of 2 while the size is less than or "
5802 "equal to this option value. (default 1024).",
5805 "Print the output as JSON data for easy parsing.", false, true) {
5825 if (!output_stream_sp)
5826 output_stream_sp =
m_interpreter.GetDebugger().GetAsyncOutputStream();
5829 const uint32_t num_packets =
5831 const uint64_t max_send =
m_max_send.GetOptionValue().GetCurrentValue();
5832 const uint64_t max_recv =
m_max_recv.GetOptionValue().GetCurrentValue();
5833 const bool json =
m_json.GetOptionValue().GetCurrentValue();
5834 const uint64_t k_recv_amount =
5837 num_packets, max_send, max_recv, k_recv_amount, json,
5862 "Dumps the packet history buffer. ", nullptr) {}
5883 interpreter,
"process plugin packet xfer-size",
5884 "Maximum size that lldb will try to read/write one one chunk.",
5895 "amount to be transferred when "
5906 uint64_t user_specified_max = strtoul(packet_size,
nullptr, 10);
5907 if (errno == 0 && user_specified_max != 0) {
5922 "Send a custom packet through the GDB remote "
5923 "protocol and print the answer. "
5924 "The packet header and footer will automatically "
5925 "be added to the packet prior to sending and "
5926 "stripped from the result.",
5937 "'%s' takes a one or more packet content arguments",
5945 for (
size_t i = 0; i < argc; ++i) {
5952 output_strm.
Printf(
" packet: %s\n", packet_cstr);
5953 std::string response_str = std::string(response.
GetStringRef());
5955 if (strstr(packet_cstr,
"qGetProfileData") !=
nullptr) {
5959 if (response_str.empty())
5960 output_strm.
PutCString(
"response: \nerror: UNIMPLEMENTED\n");
5973 "Send a qRcmd packet through the GDB remote protocol "
5974 "and print the response. "
5975 "The argument passed to this command will be hex "
5976 "encoded into a valid 'qRcmd' packet, sent and the "
5977 "response will be printed.") {}
5983 if (command.empty()) {
6000 [&output_strm](llvm::StringRef output) { output_strm << output; });
6003 const std::string &response_str = std::string(response.
GetStringRef());
6005 if (response_str.empty())
6006 output_strm.
PutCString(
"response: \nerror: UNIMPLEMENTED\n");
6018 "Commands that deal with GDB remote packets.",
6047 interpreter,
"process plugin",
6048 "Commands for operating on a ProcessGDBRemote process.",
6049 "process plugin <subcommand> [<subcommand-options>]") {
6060 m_command_sp = std::make_shared<CommandObjectMultiwordProcessGDBRemote>(
6061 GetTarget().GetDebugger().GetCommandInterpreter());
6090 addr_t addr = wp_res_sp->GetLoadAddress();
6091 size_t size = wp_res_sp->GetByteSize();
6093 m_gdb_comm.SendGDBStoppointTypePacket(type, enable, addr, size,
6111 follow_pid = parent_pid;
6112 follow_tid = parent_tid;
6113 detach_pid = child_pid;
6114 detach_tid = child_tid;
6117 follow_pid = child_pid;
6118 follow_tid = child_tid;
6119 detach_pid = parent_pid;
6120 detach_tid = parent_tid;
6125 if (!
m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
6126 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to set pid/tid");
6140 if (!
m_gdb_comm.SetCurrentThread(follow_tid, follow_pid) ||
6141 !
m_gdb_comm.SetCurrentThreadForRun(follow_tid, follow_pid)) {
6142 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to reset pid/tid");
6146 LLDB_LOG(log,
"Detaching process {0}", detach_pid);
6149 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() detach packet send failed: {0}",
6150 error.AsCString() ?
error.AsCString() :
"<unknown error>");
6168 "ProcessGDBRemote::DidFork() called for child_pid: {0}, child_tid {1}",
6169 child_pid, child_tid);
6181 detach_pid = child_pid;
6182 detach_tid = child_tid;
6185 detach_pid =
m_gdb_comm.GetCurrentProcessID();
6191 if (!
m_gdb_comm.SetCurrentThread(detach_tid, detach_pid)) {
6192 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to set pid/tid");
6200 if (!
m_gdb_comm.SetCurrentThread(child_tid, child_pid) ||
6201 !
m_gdb_comm.SetCurrentThreadForRun(child_tid, child_pid)) {
6202 LLDB_LOG(log,
"ProcessGDBRemote::DidFork() unable to reset pid/tid");
6208 LLDB_LOG(log,
"Detaching process {0}", detach_pid);
6212 "ProcessGDBRemote::DidFork() detach packet send failed: {0}",
6213 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 uint64_t ComputeNumRangesMultiMemRead(uint64_t max_packet_size, llvm::ArrayRef< Range< lldb::addr_t, size_t > > ranges)
Returns the number of ranges that is safe to request using MultiMemRead while respecting max_packet_s...
static FileSpec GetDebugserverPath(Platform &platform)
static const int end_delimiter_len
CommandObjectMultiwordProcessGDBRemote(CommandInterpreter &interpreter)
~CommandObjectMultiwordProcessGDBRemote() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectProcessGDBRemotePacketHistory() override=default
CommandObjectProcessGDBRemotePacketHistory(CommandInterpreter &interpreter)
~CommandObjectProcessGDBRemotePacketMonitor() override=default
void DoExecute(llvm::StringRef command, CommandReturnObject &result) override
CommandObjectProcessGDBRemotePacketMonitor(CommandInterpreter &interpreter)
CommandObjectProcessGDBRemotePacketSend(CommandInterpreter &interpreter)
~CommandObjectProcessGDBRemotePacketSend() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectProcessGDBRemotePacketXferSize() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectProcessGDBRemotePacketXferSize(CommandInterpreter &interpreter)
~CommandObjectProcessGDBRemotePacket() override=default
CommandObjectProcessGDBRemotePacket(CommandInterpreter &interpreter)
Options * GetOptions() override
OptionGroupBoolean m_json
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectProcessGDBRemoteSpeedTest() override=default
OptionGroupOptions m_option_group
OptionGroupUInt64 m_max_send
OptionGroupUInt64 m_num_packets
CommandObjectProcessGDBRemoteSpeedTest(CommandInterpreter &interpreter)
OptionGroupUInt64 m_max_recv
static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch)
A class which holds the metadata from a remote stub/corefile note about how many bits are used for ad...
void SetHighmemAddressableBits(uint32_t highmem_addressing_bits)
void SetAddressableBits(uint32_t addressing_bits)
When a single value is available for the number of bits.
void SetLowmemAddressableBits(uint32_t lowmem_addressing_bits)
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
void Clear()
Clears the object state.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool SetTriple(const llvm::Triple &triple)
Architecture triple setter.
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
A command line argument class.
static lldb::Encoding StringToEncoding(llvm::StringRef s, lldb::Encoding fail_value=lldb::eEncodingInvalid)
static uint32_t StringToGenericRegister(llvm::StringRef s)
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
void ReplaceArgumentAtIndex(size_t idx, llvm::StringRef arg_str, char quote_char='\0')
Replaces the argument value at index idx to arg_str if idx is a valid argument index.
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
Class that manages the actual breakpoint that will be inserted into the running program.
BreakpointSite::Type GetType() const
void SetType(BreakpointSite::Type type)
bool IsEnabled() const
Tells whether the current breakpoint site is enabled or not.
void SetEnabled(bool enabled)
Sets whether the current breakpoint site is enabled or not.
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
CommandObjectMultiword(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
friend class CommandInterpreter
CommandObjectParsed(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
CommandObjectRaw(CommandInterpreter &interpreter, llvm::StringRef name, llvm::StringRef help="", llvm::StringRef syntax="", uint32_t flags=0)
void AddSimpleArgumentList(lldb::CommandArgumentType arg_type, ArgumentRepetitionType repetition_type=eArgRepeatPlain)
CommandInterpreter & m_interpreter
void SetStatus(lldb::ReturnStatus status)
void SetImmediateOutputStream(const lldb::StreamSP &stream_sp)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
lldb::StreamSP GetImmediateOutputStream() const
Stream & GetOutputStream()
A uniqued constant string class.
void SetCString(const char *cstr)
Set the C string value.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
void SetString(llvm::StringRef s)
A subclass of DataBuffer that stores a data buffer on the heap.
static void ReportWarning(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report warning events.
static void ReportError(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report error events.
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
static lldb::ModuleSP LoadBinaryWithUUIDAndAddress(Process *process, llvm::StringRef name, UUID uuid, lldb::addr_t value, bool value_is_offset, bool force_symbol_search, bool notify, bool set_address_in_target, bool allow_memory_image_last_resort)
Find/load a binary into lldb given a UUID and the address where it is loaded in memory,...
virtual lldb::ModuleSP LoadModuleAtAddress(const lldb_private::FileSpec &file, lldb::addr_t link_map_addr, lldb::addr_t base_addr, bool base_addr_is_offset)
Locates or creates a module given by file and updates/loads the resulting module at the virtual base ...
static DynamicLoader * FindPlugin(Process *process, llvm::StringRef plugin_name)
Find a dynamic loader plugin for a given process.
const void * GetBytes() const
static const EventDataBytes * GetEventDataFromEvent(const Event *event_ptr)
size_t GetByteSize() const
std::vector< Enumerator > Enumerators
const Enumerators & GetEnumerators() const
void DumpToLog(Log *log) const
const FileSpec & GetFileSpec() const
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
void AppendPathComponent(llvm::StringRef component)
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
void Clear()
Clears the object state.
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()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
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
lldb::SymbolSharedCacheUse GetSharedCacheBinaryLoading() 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.
static ModuleListProperties & GetGlobalModuleListProperties()
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.
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::StateType GetPrivateState() const
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.
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)
lldb::StateType GetPublicState() const
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
ObjectSP GetValueForKey(llvm::StringRef key) const
bool HasKey(llvm::StringRef key) 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.
bool SetFromStringRef(llvm::StringRef str)
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_shared_cache_info_sp
StructuredData::ObjectSP m_jthreadsinfo_sp
lldb::StateType SetThreadStopInfo(StringExtractor &stop_packet)
static void MonitorDebugserverProcess(std::weak_ptr< ProcessGDBRemote > process_wp, lldb::pid_t pid, int signo, int exit_status)
StructuredData::ObjectSP GetSharedCacheInfo() override
Status DisableBreakpointSite(BreakpointSite *bp_site) override
Status EnableWatchpoint(lldb::WatchpointSP wp_sp, bool notify=true) override
Status DoSignal(int signal) override
Sends a process a UNIX signal signal.
Status DoDeallocateMemory(lldb::addr_t ptr) override
Actually deallocate memory in the process.
Broadcaster m_async_broadcaster
bool ParsePythonTargetDefinition(const FileSpec &target_definition_fspec)
bool StopNoticingNewThreads() override
Call this to turn off the stop & notice new threads mode.
static bool NewThreadNotifyBreakpointHit(void *baton, StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id)
void DumpPluginHistory(Stream &s) override
The underlying plugin might store the low-level communication history for this session.
FlashRangeVector m_erased_flash_ranges
Status DoDetach(bool keep_stopped) override
Detaches from a running or stopped process.
lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions, Status &error) override
Actually allocate memory in the process.
tid_sig_collection m_continue_C_tids
bool HasErased(FlashRange range)
std::optional< bool > DoGetWatchpointReportedAfter() override
Provide an override value in the subclass for lldb's CPU-based logic for whether watchpoint exception...
Status WillLaunchOrAttach()
std::optional< uint32_t > GetWatchpointSlotCount() override
Get the number of watchpoints supported by this target.
GDBRemoteCommunicationClient m_gdb_comm
llvm::Expected< std::vector< uint8_t > > DoReadMemoryTags(lldb::addr_t addr, size_t len, int32_t type) override
Does the final operation to read memory tags.
llvm::DenseMap< ModuleCacheKey, ModuleSpec, ModuleCacheInfo > m_cached_module_specs
Status DoWillAttachToProcessWithID(lldb::pid_t pid) override
Called before attaching to a process.
friend class GDBRemoteCommunicationClient
Status DoResume(lldb::RunDirection direction) override
Resumes all of a process's threads as configured using the Thread run control functions.
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo ®ion_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
void DidForkSwitchSoftwareBreakpoints(bool enable)
void DidLaunchOrAttach(ArchSpec &process_arch)
size_t UpdateThreadIDsFromStopReplyThreadsValue(llvm::StringRef value)
FlashRangeVector::Entry FlashRange
Status GetFileLoadAddress(const FileSpec &file, bool &is_loaded, lldb::addr_t &load_addr) override
Try to find the load address of a file.
MMapMap m_addr_to_mmap_size
bool GetThreadStopInfoFromJSON(ThreadGDBRemote *thread, const StructuredData::ObjectSP &thread_infos_sp)
void DidLaunch() override
Called after launching a process.
void SetUserSpecifiedMaxMemoryTransferSize(uint64_t user_specified_max)
void AddRemoteRegisters(std::vector< DynamicRegisterInfo::Register > ®isters, const ArchSpec &arch_to_use)
Status UpdateAutomaticSignalFiltering() override
void HandleAsyncStdout(llvm::StringRef out) override
static llvm::StringRef GetPluginDescriptionStatic()
tid_sig_collection m_continue_S_tids
bool m_allow_flash_writes
lldb::BreakpointSP m_thread_create_bp_sp
std::map< uint32_t, std::string > ExpeditedRegisterMap
llvm::Error TraceStop(const TraceStopRequest &request) override
Stop tracing a live process or its threads.
StructuredData::ObjectSP GetExtendedInfoForThread(lldb::tid_t tid)
lldb::ThreadSP HandleThreadAsyncInterrupt(uint8_t signo, const std::string &description) override
Handle thread specific async interrupt and return the original thread that requested the async interr...
llvm::Expected< LoadedModuleInfoList > GetLoadedModuleList() override
Query remote GDBServer for a detailed loaded library list.
bool m_waiting_for_attach
llvm::Error GetGDBServerRegisterInfo(ArchSpec &arch)
Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a process ID.
void HandleStopReply() override
llvm::StringMap< std::unique_ptr< FieldEnum > > m_registers_enum_types
Status EstablishConnectionIfNeeded(const ProcessInfo &process_info)
llvm::SmallVector< llvm::MutableArrayRef< uint8_t > > ReadMemoryRanges(llvm::ArrayRef< Range< lldb::addr_t, size_t > > ranges, llvm::MutableArrayRef< uint8_t > buf) override
Override of ReadMemoryRanges that uses MultiMemRead to optimize this operation.
bool UpdateThreadIDList()
static llvm::StringRef GetPluginNameStatic()
void DidFork(lldb::pid_t child_pid, lldb::tid_t child_tid) override
Called after a reported fork.
StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos() override
Status DoHalt(bool &caused_stop) override
Halts a running process.
uint64_t m_last_signals_version
llvm::Expected< TraceSupportedResponse > TraceSupported() override
Get the processor tracing type supported for this process.
llvm::Error TraceStart(const llvm::json::Value &request) override
Start tracing a process or its threads.
void ParseExpeditedRegisters(ExpeditedRegisterMap &expedited_register_map, lldb::ThreadSP thread_sp)
void WillPublicStop() override
Called when the process is about to broadcast a public stop.
Status SendEventData(const char *data) override
bool StartNoticingNewThreads() override
Call this to set the lldb in the mode where it breaks on new thread creations, and then auto-restarts...
DynamicLoader * GetDynamicLoader() override
Get the dynamic loader plug-in for this process.
void RemoveNewThreadBreakpoints()
Remove the breakpoints associated with thread creation from the Target.
ArchSpec GetSystemArchitecture() override
Get the system architecture for this process.
Status ConfigureStructuredData(llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp) override
Configure asynchronous structured data feature.
void DidVFork(lldb::pid_t child_pid, lldb::tid_t child_tid) override
Called after a reported vfork.
bool SupportsReverseDirection() override
Reports whether this process supports reverse execution.
void DidExec() override
Called after a process re-execs itself.
size_t PutSTDIN(const char *buf, size_t buf_size, Status &error) override
Puts data into this process's STDIN.
static void DebuggerInitialize(Debugger &debugger)
tid_collection m_thread_ids
Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a partial process name.
GDBRemoteDynamicRegisterInfoSP m_register_info_sp
std::string m_partial_profile_data
StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos_sender(StructuredData::ObjectSP args)
void MaybeLoadExecutableModule()
std::vector< lldb::addr_t > m_thread_pcs
bool CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override
Check if a plug-in instance can debug the file in module.
void SetThreadPc(const lldb::ThreadSP &thread_sp, uint64_t index)
std::recursive_mutex m_async_thread_state_mutex
Status ConnectToDebugserver(llvm::StringRef host_port)
void SetUnixSignals(const lldb::UnixSignalsSP &signals_sp)
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
uint64_t m_remote_stub_max_memory_size
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, Status &error) override
Actually do the reading of memory from a process.
std::optional< StringExtractorGDBRemote > m_last_stop_packet
CommandObject * GetPluginCommandObject() override
Return a multi-word command object that can be used to expose plug-in specific commands.
int64_t m_breakpoint_pc_offset
size_t DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size, Status &error) override
Actually do the writing of memory to a process.
Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override
Launch a new process.
lldb::CommandObjectSP m_command_sp
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::Error ParseMultiMemReadPacket(llvm::StringRef response_str, llvm::MutableArrayRef< uint8_t > buffer, unsigned expected_num_ranges, llvm::SmallVectorImpl< llvm::MutableArrayRef< uint8_t > > &memory_regions)
llvm::Expected< std::vector< uint8_t > > TraceGetBinaryData(const TraceGetBinaryDataRequest &request) override
Get binary data given a trace technology and a data identifier.
Status EnableBreakpointSite(BreakpointSite *bp_site) override
void ModulesDidLoad(ModuleList &module_list) override
ProcessGDBRemote(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp)
uint32_t m_vfork_in_progress_count
@ eBroadcastBitAsyncContinue
@ eBroadcastBitAsyncThreadShouldExit
@ eBroadcastBitAsyncThreadDidExit
Status WillResume() override
Called before resuming to a process.
std::mutex m_shared_cache_info_mutex
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.
@ eSymbolSharedCacheUseInferiorSharedCacheOnly
@ eSymbolSharedCacheUseHostAndInferiorSharedCache
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