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()));
300 llvm::Expected<LLDBSettings> settings =
301 llvm::json::parse<LLDBSettings>(response.
Peek(),
"LLDBSettings");
305 "malformed jLLDBSettings response '{1}': {0}",
314llvm::Expected<AcceleratorBreakpointHitResponse>
318 packet.
PutCString(
"jAcceleratorPluginBreakpointHit:");
324 return llvm::createStringError(
325 "failed to send jAcceleratorPluginBreakpointHit packet");
330 llvm::Expected<AcceleratorBreakpointHitResponse> hit_response =
331 llvm::json::parse<AcceleratorBreakpointHitResponse>(
332 response.
Peek(),
"AcceleratorBreakpointHitResponse");
339 return llvm::createStringErrorV(
340 "malformed jAcceleratorPluginBreakpointHit response '{0}': {1}",
341 response.
GetStringRef(), llvm::toString(hit_response.takeError()));
516 std::vector<std::string> features = {
"xmlRegisters=i386,arm,mips,arc",
522 "qXfer:libraries:read+",
523 "qXfer:libraries-svr4:read+"};
526 for (uint32_t i = 0; i < features.size(); ++i) {
538 for (llvm::StringRef x : llvm::split(response.
GetStringRef(),
';')) {
539 if (x ==
"qXfer:auxv:read+")
541 else if (x ==
"qXfer:libraries-svr4:read+")
543 else if (x ==
"augmented-libraries-svr4-read") {
546 }
else if (x ==
"qXfer:libraries:read+")
548 else if (x ==
"qXfer:features:read+")
550 else if (x ==
"qXfer:memory-map:read+")
552 else if (x ==
"qXfer:siginfo:read+")
554 else if (x ==
"qEcho+")
556 else if (x ==
"QPassSignals+")
558 else if (x ==
"multiprocess+")
560 else if (x ==
"memory-tagging+")
562 else if (x ==
"qSaveCore+")
564 else if (x ==
"address-spaces+")
566 else if (x ==
"native-signals+")
568 else if (x ==
"binary-upload+")
570 else if (x ==
"ReverseContinue+")
572 else if (x ==
"ReverseStep+")
574 else if (x ==
"MultiMemRead+")
576 else if (x ==
"jMultiBreakpoint+")
578 else if (x ==
"accelerator-plugins+")
580 else if (x ==
"lldb-settings+")
582 else if (x ==
"qWasmInstance+")
587 else if (x.consume_front(
"SupportedCompressions=")) {
588 llvm::SmallVector<llvm::StringRef, 4> compressions;
589 x.split(compressions,
',');
590 if (!compressions.empty())
592 }
else if (x.consume_front(
"SupportedWatchpointTypes=")) {
593 llvm::SmallVector<llvm::StringRef, 4> watchpoint_types;
594 x.split(watchpoint_types,
',');
596 for (
auto wp_type : watchpoint_types) {
597 if (wp_type ==
"x86_64")
599 if (wp_type ==
"aarch64-mask")
601 if (wp_type ==
"aarch64-bas")
604 }
else if (x.consume_front(
"PacketSize=")) {
611 LLDB_LOGF(log,
"Garbled PacketSize spec in qSupported response");
632 assert(!flavor.empty());
643 for (llvm::StringRef token : llvm::split(response.
GetStringRef(),
';')) {
670 return llvm::StringSwitch<bool>(flavor)
688 "GDBRemoteCommunicationClient::%s: Didn't get sequence mutex "
690 __FUNCTION__, payload.GetData());
695 payload.Printf(
";thread:%4.4" PRIx64
";", tid);
742 }
else if (!response.
Empty()) {
831 packet.
Printf(
"qMemTags:%" PRIx64
",%zx:%" PRIx32, addr, len, type);
839 LLDB_LOGF(log,
"GDBRemoteCommunicationClient::%s: qMemTags packet failed",
847 if (response.
GetChar() !=
'm') {
849 "GDBRemoteCommunicationClient::%s: qMemTags response did not "
860 if (response.
GetBytesLeft() || (expected_bytes != got_bytes)) {
863 "GDBRemoteCommunicationClient::%s: Invalid data in qMemTags response",
873 const std::vector<uint8_t> &tags) {
876 packet.
Printf(
"QMemTags:%" PRIx64
",%zx:%" PRIx32
":", addr, len, type);
922 if (response.
GetChar() ==
'Q') {
923 if (response.
GetChar() ==
'C') {
937 bool sequence_mutex_unavailable;
939 if (!ids.empty() && !sequence_mutex_unavailable) {
956 return llvm::createStringError(llvm::inconvertibleErrorCode(),
957 "Nothing to launch");
970 return llvm::createStringError(llvm::inconvertibleErrorCode(),
971 "Sending vRun packet failed");
980 return llvm::Error::success();
988 llvm::ListSeparator LS(
",");
989 for (
const auto &arg : llvm::enumerate(args)) {
991 packet.
Format(
"{0},{1},", arg.value().ref().size() * 2, arg.index());
998 return llvm::createStringError(llvm::inconvertibleErrorCode(),
999 "Sending A packet failed");
1006 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1007 "Sending qLaunchSuccess packet failed");
1010 return llvm::Error::success();
1011 if (response.
GetChar() ==
'E') {
1012 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1015 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1016 "unknown error occurred launching process");
1020 llvm::SmallVector<std::pair<llvm::StringRef, llvm::StringRef>, 0> vec;
1021 for (
const auto &kv : env)
1022 vec.emplace_back(kv.first(), kv.second);
1023 llvm::sort(vec, llvm::less_first());
1024 for (
const auto &[k, v] : vec) {
1033 char const *name_equal_value) {
1034 if (name_equal_value && name_equal_value[0]) {
1035 bool send_hex_encoding =
false;
1036 for (
const char *p = name_equal_value; *p !=
'\0' && !send_hex_encoding;
1038 if (llvm::isPrint(*p)) {
1044 send_hex_encoding =
true;
1051 send_hex_encoding =
true;
1059 packet.
Printf(
"QEnvironment:%s", name_equal_value);
1078 packet.
PutCString(
"QEnvironmentHexEncoded:");
1100 if (arch && arch[0]) {
1102 packet.
Printf(
"QLaunchArch:%s", arch);
1117 char const *data,
bool *was_supported) {
1118 if (data && *data !=
'\0') {
1120 packet.
Printf(
"QSetProcessEvent:%s", data);
1126 *was_supported =
true;
1130 *was_supported =
false;
1135 *was_supported =
true;
1159 return std::nullopt;
1162std::optional<std::string>
1168 return std::nullopt;
1196 UUID &uuid,
addr_t &value,
bool &value_is_offset) {
1234 llvm::Expected<std::vector<AddressSpaceInfo>> info =
1235 llvm::json::parse<std::vector<AddressSpaceInfo>>(response.
Peek(),
1236 "AddressSpaceInfo");
1238 return std::move(*info);
1242 "malformed jAddressSpacesInfo response '{1}': {0}",
1257 llvm::StringRef name, value;
1258 bool success =
false;
1260 if (name ==
"name") {
1263 }
else if (name ==
"version") {
1264 llvm::StringRef major, minor;
1265 std::tie(major, minor) = value.split(
'.');
1279 llvm::ArrayRef<llvm::StringRef> supported_compressions) {
1281 llvm::StringRef avail_name;
1283#if HAVE_LIBCOMPRESSION
1285 for (
auto compression : supported_compressions) {
1286 if (compression ==
"lzfse") {
1288 avail_name = compression;
1294 for (
auto compression : supported_compressions) {
1295 if (compression ==
"zlib-deflate") {
1297 avail_name = compression;
1306 for (
auto compression : supported_compressions) {
1307 if (compression ==
"zlib-deflate") {
1309 avail_name = compression;
1316#if HAVE_LIBCOMPRESSION
1318 for (
auto compression : supported_compressions) {
1319 if (compression ==
"lz4") {
1321 avail_name = compression;
1327 for (
auto compression : supported_compressions) {
1328 if (compression ==
"lzma") {
1330 avail_name = compression;
1339 std::string packet =
"QEnableCompression:type:" + avail_name.str() +
";";
1386 tid = pid_tid->second;
1393 std::string &environment) {
1394 if (value ==
"iossimulator" || value ==
"tvossimulator" ||
1395 value ==
"watchossimulator" || value ==
"xrossimulator" ||
1396 value ==
"visionossimulator") {
1397 environment =
"simulator";
1398 os_name = value.drop_back(environment.size()).str();
1399 }
else if (value ==
"maccatalyst") {
1401 environment =
"macabi";
1403 os_name = value.str();
1419 llvm::StringRef name;
1420 llvm::StringRef value;
1423 std::string arch_name;
1424 std::string os_name;
1425 std::string environment;
1426 std::string vendor_name;
1428 uint32_t pointer_byte_size = 0;
1430 uint32_t num_keys_decoded = 0;
1432 if (name ==
"cputype") {
1434 if (!value.getAsInteger(
BASE_10, cpu))
1436 }
else if (name ==
"cpusubtype") {
1438 if (!value.getAsInteger(
BASE_10, sub))
1440 }
else if (name ==
"arch") {
1441 arch_name = std::string(value);
1443 }
else if (name ==
"triple") {
1447 }
else if (name ==
"distribution_id") {
1451 }
else if (name ==
"os_build") {
1455 }
else if (name ==
"hostname") {
1459 }
else if (name ==
"os_kernel") {
1463 }
else if (name ==
"ostype") {
1466 }
else if (name ==
"vendor") {
1467 vendor_name = std::string(value);
1469 }
else if (name ==
"endian") {
1470 byte_order = llvm::StringSwitch<lldb::ByteOrder>(value)
1477 }
else if (name ==
"ptrsize") {
1478 if (!value.getAsInteger(
BASE_10, pointer_byte_size))
1480 }
else if (name ==
"addressing_bits") {
1484 }
else if (name ==
"high_mem_addressing_bits") {
1487 }
else if (name ==
"low_mem_addressing_bits") {
1490 }
else if (name ==
"os_version" ||
1497 }
else if (name ==
"maccatalyst_version") {
1500 }
else if (name ==
"watchpoint_exceptions_received") {
1502 llvm::StringSwitch<LazyBool>(value)
1508 }
else if (name ==
"default_packet_timeout") {
1509 uint32_t timeout_seconds;
1510 if (!value.getAsInteger(
BASE_10, timeout_seconds)) {
1515 }
else if (name ==
"vm-page-size") {
1517 if (!value.getAsInteger(
BASE_10, page_size)) {
1524 if (num_keys_decoded > 0)
1527 if (triple.empty()) {
1528 if (arch_name.empty()) {
1531 if (pointer_byte_size) {
1532 assert(pointer_byte_size ==
m_host_arch.GetAddressByteSize());
1538 if (!vendor_name.empty())
1540 llvm::StringRef(vendor_name));
1541 if (!os_name.empty())
1542 m_host_arch.GetTriple().setOSName(llvm::StringRef(os_name));
1543 if (!environment.empty())
1544 m_host_arch.GetTriple().setEnvironmentName(environment);
1548 triple += arch_name;
1549 if (!vendor_name.empty() || !os_name.empty()) {
1551 if (vendor_name.empty())
1552 triple +=
"unknown";
1554 triple += vendor_name;
1556 if (os_name.empty())
1557 triple +=
"unknown";
1563 llvm::Triple &host_triple =
m_host_arch.GetTriple();
1564 if (host_triple.getVendor() == llvm::Triple::Apple &&
1565 host_triple.getOS() == llvm::Triple::Darwin) {
1567 case llvm::Triple::aarch64:
1568 case llvm::Triple::aarch64_32:
1569 case llvm::Triple::arm:
1570 case llvm::Triple::thumb:
1571 host_triple.setOS(llvm::Triple::IOS);
1574 host_triple.setOS(llvm::Triple::MacOSX);
1578 if (pointer_byte_size) {
1579 assert(pointer_byte_size ==
m_host_arch.GetAddressByteSize());
1587 if (pointer_byte_size) {
1588 assert(pointer_byte_size ==
m_host_arch.GetAddressByteSize());
1595 "GDBRemoteCommunicationClient::%s parsed host "
1596 "architecture as %s, triple as %s from triple text %s",
1600 :
"<null-arch-name>",
1611 const char *data,
size_t data_len, std::chrono::seconds interrupt_timeout) {
1617 interrupt_timeout) ==
1641 return addressable_bits;
1651 uint32_t permissions) {
1655 const int packet_len = ::snprintf(
1656 packet,
sizeof(packet),
"_M%" PRIx64
",%s%s%s", (uint64_t)size,
1657 permissions & lldb::ePermissionsReadable ?
"r" :
"",
1658 permissions & lldb::ePermissionsWritable ?
"w" :
"",
1659 permissions & lldb::ePermissionsExecutable ?
"x" :
"");
1660 assert(packet_len < (
int)
sizeof(packet));
1680 const int packet_len =
1681 ::snprintf(packet,
sizeof(packet),
"_m%" PRIx64, (uint64_t)addr);
1682 assert(packet_len < (
int)
sizeof(packet));
1707 const int packet_len =
1708 ::snprintf(packet,
sizeof(packet),
"qSupportsDetachAndStayStopped:");
1709 assert(packet_len < (
int)
sizeof(packet));
1723 "Stays stopped not supported by this target.");
1739 "Multiprocess extension not supported by the server.");
1754 region_info.
Clear();
1759 const int packet_len = ::snprintf(
1760 packet,
sizeof(packet),
"qMemoryRegionInfo:%" PRIx64, (uint64_t)addr);
1761 assert(packet_len < (
int)
sizeof(packet));
1767 llvm::StringRef name;
1768 llvm::StringRef value;
1770 bool success =
true;
1771 bool saw_permissions =
false;
1773 if (name ==
"start") {
1774 if (!value.getAsInteger(
BASE_16, addr_value))
1776 }
else if (name ==
"size") {
1777 if (!value.getAsInteger(
BASE_16, addr_value)) {
1785 }
else if (name ==
"permissions" && region_info.
GetRange().
IsValid()) {
1786 saw_permissions =
true;
1788 if (value.contains(
'r'))
1793 if (value.contains(
'w'))
1798 if (value.contains(
'x'))
1812 }
else if (name ==
"name") {
1816 region_info.
SetName(name.c_str());
1817 }
else if (name ==
"flags") {
1821 llvm::StringRef flags = value;
1822 llvm::StringRef flag;
1823 while (flags.size()) {
1824 flags = flags.ltrim();
1825 std::tie(flag, flags) = flags.split(
' ');
1830 else if (flag ==
"ss")
1834 }
else if (name ==
"type") {
1835 for (llvm::StringRef entry : llvm::split(value,
',')) {
1836 if (entry ==
"stack")
1838 else if (entry ==
"heap")
1841 }
else if (name ==
"error") {
1843 std::string error_string;
1847 }
else if (name ==
"dirty-pages") {
1848 std::vector<addr_t> dirty_page_list;
1849 for (llvm::StringRef x : llvm::split(value,
',')) {
1851 x.consume_front(
"0x");
1852 if (llvm::to_integer(x, page, 16))
1853 dirty_page_list.push_back(page);
1856 }
else if (name ==
"protection-key") {
1857 unsigned protection_key = 0;
1858 if (!value.getAsInteger(
BASE_10, protection_key))
1869 if (!saw_permissions) {
1897 region_info = qXfer_region_info;
1900 region_info.
Clear();
1902 }
else if (qXfer_error.
Success()) {
1917 if (!
error.Success())
1920 if (map_region.GetRange().Contains(addr)) {
1921 region = map_region;
1947 llvm::Expected<std::string> xml =
ReadExtFeature(
"memory-map",
"");
1953 if (!xml_document.
ParseMemory(xml->c_str(), xml->size())) {
1969 if (memory_node.
GetName() !=
"memory")
1981 if (type ==
"rom") {
1984 }
else if (type ==
"ram") {
1988 }
else if (type ==
"flash") {
1991 [®ion](
const XMLNode &prop_node) ->
bool {
1994 if (prop_node.
GetName() !=
"property")
1997 if (propname ==
"blocksize") {
2019 std::optional<uint32_t> num;
2025 llvm::StringRef name;
2026 llvm::StringRef value;
2028 if (name ==
"num") {
2044WatchpointHardwareFeature
2063 return std::nullopt;
2068 std::string path{file_spec.
GetPath(
false)};
2088 std::string path{file_spec.
GetPath(
false)};
2108 std::string path{file_spec.
GetPath(
false)};
2129 if ((cols == 0) != (rows == 0))
2132 packet.
Printf(
"QSetSTDIOWindowSize:cols=%u;rows=%u",
2133 static_cast<unsigned>(cols),
static_cast<unsigned>(rows));
2157 return !cwd.empty();
2164 std::string path{working_dir.
GetPath(
false)};
2184 const int packet_len =
2185 ::snprintf(packet,
sizeof(packet),
"QSetDisableASLR:%i", enable ? 1 : 0);
2186 assert(packet_len < (
int)
sizeof(packet));
2201 const int packet_len = ::snprintf(packet,
sizeof(packet),
2202 "QSetDetachOnError:%i", enable ? 1 : 0);
2203 assert(packet_len < (
int)
sizeof(packet));
2219 llvm::StringRef name;
2220 llvm::StringRef value;
2226 std::string os_type;
2229 if (name ==
"pid") {
2231 value.getAsInteger(
BASE_10, pid);
2233 }
else if (name ==
"ppid") {
2235 value.getAsInteger(
BASE_10, pid);
2237 }
else if (name ==
"uid") {
2239 value.getAsInteger(
BASE_10, uid);
2241 }
else if (name ==
"euid") {
2243 value.getAsInteger(
BASE_10, uid);
2245 }
else if (name ==
"gid") {
2247 value.getAsInteger(
BASE_10, gid);
2249 }
else if (name ==
"egid") {
2251 value.getAsInteger(
BASE_10, gid);
2253 }
else if (name ==
"triple") {
2258 }
else if (name ==
"name") {
2265 }
else if (name ==
"args") {
2266 llvm::StringRef encoded_args(value), hex_arg;
2268 bool is_arg0 =
true;
2269 while (!encoded_args.empty()) {
2270 std::tie(hex_arg, encoded_args) = encoded_args.split(
'-');
2285 }
else if (name ==
"cputype") {
2286 value.getAsInteger(
BASE_10, cpu);
2287 }
else if (name ==
"cpusubtype") {
2288 value.getAsInteger(
BASE_10, sub);
2289 }
else if (name ==
"vendor") {
2290 vendor = std::string(value);
2291 }
else if (name ==
"ostype") {
2292 os_type = std::string(value);
2297 if (vendor ==
"apple") {
2301 llvm::StringRef(vendor));
2303 llvm::StringRef(os_type));
2315 process_info.
Clear();
2319 const int packet_len =
2320 ::snprintf(packet,
sizeof(packet),
"qProcessInfoPID:%" PRIu64, pid);
2321 assert(packet_len < (
int)
sizeof(packet));
2351 llvm::StringRef name;
2352 llvm::StringRef value;
2355 std::string os_name;
2356 std::string environment;
2357 std::string vendor_name;
2359 std::string elf_abi;
2360 uint32_t pointer_byte_size = 0;
2363 uint32_t num_keys_decoded = 0;
2366 if (name ==
"cputype") {
2367 if (!value.getAsInteger(
BASE_16, cpu))
2369 }
else if (name ==
"cpusubtype") {
2370 if (!value.getAsInteger(
BASE_16, sub)) {
2376 if (cpu == llvm::MachO::CPU_TYPE_ARM64 &&
2377 sub == llvm::MachO::CPU_SUBTYPE_ARM64E) {
2384 }
else if (name ==
"triple") {
2388 }
else if (name ==
"ostype") {
2391 }
else if (name ==
"vendor") {
2392 vendor_name = std::string(value);
2394 }
else if (name ==
"endian") {
2395 byte_order = llvm::StringSwitch<lldb::ByteOrder>(value)
2402 }
else if (name ==
"ptrsize") {
2403 if (!value.getAsInteger(
BASE_16, pointer_byte_size))
2405 }
else if (name ==
"pid") {
2406 if (!value.getAsInteger(
BASE_16, pid))
2408 }
else if (name ==
"elf_abi") {
2409 elf_abi = std::string(value);
2411 }
else if (name ==
"main-binary-uuid") {
2414 }
else if (name ==
"main-binary-slide") {
2422 }
else if (name ==
"main-binary-address") {
2430 }
else if (name ==
"binary-addresses") {
2433 for (llvm::StringRef x : llvm::split(value,
',')) {
2435 x.consume_front(
"0x");
2436 if (llvm::to_integer(x, vmaddr, 16))
2441 if (num_keys_decoded > 0)
2449 if (!triple.empty()) {
2452 if (pointer_byte_size) {
2453 assert(pointer_byte_size ==
m_process_arch.GetAddressByteSize());
2456 !vendor_name.empty()) {
2457 llvm::Triple triple(llvm::Twine(
"-") + vendor_name +
"-" + os_name);
2458 if (!environment.empty())
2459 triple.setEnvironmentName(environment);
2461 assert(triple.getObjectFormat() != llvm::Triple::UnknownObjectFormat);
2462 assert(triple.getObjectFormat() != llvm::Triple::Wasm);
2463 assert(triple.getObjectFormat() != llvm::Triple::XCOFF);
2464 switch (triple.getObjectFormat()) {
2465 case llvm::Triple::MachO:
2468 case llvm::Triple::ELF:
2471 case llvm::Triple::COFF:
2474 case llvm::Triple::GOFF:
2475 case llvm::Triple::SPIRV:
2476 case llvm::Triple::Wasm:
2477 case llvm::Triple::XCOFF:
2478 case llvm::Triple::DXContainer:
2479 LLDB_LOGF(log,
"error: not supported target architecture");
2481 case llvm::Triple::UnknownObjectFormat:
2482 LLDB_LOGF(log,
"error: failed to determine target architecture");
2486 if (pointer_byte_size) {
2487 assert(pointer_byte_size ==
m_process_arch.GetAddressByteSize());
2492 m_process_arch.GetTriple().setVendorName(llvm::StringRef(vendor_name));
2494 m_process_arch.GetTriple().setEnvironmentName(llvm::StringRef(environment));
2508 process_infos.clear();
2516 bool has_name_match =
false;
2517 if (!name.empty()) {
2518 has_name_match =
true;
2520 switch (name_match_type) {
2522 has_name_match =
false;
2534 packet.
PutCString(
"name_match:starts_with;");
2545 if (has_name_match) {
2553 packet.
Printf(
"pid:%" PRIu64
";",
2556 packet.
Printf(
"parent_pid:%" PRIu64
";",
2563 packet.
Printf(
"euid:%u;",
2566 packet.
Printf(
"egid:%u;",
2572 const llvm::Triple &triple = match_arch.
GetTriple();
2588 process_infos.push_back(process_info);
2597 return process_infos.size();
2601 std::string &name) {
2604 const int packet_len =
2605 ::snprintf(packet,
sizeof(packet),
"qUserName:%i", uid);
2606 assert(packet_len < (
int)
sizeof(packet));
2628 std::string &name) {
2631 const int packet_len =
2632 ::snprintf(packet,
sizeof(packet),
"qGroupName:%i", gid);
2633 assert(packet_len < (
int)
sizeof(packet));
2655 uint32_t recv_size) {
2657 packet.
Printf(
"qSpeedTest:response_size:%x;data:", recv_size);
2658 uint32_t bytes_left = send_size;
2659 while (bytes_left > 0) {
2660 if (bytes_left >= 26) {
2661 packet.
PutCString(
"abcdefghijklmnopqrstuvwxyz");
2664 packet.
Printf(
"%*.*s;", bytes_left, bytes_left,
2665 "abcdefghijklmnopqrstuvwxyz");
2674 return duration<float>::zero();
2675 using Dur = duration<float>;
2676 Dur sum = std::accumulate(std::begin(v), std::end(v), Dur());
2677 Dur mean = sum / v.size();
2680 float delta = (d - mean).count();
2681 accum += delta * delta;
2684 return Dur(sqrtf(accum / (v.size() - 1)));
2690 uint64_t recv_amount,
2691 bool json,
Stream &strm) {
2696 strm.
Printf(
"{ \"packet_speeds\" : {\n \"num_packets\" : %u,\n "
2700 strm.
Printf(
"Testing sending %u packets of various sizes:\n",
2704 uint32_t result_idx = 0;
2706 std::vector<duration<float>> packet_times;
2708 for (send_size = 0; send_size <= max_send;
2709 send_size ? send_size *= 2 : send_size = 4) {
2710 for (uint32_t recv_size = 0; recv_size <= max_recv;
2711 recv_size ? recv_size *= 2 : recv_size = 4) {
2714 packet_times.clear();
2716 const auto start_time = steady_clock::now();
2717 for (uint32_t i = 0; i < num_packets; ++i) {
2718 const auto packet_start_time = steady_clock::now();
2721 const auto packet_end_time = steady_clock::now();
2722 packet_times.push_back(packet_end_time - packet_start_time);
2724 const auto end_time = steady_clock::now();
2725 const auto total_time = end_time - start_time;
2727 float packets_per_second =
2728 ((float)num_packets) / duration<float>(total_time).count();
2729 auto average_per_packet = num_packets > 0 ? total_time / num_packets
2730 : duration<float>::zero();
2731 const duration<float> standard_deviation =
2734 strm.
Format(
"{0}\n {{\"send_size\" : {1,6}, \"recv_size\" : "
2735 "{2,6}, \"total_time_nsec\" : {3,12:ns-}, "
2736 "\"standard_deviation_nsec\" : {4,9:ns-f0}}",
2737 result_idx > 0 ?
"," :
"", send_size, recv_size,
2738 total_time, standard_deviation);
2741 strm.
Format(
"qSpeedTest(send={0,7}, recv={1,7}) in {2:s+f9} for "
2742 "{3,9:f2} packets/s ({4,10:ms+f6} per packet) with "
2743 "standard deviation of {5,10:ms+f6}\n",
2744 send_size, recv_size, duration<float>(total_time),
2745 packets_per_second, duration<float>(average_per_packet),
2746 standard_deviation);
2752 const float k_recv_amount_mb = (float)recv_amount / (1024.0f * 1024.0f);
2754 strm.
Printf(
"\n ]\n },\n \"download_speed\" : {\n \"byte_size\" "
2755 ": %" PRIu64
",\n \"results\" : [",
2758 strm.
Printf(
"Testing receiving %2.1fMB of data using varying receive "
2764 for (uint32_t recv_size = 32; recv_size <= max_recv; recv_size *= 2) {
2769 if (recv_size > 0) {
2770 const auto start_time = steady_clock::now();
2771 uint32_t bytes_read = 0;
2772 uint32_t packet_count = 0;
2773 while (bytes_read < recv_amount) {
2776 bytes_read += recv_size;
2779 const auto end_time = steady_clock::now();
2780 const auto total_time = end_time - start_time;
2781 float mb_second = ((float)recv_amount) /
2782 duration<float>(total_time).count() /
2784 float packets_per_second =
2785 ((float)packet_count) / duration<float>(total_time).count();
2786 const auto average_per_packet = packet_count > 0
2787 ? total_time / packet_count
2788 : duration<float>::zero();
2791 strm.
Format(
"{0}\n {{\"send_size\" : {1,6}, \"recv_size\" : "
2792 "{2,6}, \"total_time_nsec\" : {3,12:ns-}}",
2793 result_idx > 0 ?
"," :
"", send_size, recv_size,
2797 strm.
Format(
"qSpeedTest(send={0,7}, recv={1,7}) {2,6} packets needed "
2798 "to receive {3:f1}MB in {4:s+f9} for {5} MB/sec for "
2799 "{6,9:f2} packets/sec ({7,10:ms+f6} per packet)\n",
2800 send_size, recv_size, packet_count, k_recv_amount_mb,
2801 duration<float>(total_time), mb_second,
2802 packets_per_second, duration<float>(average_per_packet));
2808 strm.
Printf(
"\n ]\n }\n}\n");
2815 uint32_t recv_size) {
2825 const char *remote_accept_hostname,
lldb::pid_t &pid, uint16_t &port,
2826 std::string &socket_name) {
2829 socket_name.clear();
2834 std::string hostname;
2835 if (remote_accept_hostname && remote_accept_hostname[0])
2836 hostname = remote_accept_hostname;
2838 if (HostInfo::GetHostname(hostname)) {
2840 stream.
Printf(
"host:%s;", hostname.c_str());
2844 stream.
Printf(
"host:*;");
2855 llvm::StringRef name;
2856 llvm::StringRef value;
2859 value.getAsInteger(
BASE_10, port);
2860 else if (name ==
"pid")
2861 value.getAsInteger(
BASE_10, pid);
2862 else if (name.compare(
"socket_name") == 0) {
2873 std::vector<std::pair<uint16_t, std::string>> &connection_urls) {
2874 connection_urls.clear();
2890 for (
size_t i = 0, count = array->
GetSize(); i < count; ++i) {
2891 std::optional<StructuredData::Dictionary *> maybe_element =
2900 port = port_osp->GetUnsignedIntegerValue(0);
2902 std::string socket_name;
2905 socket_name = std::string(socket_name_osp->GetStringValue());
2907 if (port != 0 || !socket_name.empty())
2908 connection_urls.emplace_back(port, socket_name);
2910 return connection_urls.size();
2915 stream.
Printf(
"qKillSpawnedProcess:%" PRId64, pid);
2927 uint64_t tid, uint64_t pid,
char op) {
2933 packet.
Printf(
"p%" PRIx64
".", pid);
2938 packet.
Printf(
"%" PRIx64, tid);
2944 return {{pid, tid}};
2956 return std::nullopt;
2971 return ret.has_value();
2986 return ret.has_value();
3001 ::snprintf(packet,
sizeof(packet),
"qThreadStopInfo%" PRIx64, tid);
3002 assert(packet_len < (
int)
sizeof(packet));
3021 std::chrono::seconds timeout) {
3023 LLDB_LOGF(log,
"GDBRemoteCommunicationClient::%s() %s at addr = 0x%" PRIx64,
3024 __FUNCTION__, insert ?
"add" :
"remove", addr);
3031 const int packet_len =
3032 ::snprintf(packet,
sizeof(packet),
"%c%i,%" PRIx64
",%x",
3033 insert ?
'Z' :
'z', type, addr, length);
3035 assert(packet_len + 1 < (
int)
sizeof(packet));
3080std::vector<std::pair<lldb::pid_t, lldb::tid_t>>
3082 bool &sequence_mutex_unavailable) {
3083 std::vector<std::pair<lldb::pid_t, lldb::tid_t>> ids;
3087 sequence_mutex_unavailable =
false;
3091 for (packet_result =
3109 ids.push_back(*pid_tid);
3111 }
while (ch ==
',');
3125 ids.emplace_back(1, 1);
3129 LLDB_LOG(log,
"error: failed to get packet sequence mutex, not sending "
3130 "packet 'qfThreadInfo'");
3131 sequence_mutex_unavailable =
true;
3138 std::vector<lldb::tid_t> &thread_ids,
bool &sequence_mutex_unavailable) {
3143 if (ids.empty() || sequence_mutex_unavailable)
3146 for (
auto id : ids) {
3152 thread_ids.push_back(
id.second);
3155 return thread_ids.size();
3168 llvm::StringRef command,
3176 std::string *separated_error_output,
3186 timeout_sec = std::ceil(std::chrono::duration<double>(*timeout).count());
3190 std::string path{working_dir.
GetPath(
false)};
3197 if (response.
GetChar() !=
'F')
3199 if (response.
GetChar() !=
',')
3204 else if (status_ptr)
3205 *status_ptr = exitcode;
3206 if (response.
GetChar() !=
',')
3211 if (response.
GetChar() !=
',')
3216 command_output->assign(output);
3223 uint32_t file_permissions) {
3224 std::string path{file_spec.
GetPath(
false)};
3230 llvm::StringRef packet = stream.
GetString();
3235 packet.str().c_str());
3237 if (response.
GetChar() !=
'F')
3239 packet.str().c_str());
3246 uint32_t file_permissions) {
3247 std::string path{file_spec.
GetPath(
false)};
3253 llvm::StringRef packet = stream.
GetString();
3260 if (response.
GetChar() !=
'F')
3269#define HANDLE_ERRNO(name, value) \
3272#include "Plugins/Process/gdb-remote/GDBRemoteErrno.def"
3281 if (response.
GetChar() !=
'F')
3283 int32_t result = response.
GetS32(-2, 16);
3286 if (response.
GetChar() ==
',') {
3288 if (result_errno != -1)
3300 std::string path(file_spec.
GetPath(
false));
3321 stream.
Printf(
"vFile:close:%x", (
int)fd);
3330std::optional<GDBRemoteFStatData>
3333 stream.
Printf(
"vFile:fstat:%" PRIx64, fd);
3337 if (response.
GetChar() !=
'F')
3338 return std::nullopt;
3339 int64_t size = response.
GetS64(-1, 16);
3340 if (size > 0 && response.
GetChar() ==
';') {
3344 if (buffer.size() !=
sizeof(out))
3345 return std::nullopt;
3346 memcpy(&out, buffer.data(),
sizeof(out));
3351 return std::nullopt;
3354std::optional<GDBRemoteFStatData>
3359 return std::nullopt;
3360 std::optional<GDBRemoteFStatData> st =
FStat(fd);
3369 std::string path(file_spec.
GetPath(
false));
3379 if (response.
GetChar() !=
'F')
3388 std::optional<GDBRemoteFStatData> st =
Stat(file_spec);
3406 while (response.
Peek()) {
3408 while ((ch = response.
GetHexU8(0,
false)) !=
'\0')
3411 if (response.
GetChar() !=
',')
3419 uint32_t &file_permissions) {
3421 std::string path{file_spec.
GetPath(
false)};
3434 if (response.
GetChar() !=
'F') {
3436 "invalid response to '%s' packet", stream.
GetData());
3438 const uint32_t mode = response.
GetS32(-1, 16);
3439 if (
static_cast<int32_t
>(mode) == -1) {
3440 if (response.
GetChar() ==
',') {
3442 if (response_errno > 0)
3459 if (std::optional<GDBRemoteFStatData> st =
Stat(file_spec)) {
3467 uint64_t offset,
void *dst,
3471 stream.
Printf(
"vFile:pread:%x,%" PRIx64
",%" PRIx64, (
int)fd, dst_len,
3476 if (response.
GetChar() !=
'F')
3478 int64_t retcode = response.
GetS64(-1, 16);
3479 if (retcode == -1) {
3481 if (response.
GetChar() ==
',') {
3483 if (response_errno > 0)
3488 const char next = (response.
Peek() ? *response.
Peek() : 0);
3495 const uint64_t data_to_write =
3496 std::min<uint64_t>(dst_len, buffer.size());
3497 if (data_to_write > 0)
3498 memcpy(dst, &buffer[0], data_to_write);
3499 return data_to_write;
3512 stream.
Printf(
"vFile:pwrite:%x,%" PRIx64
",", (
int)fd, offset);
3517 if (response.
GetChar() !=
'F') {
3521 int64_t bytes_written = response.
GetS64(-1, 16);
3522 if (bytes_written == -1) {
3524 if (response.
GetChar() ==
',') {
3526 if (response_errno > 0)
3531 return bytes_written;
3540 std::string src_path{src.
GetPath(
false)}, dst_path{dst.
GetPath(
false)};
3552 if (response.
GetChar() ==
'F') {
3556 if (response.
GetChar() ==
',') {
3558 if (response_errno > 0)
3573 std::string path{file_spec.
GetPath(
false)};
3583 if (response.
GetChar() ==
'F') {
3587 if (response.
GetChar() ==
',') {
3589 if (response_errno > 0)
3607 std::string path(file_spec.
GetPath(
false));
3616 if (response.
GetChar() !=
'F')
3618 if (response.
GetChar() !=
',')
3620 bool retcode = (response.
GetChar() !=
'0');
3637 std::string path(file_spec.
GetPath(
false));
3644 if (response.
GetChar() !=
'F')
3645 return std::make_error_code(std::errc::illegal_byte_sequence);
3646 if (response.
GetChar() !=
',')
3647 return std::make_error_code(std::errc::illegal_byte_sequence);
3648 if (response.
Peek() && *response.
Peek() ==
'x')
3649 return std::make_error_code(std::errc::no_such_file_or_directory);
3666 const size_t MD5_HALF_LENGTH =
sizeof(uint64_t) * 2;
3671 if (part.size() != MD5_HALF_LENGTH)
3672 return std::make_error_code(std::errc::illegal_byte_sequence);
3676 if (part.getAsInteger(
BASE_16, low))
3677 return std::make_error_code(std::errc::illegal_byte_sequence);
3682 if (part.size() != MD5_HALF_LENGTH)
3683 return std::make_error_code(std::errc::illegal_byte_sequence);
3687 if (part.getAsInteger(
BASE_16, high))
3688 return std::make_error_code(std::errc::illegal_byte_sequence);
3690 llvm::MD5::MD5Result result;
3691 llvm::support::endian::write<uint64_t, llvm::endianness::little>(
3692 result.data(), low);
3693 llvm::support::endian::write<uint64_t, llvm::endianness::little>(
3694 result.data() + 8, high);
3698 return std::make_error_code(std::errc::operation_canceled);
3708 arch.
GetTriple().getVendor() == llvm::Triple::Apple &&
3709 arch.
GetTriple().getOS() == llvm::Triple::IOS &&
3710 (arch.
GetTriple().getArch() == llvm::Triple::aarch64 ||
3711 arch.
GetTriple().getArch() == llvm::Triple::aarch64_32)) {
3714 if (gdb_server_version != 0) {
3716 if (gdb_server_name && strcmp(gdb_server_name,
"debugserver") == 0) {
3717 if (gdb_server_version >= 310)
3730 payload.
Printf(
"p%x", reg);
3739 response.
GetHexBytes(buffer_sp->GetData(),
'\xcc');
3754 response.
GetHexBytes(buffer_sp->GetData(),
'\xcc');
3760 llvm::ArrayRef<uint8_t> data) {
3762 payload.
Printf(
"P%x=", reg_num);
3786 uint32_t &save_id) {
3802 const uint32_t response_save_id = response.
GetU32(0);
3803 if (response_save_id == 0)
3806 save_id = response_save_id;
3819 payload.
Printf(
"QRestoreRegisterState:%u", save_id);
3839 packet.
Printf(
"QSyncThreadState:%4.4" PRIx64
";", tid);
3845llvm::Expected<TraceSupportedResponse>
3850 escaped_packet.
PutCString(
"jLLDBTraceSupported");
3859 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3860 "jLLDBTraceSupported is unsupported");
3862 return llvm::json::parse<TraceSupportedResponse>(response.
Peek(),
3863 "TraceSupportedResponse");
3865 LLDB_LOG(log,
"failed to send packet: jLLDBTraceSupported");
3866 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3867 "failed to send packet: jLLDBTraceSupported");
3872 std::chrono::seconds timeout) {
3876 escaped_packet.
PutCString(
"jLLDBTraceStop:");
3878 std::string json_string;
3879 llvm::raw_string_ostream os(json_string);
3882 escaped_packet.
PutEscapedBytes(json_string.c_str(), json_string.size());
3891 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3892 "jLLDBTraceStop is unsupported");
3894 return llvm::Error::success();
3895 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3896 "Invalid jLLDBTraceStart response");
3898 LLDB_LOG(log,
"failed to send packet: jLLDBTraceStop");
3899 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3900 "failed to send packet: jLLDBTraceStop '%s'",
3906 std::chrono::seconds timeout) {
3910 escaped_packet.
PutCString(
"jLLDBTraceStart:");
3912 std::string json_string;
3913 llvm::raw_string_ostream os(json_string);
3916 escaped_packet.
PutEscapedBytes(json_string.c_str(), json_string.size());
3925 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3926 "jLLDBTraceStart is unsupported");
3928 return llvm::Error::success();
3929 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3930 "Invalid jLLDBTraceStart response");
3932 LLDB_LOG(log,
"failed to send packet: jLLDBTraceStart");
3933 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3934 "failed to send packet: jLLDBTraceStart '%s'",
3938llvm::Expected<std::string>
3940 std::chrono::seconds timeout) {
3944 escaped_packet.
PutCString(
"jLLDBTraceGetState:");
3946 std::string json_string;
3947 llvm::raw_string_ostream os(json_string);
3950 escaped_packet.
PutEscapedBytes(json_string.c_str(), json_string.size());
3959 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3960 "jLLDBTraceGetState is unsupported");
3961 return std::string(response.
Peek());
3964 LLDB_LOG(log,
"failed to send packet: jLLDBTraceGetState");
3965 return llvm::createStringError(
3966 llvm::inconvertibleErrorCode(),
3967 "failed to send packet: jLLDBTraceGetState '%s'",
3971llvm::Expected<std::vector<uint8_t>>
3977 escaped_packet.
PutCString(
"jLLDBTraceGetBinaryData:");
3979 std::string json_string;
3980 llvm::raw_string_ostream os(json_string);
3983 escaped_packet.
PutEscapedBytes(json_string.c_str(), json_string.size());
3993 return std::vector<uint8_t>(data.begin(), data.end());
3995 LLDB_LOG(log,
"failed to send packet: jLLDBTraceGetBinaryData");
3996 return llvm::createStringError(
3997 llvm::inconvertibleErrorCode(),
3998 "failed to send packet: jLLDBTraceGetBinaryData '%s'",
4006 return std::nullopt;
4008 return std::nullopt;
4012 const auto &GetOffset = [&] {
4014 if (ref.consumeInteger(16, offset))
4016 result.
offsets.push_back(offset);
4020 if (ref.consume_front(
"Text=")) {
4023 return std::nullopt;
4024 if (!ref.consume_front(
";Data=") || !GetOffset())
4025 return std::nullopt;
4028 if (ref.consume_front(
";Bss=") && GetOffset() && ref.empty())
4030 }
else if (ref.consume_front(
"TextSeg=")) {
4033 return std::nullopt;
4036 if (ref.consume_front(
";DataSeg=") && GetOffset() && ref.empty())
4039 return std::nullopt;
4048 std::string module_path = module_file_spec.
GetPath(
false);
4049 if (module_path.empty())
4056 const auto &triple = arch_spec.
GetTriple().getTriple();
4072 llvm::StringRef name;
4073 llvm::StringRef value;
4075 module_spec.
Clear();
4079 if (name ==
"uuid" || name ==
"md5") {
4084 }
else if (name ==
"triple") {
4089 }
else if (name ==
"file_offset") {
4091 if (!value.getAsInteger(
BASE_16, ival))
4093 }
else if (name ==
"file_size") {
4095 if (!value.getAsInteger(
BASE_16, ival))
4097 }
else if (name ==
"file_path") {
4108static std::optional<ModuleSpec>
4112 return std::nullopt;
4114 llvm::StringRef string;
4118 return std::nullopt;
4120 return std::nullopt;
4123 return std::nullopt;
4127 return std::nullopt;
4131 return std::nullopt;
4135 return std::nullopt;
4141std::optional<std::vector<ModuleSpec>>
4143 llvm::ArrayRef<FileSpec> module_file_specs,
const llvm::Triple &triple) {
4147 return std::nullopt;
4149 json::Array module_array;
4150 for (
const FileSpec &module_file_spec : module_file_specs) {
4151 module_array.push_back(
4152 json::Object{{
"file", module_file_spec.GetPath(
false)},
4153 {
"triple", triple.getTriple()}});
4156 unescaped_payload.
PutCString(
"jModulesInfo:");
4157 unescaped_payload.
AsRawOstream() << std::move(module_array);
4170 return std::nullopt;
4174 return std::nullopt;
4179 if (!response_object_sp)
4180 return std::nullopt;
4183 if (!response_array)
4184 return std::nullopt;
4186 std::vector<ModuleSpec> result;
4187 for (
size_t i = 0; i < response_array->
GetSize(); ++i) {
4190 result.push_back(*module_spec);
4200llvm::Expected<std::string>
4202 llvm::StringRef annex) {
4205 llvm::raw_string_ostream output_stream(output);
4219 std::string packet =
4220 (
"qXfer:" +
object +
":read:" + annex +
":" +
4221 llvm::Twine::utohexstr(offset) +
"," + llvm::Twine::utohexstr(size))
4229 return llvm::createStringError(llvm::inconvertibleErrorCode(),
4230 "Error sending $qXfer packet");
4248 return llvm::createStringError(
4249 llvm::inconvertibleErrorCode(),
4250 "Invalid continuation code from $qXfer packet");
4300 bool symbol_response_provided =
false;
4303 bool first_qsymbol_query =
true;
4314 if (symbol_response_provided || first_qsymbol_query) {
4321 first_qsymbol_query =
false;
4330 if (response_str.starts_with(
"qSymbol:")) {
4332 std::string symbol_name;
4334 if (symbol_name.empty())
4345 switch (sc.symbol->GetType()) {
4366 if (sc.module_sp->GetArchitecture()
4368 .getObjectFormat() !=
4369 llvm::Triple::ObjectFormatType::MachO) {
4374 sc.symbol->GetLoadAddress(&process->
GetTarget());
4376 symbol_load_addr = sc.symbol->GetRawValue();
4391 sc.symbol->GetLoadAddress(&process->
GetTarget());
4404 packet.
Printf(
"%" PRIx64, symbol_load_addr);
4405 symbol_response_provided =
true;
4407 symbol_response_provided =
false;
4423 "GDBRemoteCommunicationClient::%s: Didn't get sequence mutex.",
4448 "GDBRemoteCommunicationClient::%s(): "
4449 "QSupportedAsyncJSONPackets returned invalid "
4456 "GDBRemoteCommunicationClient::%s(): "
4457 "QSupportedAsyncJSONPackets unsupported",
4465 "GDBRemoteCommunicationClient::%s(): supported async "
4467 __FUNCTION__, stream.
GetData());
4477 llvm::ArrayRef<int32_t> signals) {
4480 auto range = llvm::make_range(signals.begin(), signals.end());
4481 std::string packet = formatv(
"QPassSignals:{0:$[;]@(x-2)}", range).str();
4493 "Unknown error happened during sending QPassSignals packet.");
4501 if (type_name.empty()) {
4514 config_sp->Dump(unescaped_stream);
4515 unescaped_stream.
Flush();
4533 "configuring StructuredData feature {0} failed with error {1}",
4539 "configuring StructuredData feature {0} failed when sending packet: "
4541 type_name, (
int)result);
4570 return llvm::createStringError(llvm::inconvertibleErrorCode(),
4571 "failed to send k packet");
4573 char packet_cmd = response.
GetChar(0);
4574 if (packet_cmd ==
'W' || packet_cmd ==
'X')
4577 return llvm::createStringError(llvm::inconvertibleErrorCode(),
4578 "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
std::optional< LLDBSettings > GetLLDBSettings()
Return LLDB-specific settings for this GDB-remote process.
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_lldb_settings
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
std::optional< LLDBSettings > m_lldb_settings
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.