38#include "lldb/Host/Config.h"
41#include "llvm/ADT/STLExtras.h"
42#include "llvm/ADT/StringSwitch.h"
43#include "llvm/Config/llvm-config.h"
44#include "llvm/Support/ErrorExtras.h"
45#include "llvm/Support/JSON.h"
46#include "llvm/TargetParser/Triple.h"
48#if HAVE_LIBCOMPRESSION
49#include <compression.h>
55using namespace std::chrono;
59 return os << llvm::formatv(
60 "QOffsets({0}, [{1:@[x]}])", offsets.
segments,
95 std::chrono::steady_clock::time_point start_of_handshake =
96 std::chrono::steady_clock::now();
105 std::chrono::steady_clock::time_point end_of_handshake =
106 std::chrono::steady_clock::now();
107 auto handshake_timeout =
108 std::chrono::duration<double>(end_of_handshake - start_of_handshake)
114 "while waiting for reply to initial "
118 "failed to get reply to handshake packet within timeout of "
242llvm::Expected<std::vector<AcceleratorActions>>
250 return std::vector<AcceleratorActions>();
256 return llvm::createStringError(
257 "failed to send jAcceleratorPluginInitialize packet");
260 return std::vector<AcceleratorActions>();
265 llvm::Expected<std::vector<AcceleratorActions>> actions =
266 llvm::json::parse<std::vector<AcceleratorActions>>(response.
Peek(),
267 "AcceleratorActions");
274 return llvm::createStringErrorV(
275 "malformed jAcceleratorPluginInitialize response '{0}': {1}",
276 response.
GetStringRef(), llvm::toString(actions.takeError()));
279llvm::Expected<AcceleratorBreakpointHitResponse>
283 packet.
PutCString(
"jAcceleratorPluginBreakpointHit:");
289 return llvm::createStringError(
290 "failed to send jAcceleratorPluginBreakpointHit packet");
295 llvm::Expected<AcceleratorBreakpointHitResponse> hit_response =
296 llvm::json::parse<AcceleratorBreakpointHitResponse>(
297 response.
Peek(),
"AcceleratorBreakpointHitResponse");
304 return llvm::createStringErrorV(
305 "malformed jAcceleratorPluginBreakpointHit response '{0}': {1}",
306 response.
GetStringRef(), llvm::toString(hit_response.takeError()));
478 std::vector<std::string> features = {
"xmlRegisters=i386,arm,mips,arc",
484 "qXfer:libraries:read+",
485 "qXfer:libraries-svr4:read+"};
488 for (uint32_t i = 0; i < features.size(); ++i) {
500 for (llvm::StringRef x : llvm::split(response.
GetStringRef(),
';')) {
501 if (x ==
"qXfer:auxv:read+")
503 else if (x ==
"qXfer:libraries-svr4:read+")
505 else if (x ==
"augmented-libraries-svr4-read") {
508 }
else if (x ==
"qXfer:libraries:read+")
510 else if (x ==
"qXfer:features:read+")
512 else if (x ==
"qXfer:memory-map:read+")
514 else if (x ==
"qXfer:siginfo:read+")
516 else if (x ==
"qEcho+")
518 else if (x ==
"QPassSignals+")
520 else if (x ==
"multiprocess+")
522 else if (x ==
"memory-tagging+")
524 else if (x ==
"qSaveCore+")
526 else if (x ==
"address-spaces+")
528 else if (x ==
"native-signals+")
530 else if (x ==
"binary-upload+")
532 else if (x ==
"ReverseContinue+")
534 else if (x ==
"ReverseStep+")
536 else if (x ==
"MultiMemRead+")
538 else if (x ==
"jMultiBreakpoint+")
540 else if (x ==
"accelerator-plugins+")
542 else if (x ==
"qWasmInstance+")
547 else if (x.consume_front(
"SupportedCompressions=")) {
548 llvm::SmallVector<llvm::StringRef, 4> compressions;
549 x.split(compressions,
',');
550 if (!compressions.empty())
552 }
else if (x.consume_front(
"SupportedWatchpointTypes=")) {
553 llvm::SmallVector<llvm::StringRef, 4> watchpoint_types;
554 x.split(watchpoint_types,
',');
556 for (
auto wp_type : watchpoint_types) {
557 if (wp_type ==
"x86_64")
559 if (wp_type ==
"aarch64-mask")
561 if (wp_type ==
"aarch64-bas")
564 }
else if (x.consume_front(
"PacketSize=")) {
571 LLDB_LOGF(log,
"Garbled PacketSize spec in qSupported response");
592 assert(!flavor.empty());
603 for (llvm::StringRef token : llvm::split(response.
GetStringRef(),
';')) {
630 return llvm::StringSwitch<bool>(flavor)
648 "GDBRemoteCommunicationClient::%s: Didn't get sequence mutex "
650 __FUNCTION__, payload.GetData());
655 payload.Printf(
";thread:%4.4" PRIx64
";", tid);
702 }
else if (!response.
Empty()) {
791 packet.
Printf(
"qMemTags:%" PRIx64
",%zx:%" PRIx32, addr, len, type);
799 LLDB_LOGF(log,
"GDBRemoteCommunicationClient::%s: qMemTags packet failed",
807 if (response.
GetChar() !=
'm') {
809 "GDBRemoteCommunicationClient::%s: qMemTags response did not "
820 if (response.
GetBytesLeft() || (expected_bytes != got_bytes)) {
823 "GDBRemoteCommunicationClient::%s: Invalid data in qMemTags response",
833 const std::vector<uint8_t> &tags) {
836 packet.
Printf(
"QMemTags:%" PRIx64
",%zx:%" PRIx32
":", addr, len, type);
882 if (response.
GetChar() ==
'Q') {
883 if (response.
GetChar() ==
'C') {
897 bool sequence_mutex_unavailable;
899 if (!ids.empty() && !sequence_mutex_unavailable) {
916 return llvm::createStringError(llvm::inconvertibleErrorCode(),
917 "Nothing to launch");
930 return llvm::createStringError(llvm::inconvertibleErrorCode(),
931 "Sending vRun packet failed");
940 return llvm::Error::success();
948 llvm::ListSeparator LS(
",");
949 for (
const auto &arg : llvm::enumerate(args)) {
951 packet.
Format(
"{0},{1},", arg.value().ref().size() * 2, arg.index());
958 return llvm::createStringError(llvm::inconvertibleErrorCode(),
959 "Sending A packet failed");
966 return llvm::createStringError(llvm::inconvertibleErrorCode(),
967 "Sending qLaunchSuccess packet failed");
970 return llvm::Error::success();
971 if (response.
GetChar() ==
'E') {
972 return llvm::createStringError(llvm::inconvertibleErrorCode(),
975 return llvm::createStringError(llvm::inconvertibleErrorCode(),
976 "unknown error occurred launching process");
980 llvm::SmallVector<std::pair<llvm::StringRef, llvm::StringRef>, 0> vec;
981 for (
const auto &kv : env)
982 vec.emplace_back(kv.first(), kv.second);
983 llvm::sort(vec, llvm::less_first());
984 for (
const auto &[k, v] : vec) {
993 char const *name_equal_value) {
994 if (name_equal_value && name_equal_value[0]) {
995 bool send_hex_encoding =
false;
996 for (
const char *p = name_equal_value; *p !=
'\0' && !send_hex_encoding;
998 if (llvm::isPrint(*p)) {
1004 send_hex_encoding =
true;
1011 send_hex_encoding =
true;
1019 packet.
Printf(
"QEnvironment:%s", name_equal_value);
1038 packet.
PutCString(
"QEnvironmentHexEncoded:");
1060 if (arch && arch[0]) {
1062 packet.
Printf(
"QLaunchArch:%s", arch);
1077 char const *data,
bool *was_supported) {
1078 if (data && *data !=
'\0') {
1080 packet.
Printf(
"QSetProcessEvent:%s", data);
1086 *was_supported =
true;
1090 *was_supported =
false;
1095 *was_supported =
true;
1119 return std::nullopt;
1122std::optional<std::string>
1128 return std::nullopt;
1156 UUID &uuid,
addr_t &value,
bool &value_is_offset) {
1194 llvm::Expected<std::vector<AddressSpaceInfo>> info =
1195 llvm::json::parse<std::vector<AddressSpaceInfo>>(response.
Peek(),
1196 "AddressSpaceInfo");
1198 return std::move(*info);
1202 "malformed jAddressSpacesInfo response '{1}': {0}",
1217 llvm::StringRef name, value;
1218 bool success =
false;
1220 if (name ==
"name") {
1223 }
else if (name ==
"version") {
1224 llvm::StringRef major, minor;
1225 std::tie(major, minor) = value.split(
'.');
1239 llvm::ArrayRef<llvm::StringRef> supported_compressions) {
1241 llvm::StringRef avail_name;
1243#if HAVE_LIBCOMPRESSION
1245 for (
auto compression : supported_compressions) {
1246 if (compression ==
"lzfse") {
1248 avail_name = compression;
1254 for (
auto compression : supported_compressions) {
1255 if (compression ==
"zlib-deflate") {
1257 avail_name = compression;
1266 for (
auto compression : supported_compressions) {
1267 if (compression ==
"zlib-deflate") {
1269 avail_name = compression;
1276#if HAVE_LIBCOMPRESSION
1278 for (
auto compression : supported_compressions) {
1279 if (compression ==
"lz4") {
1281 avail_name = compression;
1287 for (
auto compression : supported_compressions) {
1288 if (compression ==
"lzma") {
1290 avail_name = compression;
1299 std::string packet =
"QEnableCompression:type:" + avail_name.str() +
";";
1346 tid = pid_tid->second;
1353 std::string &environment) {
1354 if (value ==
"iossimulator" || value ==
"tvossimulator" ||
1355 value ==
"watchossimulator" || value ==
"xrossimulator" ||
1356 value ==
"visionossimulator") {
1357 environment =
"simulator";
1358 os_name = value.drop_back(environment.size()).str();
1359 }
else if (value ==
"maccatalyst") {
1361 environment =
"macabi";
1363 os_name = value.str();
1379 llvm::StringRef name;
1380 llvm::StringRef value;
1383 std::string arch_name;
1384 std::string os_name;
1385 std::string environment;
1386 std::string vendor_name;
1388 uint32_t pointer_byte_size = 0;
1390 uint32_t num_keys_decoded = 0;
1392 if (name ==
"cputype") {
1394 if (!value.getAsInteger(
BASE_10, cpu))
1396 }
else if (name ==
"cpusubtype") {
1398 if (!value.getAsInteger(
BASE_10, sub))
1400 }
else if (name ==
"arch") {
1401 arch_name = std::string(value);
1403 }
else if (name ==
"triple") {
1407 }
else if (name ==
"distribution_id") {
1411 }
else if (name ==
"os_build") {
1415 }
else if (name ==
"hostname") {
1419 }
else if (name ==
"os_kernel") {
1423 }
else if (name ==
"ostype") {
1426 }
else if (name ==
"vendor") {
1427 vendor_name = std::string(value);
1429 }
else if (name ==
"endian") {
1430 byte_order = llvm::StringSwitch<lldb::ByteOrder>(value)
1437 }
else if (name ==
"ptrsize") {
1438 if (!value.getAsInteger(
BASE_10, pointer_byte_size))
1440 }
else if (name ==
"addressing_bits") {
1444 }
else if (name ==
"high_mem_addressing_bits") {
1447 }
else if (name ==
"low_mem_addressing_bits") {
1450 }
else if (name ==
"os_version" ||
1457 }
else if (name ==
"maccatalyst_version") {
1460 }
else if (name ==
"watchpoint_exceptions_received") {
1462 llvm::StringSwitch<LazyBool>(value)
1468 }
else if (name ==
"default_packet_timeout") {
1469 uint32_t timeout_seconds;
1470 if (!value.getAsInteger(
BASE_10, timeout_seconds)) {
1475 }
else if (name ==
"vm-page-size") {
1477 if (!value.getAsInteger(
BASE_10, page_size)) {
1484 if (num_keys_decoded > 0)
1487 if (triple.empty()) {
1488 if (arch_name.empty()) {
1491 if (pointer_byte_size) {
1492 assert(pointer_byte_size ==
m_host_arch.GetAddressByteSize());
1498 if (!vendor_name.empty())
1500 llvm::StringRef(vendor_name));
1501 if (!os_name.empty())
1502 m_host_arch.GetTriple().setOSName(llvm::StringRef(os_name));
1503 if (!environment.empty())
1504 m_host_arch.GetTriple().setEnvironmentName(environment);
1508 triple += arch_name;
1509 if (!vendor_name.empty() || !os_name.empty()) {
1511 if (vendor_name.empty())
1512 triple +=
"unknown";
1514 triple += vendor_name;
1516 if (os_name.empty())
1517 triple +=
"unknown";
1523 llvm::Triple &host_triple =
m_host_arch.GetTriple();
1524 if (host_triple.getVendor() == llvm::Triple::Apple &&
1525 host_triple.getOS() == llvm::Triple::Darwin) {
1527 case llvm::Triple::aarch64:
1528 case llvm::Triple::aarch64_32:
1529 case llvm::Triple::arm:
1530 case llvm::Triple::thumb:
1531 host_triple.setOS(llvm::Triple::IOS);
1534 host_triple.setOS(llvm::Triple::MacOSX);
1538 if (pointer_byte_size) {
1539 assert(pointer_byte_size ==
m_host_arch.GetAddressByteSize());
1547 if (pointer_byte_size) {
1548 assert(pointer_byte_size ==
m_host_arch.GetAddressByteSize());
1555 "GDBRemoteCommunicationClient::%s parsed host "
1556 "architecture as %s, triple as %s from triple text %s",
1560 :
"<null-arch-name>",
1571 const char *data,
size_t data_len, std::chrono::seconds interrupt_timeout) {
1577 interrupt_timeout) ==
1601 return addressable_bits;
1611 uint32_t permissions) {
1615 const int packet_len = ::snprintf(
1616 packet,
sizeof(packet),
"_M%" PRIx64
",%s%s%s", (uint64_t)size,
1617 permissions & lldb::ePermissionsReadable ?
"r" :
"",
1618 permissions & lldb::ePermissionsWritable ?
"w" :
"",
1619 permissions & lldb::ePermissionsExecutable ?
"x" :
"");
1620 assert(packet_len < (
int)
sizeof(packet));
1640 const int packet_len =
1641 ::snprintf(packet,
sizeof(packet),
"_m%" PRIx64, (uint64_t)addr);
1642 assert(packet_len < (
int)
sizeof(packet));
1667 const int packet_len =
1668 ::snprintf(packet,
sizeof(packet),
"qSupportsDetachAndStayStopped:");
1669 assert(packet_len < (
int)
sizeof(packet));
1683 "Stays stopped not supported by this target.");
1699 "Multiprocess extension not supported by the server.");
1714 region_info.
Clear();
1719 const int packet_len = ::snprintf(
1720 packet,
sizeof(packet),
"qMemoryRegionInfo:%" PRIx64, (uint64_t)addr);
1721 assert(packet_len < (
int)
sizeof(packet));
1727 llvm::StringRef name;
1728 llvm::StringRef value;
1730 bool success =
true;
1731 bool saw_permissions =
false;
1733 if (name ==
"start") {
1734 if (!value.getAsInteger(
BASE_16, addr_value))
1736 }
else if (name ==
"size") {
1737 if (!value.getAsInteger(
BASE_16, addr_value)) {
1745 }
else if (name ==
"permissions" && region_info.
GetRange().
IsValid()) {
1746 saw_permissions =
true;
1748 if (value.contains(
'r'))
1753 if (value.contains(
'w'))
1758 if (value.contains(
'x'))
1772 }
else if (name ==
"name") {
1776 region_info.
SetName(name.c_str());
1777 }
else if (name ==
"flags") {
1781 llvm::StringRef flags = value;
1782 llvm::StringRef flag;
1783 while (flags.size()) {
1784 flags = flags.ltrim();
1785 std::tie(flag, flags) = flags.split(
' ');
1790 else if (flag ==
"ss")
1794 }
else if (name ==
"type") {
1795 for (llvm::StringRef entry : llvm::split(value,
',')) {
1796 if (entry ==
"stack")
1798 else if (entry ==
"heap")
1801 }
else if (name ==
"error") {
1803 std::string error_string;
1807 }
else if (name ==
"dirty-pages") {
1808 std::vector<addr_t> dirty_page_list;
1809 for (llvm::StringRef x : llvm::split(value,
',')) {
1811 x.consume_front(
"0x");
1812 if (llvm::to_integer(x, page, 16))
1813 dirty_page_list.push_back(page);
1816 }
else if (name ==
"protection-key") {
1817 unsigned protection_key = 0;
1818 if (!value.getAsInteger(
BASE_10, protection_key))
1829 if (!saw_permissions) {
1857 region_info = qXfer_region_info;
1860 region_info.
Clear();
1862 }
else if (qXfer_error.
Success()) {
1877 if (!
error.Success())
1880 if (map_region.GetRange().Contains(addr)) {
1881 region = map_region;
1907 llvm::Expected<std::string> xml =
ReadExtFeature(
"memory-map",
"");
1913 if (!xml_document.
ParseMemory(xml->c_str(), xml->size())) {
1929 if (memory_node.
GetName() !=
"memory")
1941 if (type ==
"rom") {
1944 }
else if (type ==
"ram") {
1948 }
else if (type ==
"flash") {
1951 [®ion](
const XMLNode &prop_node) ->
bool {
1954 if (prop_node.
GetName() !=
"property")
1957 if (propname ==
"blocksize") {
1979 std::optional<uint32_t> num;
1985 llvm::StringRef name;
1986 llvm::StringRef value;
1988 if (name ==
"num") {
2004WatchpointHardwareFeature
2023 return std::nullopt;
2028 std::string path{file_spec.
GetPath(
false)};
2048 std::string path{file_spec.
GetPath(
false)};
2068 std::string path{file_spec.
GetPath(
false)};
2089 if ((cols == 0) != (rows == 0))
2092 packet.
Printf(
"QSetSTDIOWindowSize:cols=%u;rows=%u",
2093 static_cast<unsigned>(cols),
static_cast<unsigned>(rows));
2117 return !cwd.empty();
2124 std::string path{working_dir.
GetPath(
false)};
2144 const int packet_len =
2145 ::snprintf(packet,
sizeof(packet),
"QSetDisableASLR:%i", enable ? 1 : 0);
2146 assert(packet_len < (
int)
sizeof(packet));
2161 const int packet_len = ::snprintf(packet,
sizeof(packet),
2162 "QSetDetachOnError:%i", enable ? 1 : 0);
2163 assert(packet_len < (
int)
sizeof(packet));
2179 llvm::StringRef name;
2180 llvm::StringRef value;
2186 std::string os_type;
2189 if (name ==
"pid") {
2191 value.getAsInteger(
BASE_10, pid);
2193 }
else if (name ==
"ppid") {
2195 value.getAsInteger(
BASE_10, pid);
2197 }
else if (name ==
"uid") {
2199 value.getAsInteger(
BASE_10, uid);
2201 }
else if (name ==
"euid") {
2203 value.getAsInteger(
BASE_10, uid);
2205 }
else if (name ==
"gid") {
2207 value.getAsInteger(
BASE_10, gid);
2209 }
else if (name ==
"egid") {
2211 value.getAsInteger(
BASE_10, gid);
2213 }
else if (name ==
"triple") {
2218 }
else if (name ==
"name") {
2225 }
else if (name ==
"args") {
2226 llvm::StringRef encoded_args(value), hex_arg;
2228 bool is_arg0 =
true;
2229 while (!encoded_args.empty()) {
2230 std::tie(hex_arg, encoded_args) = encoded_args.split(
'-');
2245 }
else if (name ==
"cputype") {
2246 value.getAsInteger(
BASE_10, cpu);
2247 }
else if (name ==
"cpusubtype") {
2248 value.getAsInteger(
BASE_10, sub);
2249 }
else if (name ==
"vendor") {
2250 vendor = std::string(value);
2251 }
else if (name ==
"ostype") {
2252 os_type = std::string(value);
2257 if (vendor ==
"apple") {
2261 llvm::StringRef(vendor));
2263 llvm::StringRef(os_type));
2275 process_info.
Clear();
2279 const int packet_len =
2280 ::snprintf(packet,
sizeof(packet),
"qProcessInfoPID:%" PRIu64, pid);
2281 assert(packet_len < (
int)
sizeof(packet));
2311 llvm::StringRef name;
2312 llvm::StringRef value;
2315 std::string os_name;
2316 std::string environment;
2317 std::string vendor_name;
2319 std::string elf_abi;
2320 uint32_t pointer_byte_size = 0;
2323 uint32_t num_keys_decoded = 0;
2326 if (name ==
"cputype") {
2327 if (!value.getAsInteger(
BASE_16, cpu))
2329 }
else if (name ==
"cpusubtype") {
2330 if (!value.getAsInteger(
BASE_16, sub)) {
2336 if (cpu == llvm::MachO::CPU_TYPE_ARM64 &&
2337 sub == llvm::MachO::CPU_SUBTYPE_ARM64E) {
2344 }
else if (name ==
"triple") {
2348 }
else if (name ==
"ostype") {
2351 }
else if (name ==
"vendor") {
2352 vendor_name = std::string(value);
2354 }
else if (name ==
"endian") {
2355 byte_order = llvm::StringSwitch<lldb::ByteOrder>(value)
2362 }
else if (name ==
"ptrsize") {
2363 if (!value.getAsInteger(
BASE_16, pointer_byte_size))
2365 }
else if (name ==
"pid") {
2366 if (!value.getAsInteger(
BASE_16, pid))
2368 }
else if (name ==
"elf_abi") {
2369 elf_abi = std::string(value);
2371 }
else if (name ==
"main-binary-uuid") {
2374 }
else if (name ==
"main-binary-slide") {
2382 }
else if (name ==
"main-binary-address") {
2390 }
else if (name ==
"binary-addresses") {
2393 for (llvm::StringRef x : llvm::split(value,
',')) {
2395 x.consume_front(
"0x");
2396 if (llvm::to_integer(x, vmaddr, 16))
2401 if (num_keys_decoded > 0)
2409 if (!triple.empty()) {
2412 if (pointer_byte_size) {
2413 assert(pointer_byte_size ==
m_process_arch.GetAddressByteSize());
2416 !vendor_name.empty()) {
2417 llvm::Triple triple(llvm::Twine(
"-") + vendor_name +
"-" + os_name);
2418 if (!environment.empty())
2419 triple.setEnvironmentName(environment);
2421 assert(triple.getObjectFormat() != llvm::Triple::UnknownObjectFormat);
2422 assert(triple.getObjectFormat() != llvm::Triple::Wasm);
2423 assert(triple.getObjectFormat() != llvm::Triple::XCOFF);
2424 switch (triple.getObjectFormat()) {
2425 case llvm::Triple::MachO:
2428 case llvm::Triple::ELF:
2431 case llvm::Triple::COFF:
2434 case llvm::Triple::GOFF:
2435 case llvm::Triple::SPIRV:
2436 case llvm::Triple::Wasm:
2437 case llvm::Triple::XCOFF:
2438 case llvm::Triple::DXContainer:
2439 LLDB_LOGF(log,
"error: not supported target architecture");
2441 case llvm::Triple::UnknownObjectFormat:
2442 LLDB_LOGF(log,
"error: failed to determine target architecture");
2446 if (pointer_byte_size) {
2447 assert(pointer_byte_size ==
m_process_arch.GetAddressByteSize());
2452 m_process_arch.GetTriple().setVendorName(llvm::StringRef(vendor_name));
2454 m_process_arch.GetTriple().setEnvironmentName(llvm::StringRef(environment));
2468 process_infos.clear();
2476 bool has_name_match =
false;
2477 if (!name.empty()) {
2478 has_name_match =
true;
2480 switch (name_match_type) {
2482 has_name_match =
false;
2494 packet.
PutCString(
"name_match:starts_with;");
2505 if (has_name_match) {
2513 packet.
Printf(
"pid:%" PRIu64
";",
2516 packet.
Printf(
"parent_pid:%" PRIu64
";",
2523 packet.
Printf(
"euid:%u;",
2526 packet.
Printf(
"egid:%u;",
2532 const llvm::Triple &triple = match_arch.
GetTriple();
2548 process_infos.push_back(process_info);
2557 return process_infos.size();
2561 std::string &name) {
2564 const int packet_len =
2565 ::snprintf(packet,
sizeof(packet),
"qUserName:%i", uid);
2566 assert(packet_len < (
int)
sizeof(packet));
2588 std::string &name) {
2591 const int packet_len =
2592 ::snprintf(packet,
sizeof(packet),
"qGroupName:%i", gid);
2593 assert(packet_len < (
int)
sizeof(packet));
2615 uint32_t recv_size) {
2617 packet.
Printf(
"qSpeedTest:response_size:%x;data:", recv_size);
2618 uint32_t bytes_left = send_size;
2619 while (bytes_left > 0) {
2620 if (bytes_left >= 26) {
2621 packet.
PutCString(
"abcdefghijklmnopqrstuvwxyz");
2624 packet.
Printf(
"%*.*s;", bytes_left, bytes_left,
2625 "abcdefghijklmnopqrstuvwxyz");
2634 return duration<float>::zero();
2635 using Dur = duration<float>;
2636 Dur sum = std::accumulate(std::begin(v), std::end(v), Dur());
2637 Dur mean = sum / v.size();
2640 float delta = (d - mean).count();
2641 accum += delta * delta;
2644 return Dur(sqrtf(accum / (v.size() - 1)));
2650 uint64_t recv_amount,
2651 bool json,
Stream &strm) {
2656 strm.
Printf(
"{ \"packet_speeds\" : {\n \"num_packets\" : %u,\n "
2660 strm.
Printf(
"Testing sending %u packets of various sizes:\n",
2664 uint32_t result_idx = 0;
2666 std::vector<duration<float>> packet_times;
2668 for (send_size = 0; send_size <= max_send;
2669 send_size ? send_size *= 2 : send_size = 4) {
2670 for (uint32_t recv_size = 0; recv_size <= max_recv;
2671 recv_size ? recv_size *= 2 : recv_size = 4) {
2674 packet_times.clear();
2676 const auto start_time = steady_clock::now();
2677 for (uint32_t i = 0; i < num_packets; ++i) {
2678 const auto packet_start_time = steady_clock::now();
2681 const auto packet_end_time = steady_clock::now();
2682 packet_times.push_back(packet_end_time - packet_start_time);
2684 const auto end_time = steady_clock::now();
2685 const auto total_time = end_time - start_time;
2687 float packets_per_second =
2688 ((float)num_packets) / duration<float>(total_time).count();
2689 auto average_per_packet = num_packets > 0 ? total_time / num_packets
2690 : duration<float>::zero();
2691 const duration<float> standard_deviation =
2694 strm.
Format(
"{0}\n {{\"send_size\" : {1,6}, \"recv_size\" : "
2695 "{2,6}, \"total_time_nsec\" : {3,12:ns-}, "
2696 "\"standard_deviation_nsec\" : {4,9:ns-f0}}",
2697 result_idx > 0 ?
"," :
"", send_size, recv_size,
2698 total_time, standard_deviation);
2701 strm.
Format(
"qSpeedTest(send={0,7}, recv={1,7}) in {2:s+f9} for "
2702 "{3,9:f2} packets/s ({4,10:ms+f6} per packet) with "
2703 "standard deviation of {5,10:ms+f6}\n",
2704 send_size, recv_size, duration<float>(total_time),
2705 packets_per_second, duration<float>(average_per_packet),
2706 standard_deviation);
2712 const float k_recv_amount_mb = (float)recv_amount / (1024.0f * 1024.0f);
2714 strm.
Printf(
"\n ]\n },\n \"download_speed\" : {\n \"byte_size\" "
2715 ": %" PRIu64
",\n \"results\" : [",
2718 strm.
Printf(
"Testing receiving %2.1fMB of data using varying receive "
2724 for (uint32_t recv_size = 32; recv_size <= max_recv; recv_size *= 2) {
2729 if (recv_size > 0) {
2730 const auto start_time = steady_clock::now();
2731 uint32_t bytes_read = 0;
2732 uint32_t packet_count = 0;
2733 while (bytes_read < recv_amount) {
2736 bytes_read += recv_size;
2739 const auto end_time = steady_clock::now();
2740 const auto total_time = end_time - start_time;
2741 float mb_second = ((float)recv_amount) /
2742 duration<float>(total_time).count() /
2744 float packets_per_second =
2745 ((float)packet_count) / duration<float>(total_time).count();
2746 const auto average_per_packet = packet_count > 0
2747 ? total_time / packet_count
2748 : duration<float>::zero();
2751 strm.
Format(
"{0}\n {{\"send_size\" : {1,6}, \"recv_size\" : "
2752 "{2,6}, \"total_time_nsec\" : {3,12:ns-}}",
2753 result_idx > 0 ?
"," :
"", send_size, recv_size,
2757 strm.
Format(
"qSpeedTest(send={0,7}, recv={1,7}) {2,6} packets needed "
2758 "to receive {3:f1}MB in {4:s+f9} for {5} MB/sec for "
2759 "{6,9:f2} packets/sec ({7,10:ms+f6} per packet)\n",
2760 send_size, recv_size, packet_count, k_recv_amount_mb,
2761 duration<float>(total_time), mb_second,
2762 packets_per_second, duration<float>(average_per_packet));
2768 strm.
Printf(
"\n ]\n }\n}\n");
2775 uint32_t recv_size) {
2785 const char *remote_accept_hostname,
lldb::pid_t &pid, uint16_t &port,
2786 std::string &socket_name) {
2789 socket_name.clear();
2794 std::string hostname;
2795 if (remote_accept_hostname && remote_accept_hostname[0])
2796 hostname = remote_accept_hostname;
2798 if (HostInfo::GetHostname(hostname)) {
2800 stream.
Printf(
"host:%s;", hostname.c_str());
2804 stream.
Printf(
"host:*;");
2815 llvm::StringRef name;
2816 llvm::StringRef value;
2819 value.getAsInteger(
BASE_10, port);
2820 else if (name ==
"pid")
2821 value.getAsInteger(
BASE_10, pid);
2822 else if (name.compare(
"socket_name") == 0) {
2833 std::vector<std::pair<uint16_t, std::string>> &connection_urls) {
2834 connection_urls.clear();
2850 for (
size_t i = 0, count = array->
GetSize(); i < count; ++i) {
2851 std::optional<StructuredData::Dictionary *> maybe_element =
2860 port = port_osp->GetUnsignedIntegerValue(0);
2862 std::string socket_name;
2865 socket_name = std::string(socket_name_osp->GetStringValue());
2867 if (port != 0 || !socket_name.empty())
2868 connection_urls.emplace_back(port, socket_name);
2870 return connection_urls.size();
2875 stream.
Printf(
"qKillSpawnedProcess:%" PRId64, pid);
2887 uint64_t tid, uint64_t pid,
char op) {
2893 packet.
Printf(
"p%" PRIx64
".", pid);
2898 packet.
Printf(
"%" PRIx64, tid);
2904 return {{pid, tid}};
2916 return std::nullopt;
2931 return ret.has_value();
2946 return ret.has_value();
2961 ::snprintf(packet,
sizeof(packet),
"qThreadStopInfo%" PRIx64, tid);
2962 assert(packet_len < (
int)
sizeof(packet));
2981 std::chrono::seconds timeout) {
2983 LLDB_LOGF(log,
"GDBRemoteCommunicationClient::%s() %s at addr = 0x%" PRIx64,
2984 __FUNCTION__, insert ?
"add" :
"remove", addr);
2991 const int packet_len =
2992 ::snprintf(packet,
sizeof(packet),
"%c%i,%" PRIx64
",%x",
2993 insert ?
'Z' :
'z', type, addr, length);
2995 assert(packet_len + 1 < (
int)
sizeof(packet));
3040std::vector<std::pair<lldb::pid_t, lldb::tid_t>>
3042 bool &sequence_mutex_unavailable) {
3043 std::vector<std::pair<lldb::pid_t, lldb::tid_t>> ids;
3047 sequence_mutex_unavailable =
false;
3051 for (packet_result =
3069 ids.push_back(*pid_tid);
3071 }
while (ch ==
',');
3085 ids.emplace_back(1, 1);
3089 LLDB_LOG(log,
"error: failed to get packet sequence mutex, not sending "
3090 "packet 'qfThreadInfo'");
3091 sequence_mutex_unavailable =
true;
3098 std::vector<lldb::tid_t> &thread_ids,
bool &sequence_mutex_unavailable) {
3103 if (ids.empty() || sequence_mutex_unavailable)
3106 for (
auto id : ids) {
3112 thread_ids.push_back(
id.second);
3115 return thread_ids.size();
3128 llvm::StringRef command,
3136 std::string *separated_error_output,
3146 timeout_sec = std::ceil(std::chrono::duration<double>(*timeout).count());
3150 std::string path{working_dir.
GetPath(
false)};
3157 if (response.
GetChar() !=
'F')
3159 if (response.
GetChar() !=
',')
3164 else if (status_ptr)
3165 *status_ptr = exitcode;
3166 if (response.
GetChar() !=
',')
3171 if (response.
GetChar() !=
',')
3176 command_output->assign(output);
3183 uint32_t file_permissions) {
3184 std::string path{file_spec.
GetPath(
false)};
3190 llvm::StringRef packet = stream.
GetString();
3195 packet.str().c_str());
3197 if (response.
GetChar() !=
'F')
3199 packet.str().c_str());
3206 uint32_t file_permissions) {
3207 std::string path{file_spec.
GetPath(
false)};
3213 llvm::StringRef packet = stream.
GetString();
3220 if (response.
GetChar() !=
'F')
3229#define HANDLE_ERRNO(name, value) \
3232#include "Plugins/Process/gdb-remote/GDBRemoteErrno.def"
3241 if (response.
GetChar() !=
'F')
3243 int32_t result = response.
GetS32(-2, 16);
3246 if (response.
GetChar() ==
',') {
3248 if (result_errno != -1)
3260 std::string path(file_spec.
GetPath(
false));
3281 stream.
Printf(
"vFile:close:%x", (
int)fd);
3290std::optional<GDBRemoteFStatData>
3293 stream.
Printf(
"vFile:fstat:%" PRIx64, fd);
3297 if (response.
GetChar() !=
'F')
3298 return std::nullopt;
3299 int64_t size = response.
GetS64(-1, 16);
3300 if (size > 0 && response.
GetChar() ==
';') {
3304 if (buffer.size() !=
sizeof(out))
3305 return std::nullopt;
3306 memcpy(&out, buffer.data(),
sizeof(out));
3311 return std::nullopt;
3314std::optional<GDBRemoteFStatData>
3319 return std::nullopt;
3320 std::optional<GDBRemoteFStatData> st =
FStat(fd);
3329 std::string path(file_spec.
GetPath(
false));
3339 if (response.
GetChar() !=
'F')
3348 std::optional<GDBRemoteFStatData> st =
Stat(file_spec);
3366 while (response.
Peek()) {
3368 while ((ch = response.
GetHexU8(0,
false)) !=
'\0')
3371 if (response.
GetChar() !=
',')
3379 uint32_t &file_permissions) {
3381 std::string path{file_spec.
GetPath(
false)};
3394 if (response.
GetChar() !=
'F') {
3396 "invalid response to '%s' packet", stream.
GetData());
3398 const uint32_t mode = response.
GetS32(-1, 16);
3399 if (
static_cast<int32_t
>(mode) == -1) {
3400 if (response.
GetChar() ==
',') {
3402 if (response_errno > 0)
3419 if (std::optional<GDBRemoteFStatData> st =
Stat(file_spec)) {
3427 uint64_t offset,
void *dst,
3431 stream.
Printf(
"vFile:pread:%x,%" PRIx64
",%" PRIx64, (
int)fd, dst_len,
3436 if (response.
GetChar() !=
'F')
3438 int64_t retcode = response.
GetS64(-1, 16);
3439 if (retcode == -1) {
3441 if (response.
GetChar() ==
',') {
3443 if (response_errno > 0)
3448 const char next = (response.
Peek() ? *response.
Peek() : 0);
3455 const uint64_t data_to_write =
3456 std::min<uint64_t>(dst_len, buffer.size());
3457 if (data_to_write > 0)
3458 memcpy(dst, &buffer[0], data_to_write);
3459 return data_to_write;
3472 stream.
Printf(
"vFile:pwrite:%x,%" PRIx64
",", (
int)fd, offset);
3477 if (response.
GetChar() !=
'F') {
3481 int64_t bytes_written = response.
GetS64(-1, 16);
3482 if (bytes_written == -1) {
3484 if (response.
GetChar() ==
',') {
3486 if (response_errno > 0)
3491 return bytes_written;
3500 std::string src_path{src.
GetPath(
false)}, dst_path{dst.
GetPath(
false)};
3512 if (response.
GetChar() ==
'F') {
3516 if (response.
GetChar() ==
',') {
3518 if (response_errno > 0)
3533 std::string path{file_spec.
GetPath(
false)};
3543 if (response.
GetChar() ==
'F') {
3547 if (response.
GetChar() ==
',') {
3549 if (response_errno > 0)
3567 std::string path(file_spec.
GetPath(
false));
3576 if (response.
GetChar() !=
'F')
3578 if (response.
GetChar() !=
',')
3580 bool retcode = (response.
GetChar() !=
'0');
3597 std::string path(file_spec.
GetPath(
false));
3604 if (response.
GetChar() !=
'F')
3605 return std::make_error_code(std::errc::illegal_byte_sequence);
3606 if (response.
GetChar() !=
',')
3607 return std::make_error_code(std::errc::illegal_byte_sequence);
3608 if (response.
Peek() && *response.
Peek() ==
'x')
3609 return std::make_error_code(std::errc::no_such_file_or_directory);
3626 const size_t MD5_HALF_LENGTH =
sizeof(uint64_t) * 2;
3631 if (part.size() != MD5_HALF_LENGTH)
3632 return std::make_error_code(std::errc::illegal_byte_sequence);
3636 if (part.getAsInteger(
BASE_16, low))
3637 return std::make_error_code(std::errc::illegal_byte_sequence);
3642 if (part.size() != MD5_HALF_LENGTH)
3643 return std::make_error_code(std::errc::illegal_byte_sequence);
3647 if (part.getAsInteger(
BASE_16, high))
3648 return std::make_error_code(std::errc::illegal_byte_sequence);
3650 llvm::MD5::MD5Result result;
3651 llvm::support::endian::write<uint64_t, llvm::endianness::little>(
3652 result.data(), low);
3653 llvm::support::endian::write<uint64_t, llvm::endianness::little>(
3654 result.data() + 8, high);
3658 return std::make_error_code(std::errc::operation_canceled);
3668 arch.
GetTriple().getVendor() == llvm::Triple::Apple &&
3669 arch.
GetTriple().getOS() == llvm::Triple::IOS &&
3670 (arch.
GetTriple().getArch() == llvm::Triple::aarch64 ||
3671 arch.
GetTriple().getArch() == llvm::Triple::aarch64_32)) {
3674 if (gdb_server_version != 0) {
3676 if (gdb_server_name && strcmp(gdb_server_name,
"debugserver") == 0) {
3677 if (gdb_server_version >= 310)
3690 payload.
Printf(
"p%x", reg);
3699 response.
GetHexBytes(buffer_sp->GetData(),
'\xcc');
3714 response.
GetHexBytes(buffer_sp->GetData(),
'\xcc');
3720 llvm::ArrayRef<uint8_t> data) {
3722 payload.
Printf(
"P%x=", reg_num);
3746 uint32_t &save_id) {
3762 const uint32_t response_save_id = response.
GetU32(0);
3763 if (response_save_id == 0)
3766 save_id = response_save_id;
3779 payload.
Printf(
"QRestoreRegisterState:%u", save_id);
3799 packet.
Printf(
"QSyncThreadState:%4.4" PRIx64
";", tid);
3805llvm::Expected<TraceSupportedResponse>
3810 escaped_packet.
PutCString(
"jLLDBTraceSupported");
3819 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3820 "jLLDBTraceSupported is unsupported");
3822 return llvm::json::parse<TraceSupportedResponse>(response.
Peek(),
3823 "TraceSupportedResponse");
3825 LLDB_LOG(log,
"failed to send packet: jLLDBTraceSupported");
3826 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3827 "failed to send packet: jLLDBTraceSupported");
3832 std::chrono::seconds timeout) {
3836 escaped_packet.
PutCString(
"jLLDBTraceStop:");
3838 std::string json_string;
3839 llvm::raw_string_ostream os(json_string);
3842 escaped_packet.
PutEscapedBytes(json_string.c_str(), json_string.size());
3851 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3852 "jLLDBTraceStop is unsupported");
3854 return llvm::Error::success();
3855 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3856 "Invalid jLLDBTraceStart response");
3858 LLDB_LOG(log,
"failed to send packet: jLLDBTraceStop");
3859 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3860 "failed to send packet: jLLDBTraceStop '%s'",
3866 std::chrono::seconds timeout) {
3870 escaped_packet.
PutCString(
"jLLDBTraceStart:");
3872 std::string json_string;
3873 llvm::raw_string_ostream os(json_string);
3876 escaped_packet.
PutEscapedBytes(json_string.c_str(), json_string.size());
3885 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3886 "jLLDBTraceStart is unsupported");
3888 return llvm::Error::success();
3889 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3890 "Invalid jLLDBTraceStart response");
3892 LLDB_LOG(log,
"failed to send packet: jLLDBTraceStart");
3893 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3894 "failed to send packet: jLLDBTraceStart '%s'",
3898llvm::Expected<std::string>
3900 std::chrono::seconds timeout) {
3904 escaped_packet.
PutCString(
"jLLDBTraceGetState:");
3906 std::string json_string;
3907 llvm::raw_string_ostream os(json_string);
3910 escaped_packet.
PutEscapedBytes(json_string.c_str(), json_string.size());
3919 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3920 "jLLDBTraceGetState is unsupported");
3921 return std::string(response.
Peek());
3924 LLDB_LOG(log,
"failed to send packet: jLLDBTraceGetState");
3925 return llvm::createStringError(
3926 llvm::inconvertibleErrorCode(),
3927 "failed to send packet: jLLDBTraceGetState '%s'",
3931llvm::Expected<std::vector<uint8_t>>
3937 escaped_packet.
PutCString(
"jLLDBTraceGetBinaryData:");
3939 std::string json_string;
3940 llvm::raw_string_ostream os(json_string);
3943 escaped_packet.
PutEscapedBytes(json_string.c_str(), json_string.size());
3953 return std::vector<uint8_t>(data.begin(), data.end());
3955 LLDB_LOG(log,
"failed to send packet: jLLDBTraceGetBinaryData");
3956 return llvm::createStringError(
3957 llvm::inconvertibleErrorCode(),
3958 "failed to send packet: jLLDBTraceGetBinaryData '%s'",
3966 return std::nullopt;
3968 return std::nullopt;
3972 const auto &GetOffset = [&] {
3974 if (ref.consumeInteger(16, offset))
3976 result.
offsets.push_back(offset);
3980 if (ref.consume_front(
"Text=")) {
3983 return std::nullopt;
3984 if (!ref.consume_front(
";Data=") || !GetOffset())
3985 return std::nullopt;
3988 if (ref.consume_front(
";Bss=") && GetOffset() && ref.empty())
3990 }
else if (ref.consume_front(
"TextSeg=")) {
3993 return std::nullopt;
3996 if (ref.consume_front(
";DataSeg=") && GetOffset() && ref.empty())
3999 return std::nullopt;
4008 std::string module_path = module_file_spec.
GetPath(
false);
4009 if (module_path.empty())
4016 const auto &triple = arch_spec.
GetTriple().getTriple();
4032 llvm::StringRef name;
4033 llvm::StringRef value;
4035 module_spec.
Clear();
4039 if (name ==
"uuid" || name ==
"md5") {
4044 }
else if (name ==
"triple") {
4049 }
else if (name ==
"file_offset") {
4051 if (!value.getAsInteger(
BASE_16, ival))
4053 }
else if (name ==
"file_size") {
4055 if (!value.getAsInteger(
BASE_16, ival))
4057 }
else if (name ==
"file_path") {
4068static std::optional<ModuleSpec>
4072 return std::nullopt;
4074 llvm::StringRef string;
4078 return std::nullopt;
4080 return std::nullopt;
4083 return std::nullopt;
4087 return std::nullopt;
4091 return std::nullopt;
4095 return std::nullopt;
4101std::optional<std::vector<ModuleSpec>>
4103 llvm::ArrayRef<FileSpec> module_file_specs,
const llvm::Triple &triple) {
4107 return std::nullopt;
4109 json::Array module_array;
4110 for (
const FileSpec &module_file_spec : module_file_specs) {
4111 module_array.push_back(
4112 json::Object{{
"file", module_file_spec.GetPath(
false)},
4113 {
"triple", triple.getTriple()}});
4116 unescaped_payload.
PutCString(
"jModulesInfo:");
4117 unescaped_payload.
AsRawOstream() << std::move(module_array);
4130 return std::nullopt;
4134 return std::nullopt;
4139 if (!response_object_sp)
4140 return std::nullopt;
4143 if (!response_array)
4144 return std::nullopt;
4146 std::vector<ModuleSpec> result;
4147 for (
size_t i = 0; i < response_array->
GetSize(); ++i) {
4150 result.push_back(*module_spec);
4160llvm::Expected<std::string>
4162 llvm::StringRef annex) {
4165 llvm::raw_string_ostream output_stream(output);
4179 std::string packet =
4180 (
"qXfer:" +
object +
":read:" + annex +
":" +
4181 llvm::Twine::utohexstr(offset) +
"," + llvm::Twine::utohexstr(size))
4189 return llvm::createStringError(llvm::inconvertibleErrorCode(),
4190 "Error sending $qXfer packet");
4208 return llvm::createStringError(
4209 llvm::inconvertibleErrorCode(),
4210 "Invalid continuation code from $qXfer packet");
4260 bool symbol_response_provided =
false;
4263 bool first_qsymbol_query =
true;
4274 if (symbol_response_provided || first_qsymbol_query) {
4281 first_qsymbol_query =
false;
4290 if (response_str.starts_with(
"qSymbol:")) {
4292 std::string symbol_name;
4294 if (symbol_name.empty())
4305 switch (sc.symbol->GetType()) {
4326 if (sc.module_sp->GetArchitecture()
4328 .getObjectFormat() !=
4329 llvm::Triple::ObjectFormatType::MachO) {
4334 sc.symbol->GetLoadAddress(&process->
GetTarget());
4336 symbol_load_addr = sc.symbol->GetRawValue();
4351 sc.symbol->GetLoadAddress(&process->
GetTarget());
4364 packet.
Printf(
"%" PRIx64, symbol_load_addr);
4365 symbol_response_provided =
true;
4367 symbol_response_provided =
false;
4383 "GDBRemoteCommunicationClient::%s: Didn't get sequence mutex.",
4408 "GDBRemoteCommunicationClient::%s(): "
4409 "QSupportedAsyncJSONPackets returned invalid "
4416 "GDBRemoteCommunicationClient::%s(): "
4417 "QSupportedAsyncJSONPackets unsupported",
4425 "GDBRemoteCommunicationClient::%s(): supported async "
4427 __FUNCTION__, stream.
GetData());
4437 llvm::ArrayRef<int32_t> signals) {
4440 auto range = llvm::make_range(signals.begin(), signals.end());
4441 std::string packet = formatv(
"QPassSignals:{0:$[;]@(x-2)}", range).str();
4453 "Unknown error happened during sending QPassSignals packet.");
4461 if (type_name.empty()) {
4474 config_sp->Dump(unescaped_stream);
4475 unescaped_stream.
Flush();
4493 "configuring StructuredData feature {0} failed with error {1}",
4499 "configuring StructuredData feature {0} failed when sending packet: "
4501 type_name, (
int)result);
4530 return llvm::createStringError(llvm::inconvertibleErrorCode(),
4531 "failed to send k packet");
4533 char packet_cmd = response.
GetChar(0);
4534 if (packet_cmd ==
'W' || packet_cmd ==
'X')
4537 return llvm::createStringError(llvm::inconvertibleErrorCode(),
4538 "unexpected response to k packet: %s",
static llvm::raw_ostream & error(Stream &strm)
duration< float > calculate_standard_deviation(const std::vector< duration< float > > &v)
static std::optional< ModuleSpec > ParseModuleSpec(StructuredData::Dictionary *dict)
static int gdb_errno_to_system(int err)
static void ParseOSType(llvm::StringRef value, std::string &os_name, std::string &environment)
static void MakeSpeedTestPacket(StreamString &packet, uint32_t send_size, uint32_t recv_size)
static uint64_t ParseHostIOPacketResponse(StringExtractorGDBRemote &response, uint64_t fail_result, Status &error)
#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,...)
A class which holds the metadata from a remote stub/corefile note about how many bits are used for ad...
void SetAddressableBits(uint32_t addressing_bits)
When a single value is available for the number of bits.
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool SetTriple(const llvm::Triple &triple)
Architecture triple setter.
bool SetArchitecture(ArchitectureType arch_type, uint32_t cpu, uint32_t sub, uint32_t os=0)
Change the architecture object type, CPU type and OS type.
A command line argument class.
void AppendArgument(llvm::StringRef arg_str, char quote_char='\0')
Appends a new argument to the end of the list argument list.
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
void Clear()
Clear the arguments.
bool IsConnected() const
Check if the connection is valid.
virtual lldb::ConnectionStatus Disconnect(Status *error_ptr=nullptr)
Disconnect the communications connection if one is currently connected.
"lldb/Utility/ArgCompletionRequest.h"
void AddCompletion(llvm::StringRef completion, llvm::StringRef description="", CompletionMode mode=CompletionMode::Normal)
Adds a possible completion string.
llvm::StringRef GetCursorArgumentPrefix() const
A uniqued constant string class.
A subclass of DataBuffer that stores a data buffer on the heap.
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
void SetReadable(LazyBool val)
LazyBool GetFlash() const
MemoryRegionInfo & SetMemoryTagged(LazyBool val)
void SetBlocksize(lldb::offset_t blocksize)
void SetFlash(LazyBool val)
void SetPageSize(int pagesize)
void SetName(const char *name)
MemoryRegionInfo & SetIsShadowStack(LazyBool val)
lldb::offset_t GetBlocksize() const
MemoryRegionInfo & SetIsStackMemory(LazyBool val)
void SetDirtyPageList(std::vector< lldb::addr_t > pagelist)
MemoryRegionInfo & SetProtectionKey(std::optional< unsigned > key)
void SetMapped(LazyBool val)
void SetExecutable(LazyBool val)
void SetWritable(LazyBool val)
void FindSymbolsWithNameAndType(ConstString name, lldb::SymbolType symbol_type, SymbolContextList &sc_list) const
void SetObjectSize(uint64_t object_size)
ArchSpec & GetArchitecture()
void SetObjectOffset(uint64_t object_offset)
void SetGroupID(uint32_t gid)
bool ProcessIDIsValid() const
void SetArg0(llvm::StringRef arg)
lldb::pid_t GetProcessID() const
void SetProcessID(lldb::pid_t pid)
FileSpec & GetExecutableFile()
llvm::StringRef GetName() const
bool UserIDIsValid() const
uint32_t GetUserID() const
uint32_t GetGroupID() const
void SetUserID(uint32_t uid)
bool GroupIDIsValid() const
ArchSpec & GetArchitecture()
bool MatchAllProcesses() const
NameMatch GetNameMatchType() const
bool GetMatchAllUsers() const
ProcessInstanceInfo & GetProcessInfo()
uint32_t GetEffectiveUserID() const
void SetEffectiveGroupID(uint32_t gid)
lldb::pid_t GetParentProcessID() const
bool ParentProcessIDIsValid() const
uint32_t GetEffectiveGroupID() const
bool EffectiveUserIDIsValid() const
bool EffectiveGroupIDIsValid() const
void SetParentProcessID(lldb::pid_t pid)
void SetEffectiveUserID(uint32_t uid)
A plug-in interface definition class for debugging a process.
Target & GetTarget()
Get the target object pointer for this module.
llvm::Error ToError() const
FIXME: Replace all uses with takeError() instead.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
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.
int PutAsJSON(const T &obj, bool hex_ascii)
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)
Forwards the arguments to llvm::formatv and writes to the stream.
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
size_t PutStringAsRawHex8(llvm::StringRef s)
size_t PutHex64(uint64_t uvalue, lldb::ByteOrder byte_order=lldb::eByteOrderInvalid)
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 PutHex32(uint32_t uvalue, lldb::ByteOrder byte_order=lldb::eByteOrderInvalid)
virtual void Flush()=0
Flush the stream.
size_t EOL()
Output and End of Line character 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
std::optional< Dictionary * > GetItemAtIndexAsDictionary(size_t idx) const
Retrieves the element at index idx from a StructuredData::Array if it is a Dictionary.
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result) const
ObjectSP GetValueForKey(llvm::StringRef key) const
std::shared_ptr< Object > ObjectSP
static ObjectSP ParseJSON(llvm::StringRef json_text)
Defines a list of symbol context objects.
Defines a symbol context baton that can be handed other debug core functions.
const ModuleList & GetImages() const
Get accessor for the images for this process.
const ArchSpec & GetArchitecture() const
Represents UUID's of various sizes.
bool SetFromStringRef(llvm::StringRef str)
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
std::string GetAttributeValue(const char *name, const char *fail_value=nullptr) const
bool GetElementTextAsUnsigned(uint64_t &value, uint64_t fail_value=0, int base=0) const
bool GetAttributeValueAsUnsigned(const char *name, uint64_t &value, uint64_t fail_value=0, int base=0) const
GDBRemoteClientBase(const char *comm_name)
PacketResult SendPacketAndWaitForResponse(llvm::StringRef payload, StringExtractorGDBRemote &response, std::chrono::seconds interrupt_timeout=std::chrono::seconds(0), bool sync_on_timeout=true)
PacketResult SendPacketAndWaitForResponseNoLock(llvm::StringRef payload, StringExtractorGDBRemote &response, bool sync_on_timeout=true)
virtual void OnRunPacketSent(bool first)
lldb::DataBufferSP ReadRegister(lldb::tid_t tid, uint32_t reg_num)
std::chrono::seconds m_default_packet_timeout
LazyBool m_supports_vCont_S
LazyBool m_supports_detach_stay_stopped
LazyBool m_supports_alloc_dealloc_memory
bool SupportsGDBStoppointPacket(GDBStoppointType type)
ArchSpec GetSystemArchitecture()
bool RestoreRegisterState(lldb::tid_t tid, uint32_t save_id)
const ArchSpec & GetHostArchitecture()
int SendLaunchArchPacket(const char *arch)
lldb::pid_t GetCurrentProcessID(bool allow_lazy=true)
bool AvoidGPackets(ProcessGDBRemote *process)
llvm::VersionTuple GetMacCatalystVersion()
Status CreateSymlink(const FileSpec &src, const FileSpec &dst)
PacketResult SendThreadSpecificPacketAndWaitForResponse(lldb::tid_t tid, StreamString &&payload, StringExtractorGDBRemote &response)
LazyBool m_qGDBServerVersion_is_valid
bool GetLoadedDynamicLibrariesInfosSupported()
bool GetHostInfo(bool force=false)
LazyBool m_supports_memory_region_info
LazyBool m_qHostInfo_is_valid
bool KillSpawnedProcess(lldb::pid_t pid)
bool m_supports_jModulesInfo
lldb_private::AddressableBits GetAddressableBits()
LazyBool m_supports_jGetSharedCacheInfo
bool GetReverseContinueSupported()
bool GetGroupName(uint32_t gid, std::string &name)
bool DecodeProcessInfoResponse(StringExtractorGDBRemote &response, ProcessInstanceInfo &process_info)
std::optional< std::string > GetOSKernelDescription()
int SendEnvironment(const Environment &env)
LazyBool m_supports_augmented_libraries_svr4_read
uint32_t m_high_mem_addressing_bits
llvm::VersionTuple GetOSVersion()
std::optional< uint32_t > GetWatchpointSlotCount()
bool HandshakeWithServer(Status *error_ptr)
bool GetAugmentedLibrariesSVR4ReadSupported()
lldb_private::StructuredData::Array * GetSupportedStructuredDataPlugins()
Return the array of async JSON packet types supported by the remote.
bool m_supports_vFileSize
uint64_t GetRemoteMaxPacketSize()
bool QueryNoAckModeSupported()
lldb::tid_t m_curr_tid_run
Current gdb remote protocol thread identifier for continue, step, etc.
int SetSTDIOWindowSize(uint16_t cols, uint16_t rows)
Send the dimensions of the user's stdio terminal window to the server.
int SendLaunchEventDataPacket(const char *data, bool *was_supported=nullptr)
bool m_qSymbol_requests_done
bool GetCurrentProcessInfo(bool allow_lazy_pid=true)
Status Unlink(const FileSpec &file_spec)
bool GetVAttachOrWaitSupported()
std::optional< std::vector< ModuleSpec > > GetModulesInfo(llvm::ArrayRef< FileSpec > module_file_specs, const llvm::Triple &triple)
llvm::Expected< std::string > ReadExtFeature(llvm::StringRef object, llvm::StringRef annex)
LazyBool m_supports_qXfer_features_read
bool GetAcceleratorPluginsSupported()
bool m_supports_vFileMode
bool GetMultiprocessSupported()
LazyBool m_qProcessInfo_is_valid
LazyBool m_supports_vCont_c
std::optional< GDBRemoteFStatData > Stat(const FileSpec &file_spec)
std::optional< QOffsets > GetQOffsets()
Use qOffsets to query the offset used when relocating the target executable.
size_t QueryGDBServer(std::vector< std::pair< uint16_t, std::string > > &connection_urls)
int m_target_vm_page_size
llvm::Error SendTraceStop(const TraceStopRequest &request, std::chrono::seconds interrupt_timeout)
uint32_t m_num_supported_hardware_watchpoints
std::optional< xPacketState > m_x_packet_state
void TestPacketSpeed(const uint32_t num_packets, uint32_t max_send, uint32_t max_recv, uint64_t recv_amount, bool json, Stream &strm)
lldb::addr_t AllocateMemory(size_t size, uint32_t permissions)
LazyBool m_supports_wasm_instance
std::string m_host_distribution_id
GDBRemoteCommunicationClient()
std::optional< std::string > GetOSBuildString()
bool LaunchGDBServer(const char *remote_accept_hostname, lldb::pid_t &pid, uint16_t &port, std::string &socket_name)
int SetSTDOUT(const FileSpec &file_spec)
LazyBool m_prepare_for_reg_writing_reply
bool m_supports_qThreadStopInfo
bool SetCurrentThreadForRun(uint64_t tid, lldb::pid_t pid=LLDB_INVALID_PROCESS_ID)
uint8_t SendGDBStoppointTypePacket(GDBStoppointType type, bool insert, lldb::addr_t addr, uint32_t length, std::chrono::seconds interrupt_timeout)
bool GetpPacketSupported(lldb::tid_t tid)
Status MakeDirectory(const FileSpec &file_spec, uint32_t mode)
uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *dst, uint64_t dst_len, Status &error)
LazyBool m_supports_vCont_any
bool GetWorkingDir(FileSpec &working_dir)
Gets the current working directory of a remote platform GDB server.
lldb::user_id_t OpenFile(const FileSpec &file_spec, File::OpenOptions flags, mode_t mode, Status &error)
LazyBool m_supports_error_string_reply
LazyBool m_supports_qXfer_siginfo_read
WatchpointHardwareFeature GetSupportedWatchpointTypes()
std::optional< GDBRemoteFStatData > FStat(lldb::user_id_t fd)
int SetSTDERR(const FileSpec &file_spec)
bool GetThreadSuffixSupported()
lldb::addr_t m_process_standalone_value
Status RunShellCommand(llvm::StringRef command, const FileSpec &working_dir, int *status_ptr, int *signo_ptr, std::string *command_output, std::string *separated_error_output, const Timeout< std::micro > &timeout)
LazyBool m_supports_memory_tagging
llvm::Expected< std::string > SendTraceGetState(llvm::StringRef type, std::chrono::seconds interrupt_timeout)
void ResetDiscoverableSettings(bool did_exec)
llvm::Error LaunchProcess(const Args &args)
Launch the process using the provided arguments.
LazyBool m_supports_qXfer_libraries_svr4_read
bool m_process_standalone_value_is_offset
lldb_private::StructuredData::ObjectSP m_supported_async_json_packets_sp
LazyBool m_attach_or_wait_reply
bool m_supports_jThreadsInfo
bool GetGDBServerVersion()
lldb::user_id_t GetFileSize(const FileSpec &file_spec)
bool GetQXferFeaturesReadSupported()
LazyBool m_watchpoints_trigger_after_instruction
LazyBool m_supports_threads_in_stop_reply
std::vector< lldb::addr_t > m_binary_addresses
void GetRemoteQSupported()
bool GetQPassSignalsSupported()
Status ConfigureRemoteStructuredData(llvm::StringRef type_name, const StructuredData::ObjectSP &config_sp)
Configure a StructuredData feature on the remote end.
bool CloseFile(lldb::user_id_t fd, Status &error)
~GDBRemoteCommunicationClient() override
bool GetReverseStepSupported()
uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *src, uint64_t src_len, Status &error)
llvm::Expected< std::vector< AcceleratorActions > > GetAcceleratorInitializeActions()
Send the "jAcceleratorPluginInitialize" packet and return the actions requested by each accelerator p...
LazyBool m_supports_vCont_s
bool m_supports_qGroupName
bool SetCurrentThread(uint64_t tid, lldb::pid_t pid=LLDB_INVALID_PROCESS_ID)
bool m_supports_vFileExists
bool GetDefaultThreadId(lldb::tid_t &tid)
void ServeSymbolLookups(lldb_private::Process *process)
LazyBool m_uses_native_signals
int SendStdinNotification(const char *data, size_t data_len, std::chrono::seconds interrupt_timeout=std::chrono::seconds(0))
Sends a GDB remote protocol 'I' packet that delivers stdin data to the remote process.
uint32_t m_low_mem_addressing_bits
lldb::tid_t m_curr_tid
Current gdb remote protocol thread identifier for all other operations.
LazyBool m_supports_multi_breakpoint
LazyBool m_supports_qXfer_memory_map_read
bool GetHostname(std::string &s)
llvm::Expected< int > KillProcess(lldb::pid_t pid)
bool m_supported_async_json_packets_is_valid
bool GetSyncThreadStateSupported()
bool WriteAllRegisters(lldb::tid_t tid, llvm::ArrayRef< uint8_t > data)
bool m_supports_QEnvironmentHexEncoded
bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &process_info)
Status SetFilePermissions(const FileSpec &file_spec, uint32_t file_permissions)
LazyBool m_curr_pid_is_valid
Status GetQXferMemoryMapRegionInfo(lldb::addr_t addr, MemoryRegionInfo ®ion)
std::vector< AddressSpaceInfo > GetAddressSpaces()
Empty if the server does not support "jAddressSpacesInfo".
int SetDetachOnError(bool enable)
Sets the DetachOnError flag to enable for the process controlled by the stub.
void OnRunPacketSent(bool first) override
bool m_supports_QEnvironment
lldb::addr_t GetShlibInfoAddr()
Status SendSignalsToIgnore(llvm::ArrayRef< int32_t > signals)
LazyBool m_supports_jThreadExtendedInfo
LazyBool GetThreadPacketSupported(lldb::tid_t tid, llvm::StringRef packetStr)
UUID m_process_standalone_uuid
LazyBool m_supports_not_sending_acks
LazyBool m_supports_watchpoint_support_info
bool WriteRegister(lldb::tid_t tid, uint32_t reg_num, llvm::ArrayRef< uint8_t > data)
uint64_t m_max_packet_size
void EnableErrorStringInPacket()
LazyBool m_supports_accelerator_plugins
llvm::Expected< std::vector< uint8_t > > SendTraceGetBinaryData(const TraceGetBinaryDataRequest &request, std::chrono::seconds interrupt_timeout)
LazyBool m_supports_qXfer_libraries_read
bool GetSaveCoreSupported() const
LazyBool m_supports_jLoadedDynamicLibrariesInfos
Status LoadQXferMemoryMap()
LazyBool m_supports_thread_suffix
int SetSTDIN(const FileSpec &file_spec)
Sets the path to use for stdin/out/err for a process that will be launched with the 'A' packet.
bool m_supports_address_spaces
LazyBool m_supports_vCont_C
lldb::pid_t m_curr_pid
Current gdb remote protocol process identifier for all other operations.
Status WriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type, const std::vector< uint8_t > &tags)
LazyBool m_supports_qSaveCore
LazyBool m_supports_reverse_step
bool GetQXferLibrariesSVR4ReadSupported()
size_t GetCurrentThreadIDs(std::vector< lldb::tid_t > &thread_ids, bool &sequence_mutex_unavailable)
Status Detach(bool keep_stopped, lldb::pid_t pid=LLDB_INVALID_PROCESS_ID)
std::optional< bool > GetWatchpointReportedAfter()
std::string m_gdb_server_name
std::vector< lldb::addr_t > GetProcessStandaloneBinaries()
bool m_supports_qProcessInfoPID
llvm::VersionTuple m_os_version
bool GetQXferLibrariesReadSupported()
llvm::VersionTuple m_maccatalyst_version
int SetDisableASLR(bool enable)
Sets the disable ASLR flag to enable for a process that will be launched with the 'A' packet.
bool GetUserName(uint32_t uid, std::string &name)
Status GetMemoryRegionInfo(lldb::addr_t addr, MemoryRegionInfo &range_info)
std::vector< MemoryRegionInfo > m_qXfer_memory_map
bool SyncThreadState(lldb::tid_t tid)
bool m_supports_qfProcessInfo
std::chrono::seconds GetHostDefaultPacketTimeout()
bool GetWasmInstanceSupported()
Whether the WebAssembly stub can be told which module instance to read from, which it advertises with...
bool GetThreadExtendedInfoSupported()
lldb::DataBufferSP ReadAllRegisters(lldb::tid_t tid)
bool GetMemoryTaggingSupported()
void AutoCompleteDiskFileOrDirectory(CompletionRequest &request, bool only_dir)
lldb::pid_t m_curr_pid_run
Current gdb remote protocol process identifier for continue, step, etc.
LazyBool m_supports_multiprocess
void MaybeEnableCompression(llvm::ArrayRef< llvm::StringRef > supported_compressions)
bool GetDynamicLoaderProcessStateSupported()
const ArchSpec & GetProcessArchitecture()
bool DeallocateMemory(lldb::addr_t addr)
llvm::Expected< TraceSupportedResponse > SendTraceSupported(std::chrono::seconds interrupt_timeout)
bool GetQXferAuxvReadSupported()
bool GetMultiBreakpointSupported()
xPacketState GetxPacketState()
llvm::ErrorOr< llvm::MD5::MD5Result > CalculateMD5(const FileSpec &file_spec)
bool GetVContSupported(llvm::StringRef flavor)
uint32_t GetGDBServerProgramVersion()
LazyBool m_supports_reverse_continue
llvm::Error SendTraceStart(const llvm::json::Value &request, std::chrono::seconds interrupt_timeout)
bool GetStopReply(StringExtractorGDBRemote &response)
bool m_supports_qUserName
bool GetQXferMemoryMapReadSupported()
bool m_qXfer_memory_map_loaded
llvm::Expected< AcceleratorBreakpointHitResponse > AcceleratorBreakpointHit(const AcceleratorBreakpointHitArgs &args)
Send the "jAcceleratorPluginBreakpointHit" packet to notify the accelerator plugin that one of its re...
bool GetModuleInfo(const FileSpec &module_file_spec, const ArchSpec &arch_spec, ModuleSpec &module_spec)
LazyBool m_supports_vCont_all
std::optional< PidTid > SendSetCurrentThreadPacket(uint64_t tid, uint64_t pid, char op)
bool SendSpeedTestPacket(uint32_t send_size, uint32_t recv_size)
LazyBool m_supports_multi_mem_read
LazyBool m_supports_QPassSignals
bool GetFileExists(const FileSpec &file_spec)
Status GetFilePermissions(const FileSpec &file_spec, uint32_t &file_permissions)
uint32_t FindProcesses(const ProcessInstanceInfoMatch &process_match_info, ProcessInstanceInfoList &process_infos)
lldb::DataBufferSP ReadMemoryTags(lldb::addr_t addr, size_t len, int32_t type)
bool GetMultiMemReadSupported()
bool GetQXferSigInfoReadSupported()
uint32_t m_gdb_server_version
int SetWorkingDir(const FileSpec &working_dir)
Sets the working directory to path for a process that will be launched with the 'A' packet for non pl...
LazyBool m_avoid_g_packets
std::vector< std::pair< lldb::pid_t, lldb::tid_t > > GetCurrentProcessAndThreadIDs(bool &sequence_mutex_unavailable)
bool GetThreadStopInfo(lldb::tid_t tid, StringExtractorGDBRemote &response)
bool SaveRegisterState(lldb::tid_t tid, uint32_t &save_id)
bool GetProcessStandaloneBinary(UUID &uuid, lldb::addr_t &value, bool &value_is_offset)
LazyBool m_supports_QSaveRegisterState
WatchpointHardwareFeature m_watchpoint_types
void GetListThreadsInStopReplySupported()
StructuredData::ObjectSP GetThreadsInfo()
std::string m_qSupported_response
bool GetSharedCacheInfoSupported()
LazyBool m_supports_qXfer_auxv_read
bool m_supports_qModuleInfo
const char * GetGDBServerProgramName()
LazyBool m_supports_jGetDyldProcessState
int SendEnvironmentPacket(char const *name_equal_value)
Sends a "QEnvironment:NAME=VALUE" packet that will build up the environment that will get used when l...
std::chrono::seconds SetPacketTimeout(std::chrono::seconds packet_timeout)
LazyBool m_supports_qEcho
CompressionType m_compression_type
std::chrono::seconds GetPacketTimeout() const
#define LLDB_INVALID_THREAD_ID
#define LLDB_INVALID_CPUTYPE
#define UNUSED_IF_ASSERT_DISABLED(x)
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_PROCESS_ID
lldb::ByteOrder InlHostByteOrder()
llvm::raw_ostream & operator<<(llvm::raw_ostream &os, const QOffsets &offsets)
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.
llvm::json::Value toJSON(const Diagnostics::Report &report)
Render a diagnostics report as JSON, for diagnostics dump's terminal output.
std::vector< ProcessInstanceInfo > ProcessInstanceInfoList
@ eErrorTypeGeneric
Generic errors that can be any value.
@ eErrorTypePOSIX
POSIX error codes.
@ eSymbolTypeVariableType
@ eSymbolTypeObjCMetaClass
@ eSymbolTypeAdditional
When symbols take more than one entry, the extra entries get this type.
@ eSymbolTypeInstrumentation
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
Sent by the client when a plugin-requested breakpoint is hit.
bool Contains(BaseType r) const
BaseType GetRangeBase() const
void SetRangeEnd(BaseType end)
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
The offsets used by the target when relocating the executable.
bool segments
If true, the offsets field describes segments.
std::vector< uint64_t > offsets
The individual offsets.