71#include "llvm/ADT/ScopeExit.h"
72#include "llvm/ADT/SetVector.h"
73#include "llvm/Support/ErrorExtras.h"
74#include "llvm/Support/ThreadPool.h"
86struct ExecutableInstaller {
89 : m_platform{platform}, m_module{module},
90 m_local_file{m_module->GetFileSpec()},
91 m_remote_file{m_module->GetRemoteInstallFileSpec()} {}
93 void setupRemoteFile()
const { m_module->SetPlatformFileSpec(m_remote_file); }
97 const FileSpec m_local_file;
98 const FileSpec m_remote_file;
101struct MainExecutableInstaller {
104 ProcessLaunchInfo &launch_info)
105 : m_platform{platform}, m_module{module},
106 m_local_file{m_module->GetFileSpec()},
108 getRemoteFileSpec(m_platform, target, m_module, m_local_file)},
109 m_launch_info{launch_info} {}
111 void setupRemoteFile()
const {
112 m_module->SetPlatformFileSpec(m_remote_file);
115 m_platform->SetFilePermissions(m_remote_file, 0700 );
120 const FileSpec m_local_file;
121 const FileSpec m_remote_file;
126 const FileSpec &local_file) {
127 FileSpec remote_file =
module->GetRemoteInstallFileSpec();
128 if (remote_file || !target->GetAutoInstallMainExecutable())
134 remote_file = platform->GetRemoteWorkingDirectory();
140 ProcessLaunchInfo &m_launch_info;
146template <
typename Installer>
148 if (!installer.m_local_file || !installer.m_remote_file)
151 Status error = installer.m_platform->Install(installer.m_local_file,
152 installer.m_remote_file);
156 installer.setupRemoteFile();
171 static constexpr llvm::StringLiteral class_name(
"lldb.target");
203 static_cast<void *
>(
this));
206 "Target::Target created with architecture {0} ({1})",
208 target_arch.
GetTriple().getTriple().c_str());
216 LLDB_LOG(log,
"{0} Target::~Target()",
static_cast<void *
>(
this));
226 if (breakpoint_sp->IsInternal())
271 std::unique_lock<std::recursive_mutex> lock;
302 llvm::StringRef plugin_name,
309 listener_sp, crash_file, can_connect);
316 const char *repl_options,
bool can_create) {
324 language = *single_lang;
325 }
else if (repl_languages.
Empty()) {
327 "LLDB isn't configured with REPL support for any languages.");
331 "Multiple possible REPL languages. Please specify a language.");
336 REPLMap::iterator pos =
m_repl_map.find(language);
344 "Couldn't find an existing REPL for %s, and can't create a new one",
359 "Couldn't create a REPL for %s",
373 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
380 const bool notify =
false;
404 return abi_sp->GetPluginName();
437 shared_lib_filter.
Append(main_module_sp->GetFileSpec());
438 llvm::SetVector<std::string, std::vector<std::string>,
439 std::unordered_set<std::string>>
448 if (!entryPointName.empty())
449 entryPointNamesSet.insert(entryPointName);
451 if (entryPointNamesSet.empty()) {
457 nullptr, entryPointNamesSet.takeVector(),
458 eFunctionNameTypeFull,
468 bp_sp->SetOneShot(
true);
475 const std::unordered_set<std::string> &function_names,
479 containingModules, source_file_spec_list));
483 nullptr, std::move(source_regex), function_names,
484 !
static_cast<bool>(move_to_nearest_code)));
490 const FileSpec &file, uint32_t line_no,
493 LazyBool skip_prologue,
bool internal,
497 std::optional<llvm::StringRef> removed_prefix_opt =
499 if (!removed_prefix_opt)
500 remapped_file = file;
504 switch (inline_strategy) {
525 compile_unit_list.
Append(remapped_file);
538 !
static_cast<bool>(move_to_nearest_code));
543 nullptr, offset, skip_prologue, location_spec, removed_prefix_opt));
570 std::make_shared<SearchFilterForUnconstrainedSearches>(
573 std::make_shared<BreakpointResolverAddress>(
nullptr, addr);
580 bool request_hardware) {
582 std::make_shared<SearchFilterForUnconstrainedSearches>(
585 std::make_shared<BreakpointResolverAddress>(
nullptr,
Address(file_addr),
593 const FileSpecList *containingSourceFiles,
const char *func_name,
594 FunctionNameType func_name_type_mask,
LanguageType language,
596 bool internal,
bool hardware) {
600 containingModules, containingSourceFiles));
609 offset, offset_is_insn_count, skip_prologue));
618 const std::vector<std::string> &func_names,
619 FunctionNameType func_name_type_mask,
621 LazyBool skip_prologue,
bool internal,
bool hardware) {
623 size_t num_names = func_names.size();
626 containingModules, containingSourceFiles));
634 new BreakpointResolverName(
nullptr, func_names, func_name_type_mask,
635 language, offset, skip_prologue));
644 const char *func_names[],
size_t num_names,
645 FunctionNameType func_name_type_mask,
647 LazyBool skip_prologue,
bool internal,
bool hardware) {
651 containingModules, containingSourceFiles));
663 nullptr, func_names, num_names, func_name_type_mask, language, offset,
665 resolver_sp->SetOffset(offset);
674 if (containingModule !=
nullptr) {
677 filter_sp = std::make_shared<SearchFilterByModule>(shared_from_this(),
682 std::make_shared<SearchFilterForUnconstrainedSearches>(
692 if (containingModules && containingModules->
GetSize() != 0) {
695 filter_sp = std::make_shared<SearchFilterByModuleList>(shared_from_this(),
700 std::make_shared<SearchFilterForUnconstrainedSearches>(
710 if (containingSourceFiles ==
nullptr || containingSourceFiles->
GetSize() == 0)
714 if (containingModules ==
nullptr) {
718 filter_sp = std::make_shared<SearchFilterByModuleListAndCU>(
719 shared_from_this(),
FileSpecList(), *containingSourceFiles);
721 filter_sp = std::make_shared<SearchFilterByModuleListAndCU>(
722 shared_from_this(), *containingModules, *containingSourceFiles);
731 bool internal,
bool hardware) {
733 containingModules, containingSourceFiles));
736 :
static_cast<bool>(skip_prologue);
738 nullptr, std::move(func_regex), requested_language, 0,
skip));
745 bool catch_bp,
bool throw_bp,
bool internal,
748 *
this, language, catch_bp, throw_bp, internal);
749 if (exc_bkpt_sp && additional_args) {
751 if (precondition_sp && additional_args) {
753 *
error = precondition_sp->ConfigurePrecondition(*additional_args);
755 precondition_sp->ConfigurePrecondition(*additional_args);
762 const llvm::StringRef class_name,
const FileSpecList *containingModules,
763 const FileSpecList *containingSourceFiles,
bool internal,
770 containingSourceFiles && containingSourceFiles->
GetSize() > 0;
771 bool has_modules = containingModules && containingModules->
GetSize() > 0;
773 if (has_files && has_modules) {
775 containingSourceFiles);
776 }
else if (has_files) {
779 }
else if (has_modules) {
782 filter_sp = std::make_shared<SearchFilterForUnconstrainedSearches>(
793 bool internal,
bool request_hardware,
794 bool resolve_indirect_symbols) {
796 if (filter_sp && resolver_sp) {
798 bp_sp.reset(
new Breakpoint(*
this, filter_sp, resolver_sp, hardware,
799 resolve_indirect_symbols));
800 resolver_sp->SetBreakpoint(bp_sp);
818 LLDB_LOGF(log,
"Target::%s (internal = %s) => break_id = %s\n",
819 __FUNCTION__, bp_sp->IsInternal() ?
"yes" :
"no", s.
GetData());
822 bp_sp->ResolveBreakpoint();
853 bp_sp->AddName(name);
858 std::make_pair(bp_name->GetName(), std::move(bp_name)));
864 if (!
error.Success())
869 return iter->second.get();
874 "Breakpoint name \"%s\" doesn't exist and "
875 "can_create is false.",
881 .insert(std::make_pair(name, std::make_unique<BreakpointName>(name)))
882 .first->second.get();
889 const char *name_cstr = name.
AsCString();
892 bp_sp->RemoveName(name_cstr);
910 llvm::Expected<std::vector<BreakpointSP>> expected_vector =
913 if (!expected_vector) {
915 llvm::toString(expected_vector.takeError()));
919 for (
auto bp_sp : *expected_vector)
926 names.push_back(bp_name_entry.first.GetString());
936 std::optional<uint32_t> num_supported_hardware_watchpoints =
941 if (!num_supported_hardware_watchpoints)
944 if (*num_supported_hardware_watchpoints == 0) {
946 "Target supports (%u) hardware watchpoint slots.\n",
947 *num_supported_hardware_watchpoints);
960 "Target::%s (addr = 0x%8.8" PRIx64
" size = %" PRIu64
962 __FUNCTION__, addr, (uint64_t)size, kind);
973 "cannot set a watchpoint with watch_size of 0");
976 "invalid watch address: %" PRIu64, addr);
992 const bool notify =
false;
997 addr = abi->FixDataAddress(addr);
1011 std::unique_lock<std::recursive_mutex> lock;
1015 size_t old_size = matched_sp->GetByteSize();
1021 if (size == old_size && kind == old_type) {
1023 wp_sp->SetEnabled(
false, notify);
1032 wp_sp = std::make_shared<Watchpoint>(*
this, addr, size, type);
1033 wp_sp->SetWatchpointType(kind, notify);
1038 LLDB_LOGF(log,
"Target::%s (creation of watchpoint %s with id = %u)\n",
1039 __FUNCTION__,
error.Success() ?
"succeeded" :
"failed",
1054 LLDB_LOGF(log,
"Target::%s \n", __FUNCTION__);
1063 LLDB_LOGF(log,
"Target::%s (internal_also = %s)\n", __FUNCTION__,
1064 internal_also ?
"yes" :
"no");
1075 LLDB_LOGF(log,
"Target::%s (internal_also = %s)\n", __FUNCTION__,
1076 internal_also ?
"yes" :
"no");
1085 LLDB_LOGF(log,
"Target::%s", __FUNCTION__);
1092 LLDB_LOGF(log,
"Target::%s (internal_also = %s)\n", __FUNCTION__,
1093 internal_also ?
"yes" :
"no");
1102 LLDB_LOGF(log,
"Target::%s", __FUNCTION__);
1109 LLDB_LOGF(log,
"Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
1129 LLDB_LOGF(log,
"Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
1139 bp_sp->SetEnabled(
false);
1147 LLDB_LOGF(log,
"Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
1158 bp_sp->SetEnabled(
true);
1178 std::string path(file.
GetPath());
1186 if (
error.Success()) {
1187 break_store_ptr = input_data_sp->GetAsArray();
1188 if (!break_store_ptr) {
1190 "Tried to append to invalid input file %s", path.c_str());
1196 if (!break_store_ptr) {
1197 break_store_sp = std::make_shared<StructuredData::Array>();
1198 break_store_ptr = break_store_sp.get();
1205 lldb::eFilePermissionsFileDefault);
1212 std::unique_lock<std::recursive_mutex> lock;
1218 size_t num_breakpoints = breakpoints.
GetSize();
1219 for (
size_t i = 0; i < num_breakpoints; i++) {
1224 break_store_ptr->
AddItem(bkpt_save_sp);
1228 std::unordered_set<lldb::break_id_t> processed_bkpts;
1229 const size_t count = bp_ids.
GetSize();
1230 for (
size_t i = 0; i < count; ++i) {
1236 std::pair<std::unordered_set<lldb::break_id_t>::iterator,
bool>
1237 insert_result = processed_bkpts.insert(bp_id);
1238 if (!insert_result.second)
1245 if (!bkpt_save_sp) {
1247 "Unable to serialize breakpoint %d", bp_id);
1250 break_store_ptr->
AddItem(bkpt_save_sp);
1255 break_store_ptr->
Dump(out_file,
false);
1262 std::vector<std::string> no_names;
1267 std::vector<std::string> &names,
1269 std::unique_lock<std::recursive_mutex> lock;
1275 if (!
error.Success()) {
1277 }
else if (!input_data_sp || !input_data_sp->IsValid()) {
1279 "Invalid JSON from input file: %s.", file.
GetPath().c_str());
1286 "Invalid breakpoint data from input file: %s.", file.
GetPath().c_str());
1290 size_t num_bkpts = bkpt_array->
GetSize();
1291 size_t num_names = names.size();
1293 for (
size_t i = 0; i < num_bkpts; i++) {
1299 "Invalid breakpoint data for element %zu from input file: %s.", i,
1310 shared_from_this(), bkpt_data_sp,
error);
1311 if (!
error.Success()) {
1313 "Error restoring breakpoint %zu from %s: %s.", i,
1329 LLDB_LOGF(log,
"Target::%s\n", __FUNCTION__);
1358 LLDB_LOGF(log,
"Target::%s\n", __FUNCTION__);
1385 LLDB_LOGF(log,
"Target::%s\n", __FUNCTION__);
1411 LLDB_LOGF(log,
"Target::%s\n", __FUNCTION__);
1417 wp_sp->ResetHitCount();
1425 LLDB_LOGF(log,
"Target::%s\n", __FUNCTION__);
1431 wp_sp->ResetHistoricValues();
1440 LLDB_LOGF(log,
"Target::%s\n", __FUNCTION__);
1449 wp_sp->SetIgnoreCount(ignore_count);
1457 LLDB_LOGF(log,
"Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1476 LLDB_LOGF(log,
"Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1495 LLDB_LOGF(log,
"Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1510 uint32_t ignore_count) {
1512 LLDB_LOGF(log,
"Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1519 wp_sp->SetIgnoreCount(ignore_count);
1526 std::lock_guard<std::recursive_mutex> lock(
m_images.GetMutex());
1538 return m_images.GetModuleAtIndex(0);
1565 if (executable_sp) {
1568 pid = proc->GetID();
1572 info->
uuid = executable_sp->GetUUID();
1574 info->
triple = executable_sp->GetArchitecture().GetTriple().getTriple();
1580 info->
uuid = executable_sp->GetUUID();
1586 executable_sp->GetFileSpec().GetPath().c_str());
1588 const bool notify =
true;
1594 if (!
m_arch.GetSpec().IsValid()) {
1595 m_arch = executable_sp->GetArchitecture();
1597 "Target::SetExecutableModule setting architecture to {0} ({1}) "
1598 "based on executable file",
1599 m_arch.GetSpec().GetArchitectureName(),
1600 m_arch.GetSpec().GetTriple().getTriple());
1603 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
1604 bool load_dependents =
true;
1605 switch (load_dependent_files) {
1607 load_dependents = executable_sp->IsExecutable();
1610 load_dependents =
true;
1613 load_dependents =
false;
1617 if (executable_objfile && load_dependents) {
1620 std::mutex dependent_files_mutex;
1625 auto GetDependentModules = [&](
FileSpec dependent_file_spec) {
1626 FileSpec platform_dependent_file_spec;
1628 m_platform_sp->GetFileWithUUID(dependent_file_spec,
nullptr,
1629 platform_dependent_file_spec);
1631 platform_dependent_file_spec = dependent_file_spec;
1636 if (image_module_sp) {
1638 ObjectFile *objfile = image_module_sp->GetObjectFile();
1644 std::lock_guard<std::mutex> guard(dependent_files_mutex);
1645 dependent_files_copy = dependent_files;
1650 const size_t previous_dependent_files =
1651 dependent_files_copy.
GetSize();
1656 std::lock_guard<std::mutex> guard(dependent_files_mutex);
1657 for (
size_t i = previous_dependent_files;
1658 i < dependent_files_copy.
GetSize(); ++i)
1669 for (uint32_t i = 0; i < dependent_files.
GetSize(); i++) {
1675 std::lock_guard<std::mutex> guard(dependent_files_mutex);
1676 for (; i < dependent_files.
GetSize(); i++)
1677 task_group.async(GetDependentModules,
1690 bool missing_local_arch = !
m_arch.GetSpec().IsValid();
1691 bool replace_local_arch =
true;
1692 bool compatible_local_arch =
false;
1701 if (!platform_sp || !platform_sp->IsCompatibleArchitecture(
1705 GetDebugger().GetPlatformList().GetOrCreate(other, {},
1707 arch_platform_sp->SetLocateModuleCallback(
1708 platform_sp->GetLocateModuleCallback());
1711 other = platform_arch;
1717 if (!missing_local_arch) {
1718 if (merge &&
m_arch.GetSpec().IsCompatibleMatch(arch_spec)) {
1721 if (
m_arch.GetSpec().IsCompatibleMatch(other)) {
1722 compatible_local_arch =
true;
1725 replace_local_arch =
false;
1730 if (compatible_local_arch || missing_local_arch) {
1734 if (replace_local_arch)
1737 "Target::SetArchitecture merging compatible arch; arch "
1739 m_arch.GetSpec().GetArchitectureName(),
1740 m_arch.GetSpec().GetTriple().getTriple());
1748 "Target::SetArchitecture changing architecture to %s (%s) from %s (%s)",
1750 arch_spec.
GetTriple().getTriple().c_str(),
1751 m_arch.GetSpec().GetArchitectureName(),
1752 m_arch.GetSpec().GetTriple().getTriple().c_str());
1759 if (executable_sp) {
1761 "Target::SetArchitecture Trying to select executable file "
1762 "architecture %s (%s)",
1764 arch_spec.
GetTriple().getTriple().c_str());
1765 ModuleSpec module_spec(executable_sp->GetFileSpec(), other);
1766 module_spec.
SetTarget(shared_from_this());
1770 if (!
error.Fail() && executable_sp) {
1781 if (
m_arch.GetSpec().IsCompatibleMatch(arch_spec)) {
1786 "Target::MergeArchitecture target has arch %s, merging with "
1788 m_arch.GetSpec().GetTriple().getTriple().c_str(),
1789 arch_spec.
GetTriple().getTriple().c_str());
1810 my_module_list.
Append(module_sp);
1820 my_module_list.
Append(module_sp);
1833 old_module_sp, new_module_sp);
1845 const size_t num_images = module_list.
GetSize();
1847 std::list<Status> errors;
1849 for (
const auto &err : errors)
1852 for (
size_t idx = 0; idx < num_images; ++idx) {
1863 std::make_shared<TargetEventData>(shared_from_this(), module_list);
1872 runtime->SymbolsDidLoad(module_list);
1879 std::make_shared<TargetEventData>(shared_from_this(), module_list);
1888 std::make_shared<TargetEventData>(shared_from_this(), module_list);
1902 const bool should_flush_type_systems =
1904 auto *object_file =
module.GetObjectFile();
1909 auto type = object_file->GetType();
1913 return module.FileHasChanged() &&
1914 (type == ObjectFile::eTypeObjectFile ||
1915 type == ObjectFile::eTypeExecutable ||
1916 type == ObjectFile::eTypeSharedLibrary);
1919 if (should_flush_type_systems)
1925 const FileSpec &module_file_spec) {
1930 size_t num_modules = matchingModules.
GetSize();
1934 if (num_modules > 0) {
1935 for (
size_t i = 0; i < num_modules; i++) {
1950 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches(*
this,
1962 if (section_sp->IsEncrypted()) {
1966 ModuleSP module_sp(section_sp->GetModule());
1968 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1971 section_sp.get(), addr.
GetOffset(), dst, dst_len);
1976 "error reading data from section %s",
1977 section_sp->GetName().GetCString());
1984 "address doesn't contain a section that points to a "
1985 "section in a object file");
1993 bool *did_read_live_memory) {
1995 if (did_read_live_memory)
1996 *did_read_live_memory =
false;
2009 size_t bytes_read = 0;
2016 if (section_load_list.
IsEmpty()) {
2022 m_images.ResolveFileAddress(file_addr, resolved_addr);
2035 resolved_addr = fixed_addr;
2040 std::unique_ptr<uint8_t[]> file_cache_read_buffer;
2041 size_t file_cache_bytes_read = 0;
2047 auto permissions =
Flags(section_sp->GetPermissions());
2048 bool is_readonly = !permissions.Test(ePermissionsWritable) &&
2049 permissions.Test(ePermissionsReadable);
2051 file_cache_bytes_read =
2053 if (file_cache_bytes_read == dst_len)
2054 return file_cache_bytes_read;
2055 else if (file_cache_bytes_read > 0) {
2056 file_cache_read_buffer =
2057 std::make_unique<uint8_t[]>(file_cache_bytes_read);
2058 std::memcpy(file_cache_read_buffer.get(), dst, file_cache_bytes_read);
2070 if (addr_module_sp && addr_module_sp->GetFileSpec())
2072 "{0:F}[{1:x+}] can't be resolved, {0:F} is not currently loaded",
2076 "0x%" PRIx64
" can't be resolved", resolved_addr.
GetFileAddress());
2079 if (bytes_read != dst_len) {
2080 if (
error.Success()) {
2081 if (bytes_read == 0)
2083 "read memory from 0x%" PRIx64
" failed", load_addr);
2086 "only %" PRIu64
" of %" PRIu64
2087 " bytes were read from memory at 0x%" PRIx64,
2088 (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
2093 *load_addr_ptr = load_addr;
2094 if (did_read_live_memory)
2095 *did_read_live_memory =
true;
2101 if (file_cache_read_buffer && file_cache_bytes_read > 0) {
2104 std::memcpy(dst, file_cache_read_buffer.get(), file_cache_bytes_read);
2105 return file_cache_bytes_read;
2127 out_str.append(buf, length);
2130 if (length ==
sizeof(buf) - 1)
2131 curr_addr += length;
2136 return out_str.size();
2140 size_t dst_max_len,
Status &result_error,
2141 bool force_live_memory) {
2142 size_t total_cstr_len = 0;
2143 if (dst && dst_max_len) {
2144 result_error.
Clear();
2146 memset(dst, 0, dst_max_len);
2153 const size_t cache_line_size = 512;
2155 size_t bytes_left = dst_max_len - 1;
2156 char *curr_dst = dst;
2158 while (bytes_left > 0) {
2159 addr_t cache_line_bytes_left =
2160 cache_line_size - (curr_addr % cache_line_size);
2162 std::min<addr_t>(bytes_left, cache_line_bytes_left);
2164 size_t bytes_read =
ReadMemory(address, curr_dst, bytes_to_read,
error,
2167 if (bytes_read == 0) {
2168 result_error = std::move(
error);
2169 dst[total_cstr_len] =
'\0';
2172 const size_t len = strlen(curr_dst);
2174 total_cstr_len += len;
2176 if (len < bytes_to_read)
2179 curr_dst += bytes_read;
2180 curr_addr += bytes_read;
2181 bytes_left -= bytes_read;
2188 result_error.
Clear();
2190 return total_cstr_len;
2198 return cache_line_size - (load_addr % cache_line_size);
2208 size_t type_width,
bool force_live_memory) {
2209 if (!dst || !max_bytes || !type_width || max_bytes < type_width)
2212 size_t total_bytes_read = 0;
2216 memset(dst, 0, max_bytes);
2217 size_t bytes_left = max_bytes - type_width;
2219 const char terminator[4] = {
'\0',
'\0',
'\0',
'\0'};
2220 assert(
sizeof(terminator) >= type_width &&
"Attempting to validate a "
2221 "string with more than 4 bytes "
2225 char *curr_dst = dst;
2228 while (bytes_left > 0 &&
error.Success()) {
2232 ReadMemory(address, curr_dst, bytes_to_read,
error, force_live_memory);
2234 if (bytes_read == 0)
2239 size_t aligned_start = total_bytes_read - total_bytes_read % type_width;
2240 for (
size_t i = aligned_start;
2241 i + type_width <= total_bytes_read + bytes_read; i += type_width)
2242 if (::memcmp(&dst[i], terminator, type_width) == 0) {
2247 total_bytes_read += bytes_read;
2248 curr_dst += bytes_read;
2249 address.
Slide(bytes_read);
2250 bytes_left -= bytes_read;
2252 return total_bytes_read;
2256 bool is_signed,
Scalar &scalar,
2258 bool force_live_memory) {
2261 if (byte_size <=
sizeof(uval)) {
2264 if (bytes_read == byte_size) {
2266 m_arch.GetSpec().GetAddressByteSize());
2269 scalar = data.
GetMaxU32(&offset, byte_size);
2271 scalar = data.
GetMaxU64(&offset, byte_size);
2281 "byte size of %u is too large for integer scalar type", byte_size);
2287 size_t integer_byte_size,
2289 bool force_live_memory) {
2298 size_t integer_byte_size,
2300 bool force_live_memory) {
2310 bool force_live_memory) {
2313 false, scalar,
error, force_live_memory)) {
2317 if (section_load_list.
IsEmpty()) {
2320 m_images.ResolveFileAddress(pointer_vm_addr, pointer_addr);
2331 pointer_addr.
SetOffset(pointer_vm_addr);
2339 bool notify,
Status *error_ptr) {
2346 module_spec.
SetTarget(shared_from_this());
2348 if (std::optional<FileSpec> remapped_obj_file =
2359 module_sp =
m_images.FindFirstModule(module_spec);
2362 llvm::SmallVector<ModuleSP, 1>
2365 bool did_create_module =
false;
2375 module_spec, module_sp, symbol_file_spec, &did_create_module);
2405 transformed_spec.
SetTarget(shared_from_this());
2407 &old_modules, &did_create_module);
2424 &old_modules, &did_create_module);
2432 module_spec,
m_process_sp.get(), module_sp, &old_modules,
2433 &did_create_module);
2444 ObjectFile *objfile = module_sp->GetObjectFile();
2460 "debug info files aren't valid target "
2461 "modules, please specify an executable");
2468 "stub libraries aren't valid target "
2469 "modules, please specify an executable");
2474 "unsupported file type, please specify an executable");
2493 m_images.FindModules(module_spec_copy, found_modules);
2495 old_modules.push_back(found_module);
2502 if (symbol_file_spec)
2503 module_sp->SetSymbolFileFileSpec(symbol_file_spec);
2505 llvm::SmallVector<ModuleSP, 1> replaced_modules;
2506 for (
ModuleSP &old_module_sp : old_modules) {
2507 if (
m_images.GetIndexForModule(old_module_sp.get()) !=
2509 if (replaced_modules.empty())
2510 m_images.ReplaceModule(old_module_sp, module_sp);
2514 replaced_modules.push_back(std::move(old_module_sp));
2518 if (replaced_modules.size() > 1) {
2531 auto dump = [&message](
Module &dump_module) ->
void {
2532 UUID dump_uuid = dump_module.GetUUID();
2536 message <<
" (uuid ";
2539 dump_uuid.
Dump(message);
2541 message <<
"not specified";
2546 message <<
"New module ";
2549 << llvm::formatv(
" simultaneously replaced {0} old modules: ",
2550 replaced_modules.size());
2551 for (
ModuleSP &replaced_module_sp : replaced_modules)
2552 dump(*replaced_module_sp);
2558 if (replaced_modules.empty())
2559 m_images.Append(module_sp, notify);
2561 for (
ModuleSP &old_module_sp : replaced_modules) {
2562 auto old_module_wp = old_module_sp->weak_from_this();
2563 old_module_sp.reset();
2571 *error_ptr = std::move(
error);
2600llvm::Expected<lldb::TypeSystemSP>
2602 bool create_on_demand) {
2604 return llvm::createStringError(
"Invalid Target");
2617 if (languages_for_expressions.
Empty())
2618 return llvm::createStringError(
2619 "No expression support for any languages");
2630 uint32_t byte_size) {
2637std::vector<lldb::TypeSystemSP>
2645 std::vector<lldb::TypeSystemSP> scratch_type_systems;
2650 for (
auto bit : languages_for_expressions.
bitvector.set_bits()) {
2652 auto type_system_or_err =
2654 if (!type_system_or_err)
2657 "Language '{1}' has expression support but no scratch type "
2658 "system available: {0}",
2661 if (
auto ts = *type_system_or_err)
2662 scratch_type_systems.push_back(ts);
2665 std::sort(scratch_type_systems.begin(), scratch_type_systems.end());
2666 scratch_type_systems.erase(llvm::unique(scratch_type_systems),
2667 scratch_type_systems.end());
2668 return scratch_type_systems;
2675 if (
auto err = type_system_or_err.takeError()) {
2678 "Unable to get persistent expression state for language {1}: {0}",
2683 if (
auto ts = *type_system_or_err)
2684 return ts->GetPersistentExpressionState();
2687 "Unable to get persistent expression state for language {1}: {0}",
2693 llvm::StringRef expr, llvm::StringRef prefix,
SourceLanguage language,
2697 auto type_system_or_err =
2699 if (
auto err = type_system_or_err.takeError()) {
2701 "Could not find type system for language %s: %s",
2703 llvm::toString(std::move(err)).c_str());
2707 auto ts = *type_system_or_err;
2710 "Type system for language %s is no longer live",
2715 auto *user_expr = ts->GetUserExpression(expr, prefix, language, desired_type,
2719 "Could not create an expression for language %s",
2730 if (
auto err = type_system_or_err.takeError()) {
2732 "Could not find type system for language %s: %s",
2734 llvm::toString(std::move(err)).c_str());
2737 auto ts = *type_system_or_err;
2740 "Type system for language %s is no longer live",
2744 auto *persistent_fn = ts->GetFunctionCaller(return_type, function_address,
2745 arg_value_list, name);
2748 "Could not create an expression for language %s",
2751 return persistent_fn;
2754llvm::Expected<std::unique_ptr<UtilityFunction>>
2759 if (!type_system_or_err)
2760 return type_system_or_err.takeError();
2761 auto ts = *type_system_or_err;
2763 return llvm::createStringError(
2764 llvm::StringRef(
"Type system for language ") +
2766 llvm::StringRef(
" is no longer live"));
2767 std::unique_ptr<UtilityFunction> utility_fn =
2768 ts->CreateUtilityFunction(std::move(expression), std::move(name));
2770 return llvm::createStringError(
2771 llvm::StringRef(
"Could not create an expression for language") +
2775 if (!utility_fn->Install(diagnostics, exe_ctx))
2777 "Could not install utility function:");
2779 return std::move(utility_fn);
2800 "setting target's default architecture to {0} ({1})",
2807 if (llvm::to_integer(label, n))
2808 return llvm::createStringError(
"Cannot use integer as target label.");
2812 if (target_sp && target_sp->GetLabel() == label) {
2813 return llvm::createStringErrorV(
2814 "Cannot use label '{0}' since it's set in target #{1}.", label, i);
2819 return llvm::Error::success();
2828 Target *target =
nullptr;
2829 if (sc_ptr !=
nullptr)
2831 if (target ==
nullptr && exe_ctx_ptr)
2841 result_valobj_sp.reset();
2846 m_stats.GetExpressionStats().NotifyFailure();
2847 return execution_results;
2853 llvm::scope_exit on_exit([
this, old_suppress_value]() {
2871 if (expr[0] ==
'$') {
2872 auto type_system_or_err =
2874 if (
auto err = type_system_or_err.takeError()) {
2876 "Unable to get scratch type system");
2878 auto ts = *type_system_or_err;
2881 "Scratch type system is no longer live: {0}");
2884 ts->GetPersistentExpressionState()->GetVariable(expr);
2887 if (persistent_var_sp) {
2888 result_valobj_sp = persistent_var_sp->GetValueObject();
2895 if (
ThreadSP thread_sp = exe_ctx.GetThreadSP()) {
2896 if (thread_sp->IsAnyProviderActive()) {
2904 result_valobj_sp, fixed_expression, ctx_obj);
2908 m_stats.GetExpressionStats().NotifySuccess();
2910 m_stats.GetExpressionStats().NotifyFailure();
2911 return execution_results;
2917 [name, &variable_sp](
TypeSystemSP type_system) ->
bool {
2918 auto ts = type_system.get();
2922 ts->GetPersistentExpressionState()) {
2923 variable_sp = persistent_state->GetVariable(name);
2938 auto ts = type_system.get();
2943 ts->GetPersistentExpressionState()) {
2944 address = persistent_state->LookupSymbol(name);
2957 const bool has_primary_executable = exe_module && exe_module->
GetObjectFile();
2958 if (has_primary_executable) {
2965 const size_t num_images = modules.
GetSize();
2966 for (
size_t idx = 0; idx < num_images; ++idx) {
2968 if (!module_sp || !module_sp->GetObjectFile())
2971 Address entry_addr = module_sp->GetObjectFile()->GetEntryPointAddress();
2977 if (!has_primary_executable)
2978 return llvm::createStringError(
2979 "No primary executable found and could not find entry point address in "
2980 "any executable module");
2982 return llvm::createStringError(
2983 "Could not find entry point address for primary executable module \"" +
2991 ? arch_plugin->GetCallableLoadAddress(load_addr, addr_class)
2998 return arch_plugin ? arch_plugin->GetOpcodeLoadAddress(load_addr, addr_class)
3004 return arch_plugin ? arch_plugin->GetBreakableLoadAddress(addr, *
this) : addr;
3007llvm::Expected<lldb::DisassemblerSP>
3009 const char *flavor_string) {
3011 bool force_live_memory =
true;
3014 const size_t bytes_read =
3016 force_live_memory, &load_addr);
3019 return llvm::createStringError(
3020 error.AsCString(
"Target::ReadInstructions failed to read memory at %s"),
3024 if (!flavor_string || flavor_string[0] ==
'\0') {
3029 if (arch == llvm::Triple::x86 || arch == llvm::Triple::x86_64)
3057 stop_hook_sp.reset(
new StopHookCoded(shared_from_this(), new_uid));
3064 return stop_hook_sp;
3076 return (num_removed != 0);
3084 StopHookCollection::iterator specified_hook_iter;
3087 found_hook = (*specified_hook_iter).second;
3092 bool active_state) {
3093 StopHookCollection::iterator specified_hook_iter;
3098 (*specified_hook_iter).second->SetIsActive(active_state);
3103 StopHookCollection::iterator pos, end =
m_stop_hooks.end();
3105 (*pos).second->SetIsActive(active_state);
3114const std::vector<Target::StopHookSP>
3119 std::vector<StopHookSP> stop_hooks;
3121 stop_hooks.push_back(hook);
3139 auto is_active = [at_initial_stop](
StopHookSP hook) {
3140 bool should_run_now = (!at_initial_stop || hook->GetRunAtInitialStop());
3141 return hook->IsActive() && should_run_now;
3145 std::vector<StopHookSP> active_hooks;
3149 if (is_active(hook))
3150 active_hooks.push_back(hook);
3152 if (active_hooks.empty())
3161 uint32_t last_natural_stop =
m_process_sp->GetModIDRef().GetLastNaturalStopID();
3167 std::vector<ExecutionContext> exc_ctx_with_reasons;
3170 size_t num_threads = cur_threadlist.
GetSize();
3171 for (
size_t i = 0; i < num_threads; i++) {
3173 if (cur_thread_sp->ThreadStoppedForAReason()) {
3175 exc_ctx_with_reasons.emplace_back(
m_process_sp.get(), cur_thread_sp.get(),
3176 cur_frame_sp.get());
3185 size_t num_exe_ctx = exc_ctx_with_reasons.size();
3186 if (num_exe_ctx == 0) {
3187 if (at_initial_stop && num_threads > 0) {
3189 exc_ctx_with_reasons.emplace_back(
3191 thread_to_use_sp->GetStackFrameAtIndex(0).get());
3199 llvm::scope_exit on_exit([output_sp] { output_sp->Flush(); });
3201 size_t num_hooks_with_output = llvm::count_if(
3202 active_hooks, [](
auto h) {
return !h->GetSuppressOutput(); });
3203 bool print_hook_header = (num_hooks_with_output > 1);
3204 bool print_thread_header = (num_exe_ctx > 1);
3205 bool should_stop =
false;
3206 bool requested_continue =
false;
3213 for (
auto cur_hook_sp : active_hooks) {
3214 bool any_thread_matched =
false;
3215 for (
auto exc_ctx : exc_ctx_with_reasons) {
3216 if (!cur_hook_sp->ExecutionContextPasses(exc_ctx))
3219 bool suppress_output = cur_hook_sp->GetSuppressOutput();
3220 if (print_hook_header && !any_thread_matched && !suppress_output) {
3224 output_sp->Printf(
"\n- Hook %" PRIu64
" (%s)\n", cur_hook_sp->GetID(),
3227 output_sp->Printf(
"\n- Hook %" PRIu64
"\n", cur_hook_sp->GetID());
3228 any_thread_matched =
true;
3231 if (print_thread_header && !suppress_output)
3232 output_sp->Printf(
"-- Thread %d\n",
3233 exc_ctx.GetThreadPtr()->GetIndexID());
3235 auto result = cur_hook_sp->HandleStop(exc_ctx, output_sp);
3238 if (cur_hook_sp->GetAutoContinue())
3239 requested_continue =
true;
3244 requested_continue =
true;
3253 output_sp->Printf(
"\nAborting stop hooks, hook %" PRIu64
3254 " set the program running.\n"
3255 " Consider using '-G true' to make "
3256 "stop hooks auto-continue.\n",
3257 cur_hook_sp->GetID());
3268 if (requested_continue && !should_stop) {
3271 if (
error.Success()) {
3272 LLDB_LOG(log,
"Resuming from RunStopHooks");
3275 LLDB_LOG(log,
"Resuming from RunStopHooks failed: {0}",
error);
3288 return *g_settings_ptr;
3294 if (!platform_sp || !platform_sp->IsRemote() || !platform_sp->IsConnected())
3304 MainExecutableInstaller installer{platform_sp, module_sp,
3305 shared_from_this(), *launch_info};
3308 ExecutableInstaller installer{platform_sp, module_sp};
3320 uint32_t stop_id,
bool allow_section_end) {
3327 return m_images.ResolveFileAddress(file_addr, resolved_addr);
3331 addr_t new_section_load_addr,
3332 bool warn_multiple) {
3333 const addr_t old_section_load_addr =
3336 if (old_section_load_addr != new_section_load_addr) {
3337 uint32_t stop_id = 0;
3340 stop_id = process_sp->GetStopID();
3344 stop_id, section_sp, new_section_load_addr, warn_multiple))
3351 size_t section_unload_count = 0;
3352 size_t num_modules = module_list.
GetSize();
3353 for (
size_t i = 0; i < num_modules; ++i) {
3354 section_unload_count +=
3357 return section_unload_count;
3361 uint32_t stop_id = 0;
3364 stop_id = process_sp->GetStopID();
3367 SectionList *sections = module_sp->GetSectionList();
3368 size_t section_unload_count = 0;
3371 for (uint32_t i = 0; i < num_sections; ++i) {
3376 return section_unload_count;
3380 uint32_t stop_id = 0;
3383 stop_id = process_sp->GetStopID();
3391 uint32_t stop_id = 0;
3394 stop_id = process_sp->GetStopID();
3425 m_stats.SetLaunchOrAttachTime();
3429 LLDB_LOGF(log,
"Target::%s() called for %s", __FUNCTION__,
3441 state = process_sp->GetState();
3443 "Target::%s the process exists, and its current state is %s",
3446 LLDB_LOGF(log,
"Target::%s the process instance doesn't currently exist.",
3459 const bool synchronous_execution =
3467 if (launch_info.
GetFlags().
Test(eLaunchFlagLaunchInTTY))
3469 "can't launch in tty when launching through a remote connection");
3487 LLDB_LOGF(log,
"Target::%s asking the platform to debug the process",
3501 "Target::%s the platform doesn't know how to debug a "
3502 "process, getting a process plugin to do this for us.",
3521 if (!
error.Success())
3527 bool rebroadcast_first_stop =
3528 !synchronous_execution &&
3534 state =
m_process_sp->WaitForProcessToStop(std::nullopt, &first_stop_event_sp,
3535 rebroadcast_first_stop,
3539 if (rebroadcast_first_stop) {
3542 assert(first_stop_event_sp);
3551 if (launch_info.
GetFlags().
Test(eLaunchFlagStopAtEntry))
3553 if (synchronous_execution)
3560 if (!
error.Success()) {
3562 "process resume at entry point failed: %s",
error.AsCString());
3566 bool with_shell = !!launch_info.
GetShell();
3568 const char *exit_desc =
m_process_sp->GetExitDescription();
3570 if (exit_desc && exit_desc[0])
3571 desc =
" (" + std::string(exit_desc) +
')';
3574 "process exited with status %i%s\n"
3575 "'r' and 'run' are aliases that default to launching through a "
3577 "Try launching without going through a shell by using "
3578 "'process launch'.",
3579 exit_status, desc.c_str());
3582 "process exited with status %i%s", exit_status, desc.c_str());
3586 "initial process state wasn't stopped: %s",
StateAsCString(state));
3598 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3599 "A process is required for tracing");
3601 return llvm::createStringError(llvm::inconvertibleErrorCode(),
3602 "A trace already exists for the target");
3604 llvm::Expected<TraceSupportedResponse> trace_type =
3607 return llvm::createStringError(
3608 llvm::inconvertibleErrorCode(),
"Tracing is not supported. %s",
3609 llvm::toString(trace_type.takeError()).c_str());
3610 if (llvm::Expected<TraceSP> trace_sp =
3614 return llvm::createStringError(
3615 llvm::inconvertibleErrorCode(),
3616 "Couldn't create a Trace object for the process. %s",
3617 llvm::toString(trace_sp.takeError()).c_str());
3628 Progress attach_progress(
"Waiting to attach to process");
3629 m_stats.SetLaunchOrAttachTime();
3633 state = process_sp->GetState();
3646 if (old_exec_module_sp)
3648 old_exec_module_sp->GetPlatformFileSpec().GetFilename());
3652 "no process specified, create a target with a file, or "
3653 "specify the --pid or --name");
3657 const auto platform_sp =
3660 const bool async = attach_info.
GetAsync();
3678 plugin_name,
nullptr,
false);
3681 "failed to create process using plugin '{0}'",
3682 plugin_name.empty() ?
"<empty>" : plugin_name);
3686 if (hijack_listener_sp)
3687 process_sp->HijackProcessEvents(hijack_listener_sp);
3688 error = process_sp->Attach(attach_info);
3691 if (
error.Success() && process_sp) {
3693 process_sp->RestoreProcessEvents();
3696 state = process_sp->WaitForProcessToStop(
3699 process_sp->RestoreProcessEvents();
3706 const char *exit_desc = process_sp->GetExitDescription();
3711 "process did not stop (no such process or permission problem?)");
3712 process_sp->Destroy(
false);
3722 return llvm::createStringError(
"invalid frame provider descriptor");
3724 uint32_t descriptor_id = descriptor.
GetID();
3726 llvm::StringRef name = descriptor.
GetName();
3728 return llvm::createStringError(
3729 "frame provider descriptor has no class name");
3732 std::unique_lock<std::recursive_mutex> guard(
3739 return descriptor_id;
3743 bool removed =
false;
3745 std::lock_guard<std::recursive_mutex> guard(
3757 std::lock_guard<std::recursive_mutex> guard(
3765const llvm::DenseMap<uint32_t, ScriptedFrameProviderDescriptor> &
3767 std::lock_guard<std::recursive_mutex> guard(
3776 for (
ThreadSP thread_sp : process_sp->Threads()) {
3778 thread_sp->ClearScriptedFrameProvider();
3781 auto data_sp = std::make_shared<Thread::ThreadEventData>(thread_sp);
3793 const bool default_to_use_pty =
3797 "have platform={0}, platform_sp->IsHost()={1}, default_to_use_pty={2}",
3799 platform_sp ? (platform_sp->IsHost() ?
"true" :
"false") :
"n/a",
3800 default_to_use_pty);
3807 LLDB_LOG(log,
"at least one of stdin/stdout/stderr was not set, evaluating "
3808 "default handling");
3817 LLDB_LOG(log,
"eLaunchFlagDisableSTDIO set, adding suppression action "
3818 "for stdin, stdout and stderr");
3838 LLDB_LOG(log,
"target stdin='{0}', target stdout='{1}', stderr='{2}'",
3839 in_file_spec, out_file_spec, err_file_spec);
3843 LLDB_LOG(log,
"appended stdin open file action for {0}", in_file_spec);
3846 if (out_file_spec) {
3848 LLDB_LOG(log,
"appended stdout open file action for {0}",
3852 if (err_file_spec) {
3854 LLDB_LOG(log,
"appended stderr open file action for {0}",
3858 if (default_to_use_pty) {
3861 llvm::Error Err = info.SetUpPipeRedirection();
3863 "SetUpPipeRedirection failed: {0}");
3868 "SetUpPtyRedirection failed: {0}");
3888 elem.notify = notify;
3898 = signals_sp->GetSignalNumberFromName(elem.first().str().c_str());
3903 signals_sp->SetShouldSuppress(signo,
false);
3905 signals_sp->SetShouldSuppress(signo,
true);
3908 signals_sp->SetShouldNotify(signo,
true);
3910 signals_sp->SetShouldNotify(signo,
false);
3913 signals_sp->SetShouldStop(signo,
true);
3915 signals_sp->SetShouldStop(signo,
false);
3924 = signals_sp->GetSignalNumberFromName(elem.first().str().c_str());
3930 signals_sp->ResetSignal(signo, do_stop, do_notify, do_pass);
3941 warning_stream_sp->Printf(
"Target signal '%s' not found in process\n",
3942 elem.first().str().c_str());
3955 signals_sp = process_sp->GetUnixSignals();
3958 const char *signal_name = entry.c_str();
3972 strm.
Printf(
"NAME PASS STOP NOTIFY\n");
3973 strm.
Printf(
"=========== ======= ======= =======\n");
3975 auto str_for_lazy = [] (
LazyBool lazy) ->
const char * {
3981 llvm_unreachable(
"Fully covered switch above!");
3985 bool print_it =
false;
3986 for (
size_t idx = 0; idx < num_args; idx++) {
3993 strm.
Printf(
"%-11s ", elem.first().str().c_str());
3994 strm.
Printf(
"%s %s %s\n", str_for_lazy(elem.second.pass),
3995 str_for_lazy(elem.second.stop),
3996 str_for_lazy(elem.second.notify));
4027 bool will_run =
true;
4051 s.
Indent(
"State: enabled\n");
4053 s.
Indent(
"State: disabled\n");
4056 s.
Indent(
"AutoContinue on\n");
4086 uint32_t num_commands =
m_commands.GetSize();
4087 for (uint32_t i = 0; i < num_commands; i++) {
4099 const std::vector<std::string> &strings) {
4100 for (
auto string : strings)
4107 assert(exc_ctx.
GetTargetPtr() &&
"Can't call PerformAction on a context "
4144 GetTarget()->GetDebugger().GetScriptInterpreter();
4145 if (!script_interp) {
4153 "ScriptedStopHook::%s () - ERROR: %s", __FUNCTION__,
4154 "Script interpreter couldn't create Scripted Stop Hook Interface");
4168 if (!object_sp || !object_sp->IsValid()) {
4170 "ScriptedStopHook::%s () - ERROR: %s", __FUNCTION__,
4171 "Failed to create valid script object");
4181 assert(exc_ctx.
GetTargetPtr() &&
"Can't call HandleStop on a context "
4187 lldb::StreamSP stream = std::make_shared<lldb_private::StreamString>();
4188 auto should_stop_or_err =
m_interface_sp->HandleStop(exc_ctx, stream);
4189 output_sp->PutCString(
4191 if (!should_stop_or_err)
4213 if (!object_sp || !object_sp->IsValid())
4217 if (!as_dict || !as_dict->
IsValid())
4220 uint32_t num_keys = as_dict->
GetSize();
4227 auto print_one_element = [&s](llvm::StringRef key,
4230 s.
Format(
"{0} : {1}\n", key, object->GetStringValue());
4234 as_dict->
ForEach(print_one_element);
4240 "no-dynamic-values",
4241 "Don't calculate the dynamic type of values",
4246 "Calculate the dynamic type of values "
4247 "even if you have to run the target.",
4252 "Calculate the dynamic type of values, but don't run the target.",
4264 "Never look for inline breakpoint locations (fastest). This setting "
4265 "should only be used if you know that no inlining occurs in your"
4271 "Only check for inline breakpoint locations when setting breakpoints "
4272 "in header files, but not when setting breakpoint in implementation "
4273 "source files (default).",
4278 "Always look for inline breakpoint locations when setting file and "
4279 "line breakpoints (slower but most accurate).",
4293 "Disassembler default (currently att).",
4298 "Intel disassembler flavor.",
4303 "AT&T disassembler flavor.",
4311 "Never import the 'std' C++ module in the expression parser.",
4316 "Retry evaluating expressions with an imported 'std' C++ module if they"
4317 " failed to parse without the module. This allows evaluating more "
4318 "complex expressions involving C++ standard library types."
4323 "Always import the 'std' C++ module. This allows evaluating more "
4324 "complex expressions involving C++ standard library types. This feature"
4329static constexpr OptionEnumValueElement
4334 "Automatically determine the most appropriate method for the "
4338 "Prefer using the realized classes struct."},
4340 "Prefer using the CopyRealizedClassList API."},
4342 "Prefer using the GetRealizedClassList API."},
4349 "C-style (0xffff).",
4354 "Asm-style (0ffffh).",
4362 "Load debug scripts inside symbol files",
4367 "Do not load debug scripts inside symbol files.",
4372 "Warn about debug scripts inside symbol files but do not load them.",
4377 "Load debug scripts inside trusted symbol files, and warn about "
4378 "scripts from untrusted symbol files.",
4386 "Load .lldbinit files from current directory",
4391 "Do not load .lldbinit files from current directory",
4396 "Warn about loading .lldbinit files from current directory",
4404 "Load minimal information when loading modules from memory. Currently "
4405 "this setting loads sections only.",
4410 "Load partial information when loading modules from memory. Currently "
4411 "this setting loads sections and function bounds.",
4416 "Load complete information when loading modules from memory. Currently "
4417 "this setting loads sections and all symbols.",
4421#define LLDB_PROPERTIES_target
4422#include "TargetProperties.inc"
4425#define LLDB_PROPERTIES_target
4426#include "TargetPropertiesEnum.inc"
4431 :
public Cloneable<TargetOptionValueProperties, OptionValueProperties> {
4442 Target *target = exe_ctx->GetTargetPtr();
4447 if (
this != target_properties)
4456#define LLDB_PROPERTIES_target_experimental
4457#include "TargetProperties.inc"
4460#define LLDB_PROPERTIES_target_experimental
4461#include "TargetPropertiesEnum.inc"
4465 :
public Cloneable<TargetExperimentalOptionValueProperties,
4466 OptionValueProperties> {
4503 m_collection_sp->SetValueChangedCallback(ePropertyDetachOnError, [
this] {
4516 std::make_unique<TargetExperimentalProperties>();
4519 "Experimental settings - setting these won't produce "
4520 "errors if the setting is not present.",
4523 m_collection_sp = std::make_shared<TargetOptionValueProperties>(
"target");
4526 std::make_unique<TargetExperimentalProperties>();
4529 "Experimental settings - setting these won't produce "
4530 "errors if the setting is not present.",
4533 "process",
"Settings specific to processes.",
true,
4560 exp_property->
GetValue()->GetAsProperties();
4563 return std::nullopt;
4576 exp_property->
GetValue()->GetAsProperties();
4588 exp_property->
GetValue()->GetAsProperties();
4594 const uint32_t idx = ePropertyDefaultArch;
4599 const uint32_t idx = ePropertyDefaultArch;
4604 const uint32_t idx = ePropertyMoveToNearestCode;
4606 idx, g_target_properties[idx].default_uint_value != 0);
4610 const uint32_t idx = ePropertyPreferDynamic;
4613 g_target_properties[idx].default_uint_value));
4617 const uint32_t idx = ePropertyPreferDynamic;
4623 "Interrupted checking preload symbols")) {
4626 const uint32_t idx = ePropertyPreloadSymbols;
4628 idx, g_target_properties[idx].default_uint_value != 0);
4632 const uint32_t idx = ePropertyPreloadSymbols;
4637 const uint32_t idx = ePropertyDisableASLR;
4639 idx, g_target_properties[idx].default_uint_value != 0);
4643 const uint32_t idx = ePropertyDisableASLR;
4648 const uint32_t idx = ePropertyInheritTCC;
4650 idx, g_target_properties[idx].default_uint_value != 0);
4654 const uint32_t idx = ePropertyInheritTCC;
4659 const uint32_t idx = ePropertyDetachOnError;
4661 idx, g_target_properties[idx].default_uint_value != 0);
4665 const uint32_t idx = ePropertyDetachOnError;
4670 const uint32_t idx = ePropertyDisableSTDIO;
4672 idx, g_target_properties[idx].default_uint_value != 0);
4676 const uint32_t idx = ePropertyDisableSTDIO;
4680 const uint32_t idx = ePropertyLaunchWorkingDir;
4682 idx, g_target_properties[idx].default_cstr_value);
4686 const uint32_t idx = ePropertyParallelModuleLoad;
4688 idx, g_target_properties[idx].default_uint_value != 0);
4692 const uint32_t idx = ePropertyDisassemblyFlavor;
4693 const char *return_value;
4698 g_target_properties[idx].default_uint_value));
4701 return return_value;
4705 const uint32_t idx = ePropertyDisassemblyCPU;
4707 idx, g_target_properties[idx].default_cstr_value);
4708 return str.empty() ? nullptr : str.data();
4712 const uint32_t idx = ePropertyDisassemblyFeatures;
4714 idx, g_target_properties[idx].default_cstr_value);
4715 return str.empty() ? nullptr : str.data();
4719 const uint32_t idx = ePropertyInlineStrategy;
4722 static_cast<InlineStrategy>(g_target_properties[idx].default_uint_value));
4728 const uint32_t idx = ePropertySourceRealpathPrefixes;
4733 const uint32_t idx = ePropertyArg0;
4735 idx, g_target_properties[idx].default_cstr_value);
4739 const uint32_t idx = ePropertyArg0;
4745 const uint32_t idx = ePropertyRunArgs;
4750 const uint32_t idx = ePropertyRunArgs;
4760 ePropertyInheritEnv,
4761 g_target_properties[ePropertyInheritEnv].default_uint_value != 0)) {
4762 if (
auto platform_sp =
m_target->GetPlatform()) {
4763 Environment platform_env = platform_sp->GetEnvironment();
4764 for (
const auto &KV : platform_env)
4765 env[KV.first()] = KV.second;
4769 Args property_unset_env;
4771 property_unset_env);
4772 for (
const auto &var : property_unset_env)
4773 env.erase(var.ref());
4776 m_collection_sp->GetPropertyAtIndexAsArgs(ePropertyEnvVars, property_env);
4778 env[KV.first()] = KV.second;
4794 ePropertyInheritEnv,
4795 g_target_properties[ePropertyInheritEnv].default_uint_value != 0))
4799 if (platform_sp ==
nullptr)
4802 Environment platform_environment = platform_sp->GetEnvironment();
4803 for (
const auto &KV : platform_environment)
4804 environment[KV.first()] = KV.second;
4806 Args property_unset_environment;
4808 property_unset_environment);
4809 for (
const auto &var : property_unset_environment)
4810 environment.erase(var.ref());
4816 Args property_environment;
4818 property_environment);
4820 for (
const auto &KV :
Environment(property_environment))
4821 environment[KV.first()] = KV.second;
4828 const uint32_t idx = ePropertyEnvVars;
4833 const uint32_t idx = ePropertySkipPrologue;
4835 idx, g_target_properties[idx].default_uint_value != 0);
4839 const uint32_t idx = ePropertySourceMap;
4842 assert(option_value);
4847 const uint32_t idx = ePropertyObjectMap;
4850 assert(option_value);
4855 const uint32_t idx = ePropertyAutoSourceMapRelative;
4857 idx, g_target_properties[idx].default_uint_value != 0);
4861 const uint32_t idx = ePropertyExecutableSearchPaths;
4864 assert(option_value);
4869 const uint32_t idx = ePropertyExecutableSearchPaths;
4874 const uint32_t idx = ePropertyDebugFileSearchPaths;
4879 const uint32_t idx = ePropertyClangModuleSearchPaths;
4884 const uint32_t idx = ePropertyAutoImportClangModules;
4886 idx, g_target_properties[idx].default_uint_value != 0);
4890 const uint32_t idx = ePropertyImportStdModule;
4893 g_target_properties[idx].default_uint_value));
4897 const uint32_t idx = ePropertyDynamicClassInfoHelper;
4900 g_target_properties[idx].default_uint_value));
4904 const uint32_t idx = ePropertyAutoApplyFixIts;
4906 idx, g_target_properties[idx].default_uint_value != 0);
4910 const uint32_t idx = ePropertyRetriesWithFixIts;
4912 idx, g_target_properties[idx].default_uint_value);
4916 const uint32_t idx = ePropertyNotifyAboutFixIts;
4918 idx, g_target_properties[idx].default_uint_value != 0);
4922 const uint32_t idx = ePropertySaveObjectsDir;
4932 bool exists = instance.
Exists(new_dir);
4933 bool is_directory = instance.
IsDirectory(new_dir);
4934 std::string path = new_dir.
GetPath(
true);
4935 bool writable = llvm::sys::fs::can_write(path);
4936 if (exists && is_directory && writable)
4944 llvm::raw_string_ostream os(buffer);
4945 os <<
"JIT object dir '" << path <<
"' ";
4947 os <<
"does not exist";
4948 else if (!is_directory)
4949 os <<
"is not a directory";
4951 os <<
"is not writable";
4953 std::optional<lldb::user_id_t> debugger_id;
4955 debugger_id =
m_target->GetDebugger().GetID();
4960 const uint32_t idx = ePropertyEnableSynthetic;
4962 idx, g_target_properties[idx].default_uint_value != 0);
4966 const uint32_t idx = ePropertyShowHexVariableValuesWithLeadingZeroes;
4968 idx, g_target_properties[idx].default_uint_value != 0);
4972 const uint32_t idx = ePropertyMaxZeroPaddingInFloatFormat;
4974 idx, g_target_properties[idx].default_uint_value);
4978 const uint32_t idx = ePropertyMaxChildrenCount;
4980 idx, g_target_properties[idx].default_uint_value);
4983std::pair<uint32_t, bool>
4985 const uint32_t idx = ePropertyMaxChildrenDepth;
4986 auto *option_value =
4988 bool is_default = !option_value->OptionWasSet();
4989 return {option_value->GetCurrentValue(), is_default};
4993 const uint32_t idx = ePropertyMaxSummaryLength;
4995 idx, g_target_properties[idx].default_uint_value);
4999 const uint32_t idx = ePropertyMaxMemReadSize;
5001 idx, g_target_properties[idx].default_uint_value);
5005 const uint32_t idx = ePropertyInputPath;
5010 const uint32_t idx = ePropertyInputPath;
5015 const uint32_t idx = ePropertyOutputPath;
5020 const uint32_t idx = ePropertyOutputPath;
5025 const uint32_t idx = ePropertyErrorPath;
5030 const uint32_t idx = ePropertyErrorPath;
5035 const uint32_t idx = ePropertyLanguage;
5040 const uint32_t idx = ePropertyExprPrefix;
5046 return llvm::StringRef(
5047 reinterpret_cast<const char *
>(data_sp->GetBytes()),
5048 data_sp->GetByteSize());
5054 const uint32_t idx = ePropertyExprErrorLimit;
5056 idx, g_target_properties[idx].default_uint_value);
5060 const uint32_t idx = ePropertyExprAllocAddress;
5062 idx, g_target_properties[idx].default_uint_value);
5066 const uint32_t idx = ePropertyExprAllocSize;
5068 idx, g_target_properties[idx].default_uint_value);
5072 const uint32_t idx = ePropertyExprAllocAlign;
5074 idx, g_target_properties[idx].default_uint_value);
5078 const uint32_t idx = ePropertyBreakpointUseAvoidList;
5080 idx, g_target_properties[idx].default_uint_value != 0);
5084 const uint32_t idx = ePropertyUseHexImmediates;
5086 idx, g_target_properties[idx].default_uint_value != 0);
5090 const uint32_t idx = ePropertyUseFastStepping;
5092 idx, g_target_properties[idx].default_uint_value != 0);
5096 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
5098 idx, g_target_properties[idx].default_uint_value != 0);
5102 const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
5105 g_target_properties[idx].default_uint_value));
5109 const uint32_t idx = ePropertyLoadCWDlldbinitFile;
5112 g_target_properties[idx].default_uint_value));
5116 const uint32_t idx = ePropertyHexImmediateStyle;
5119 g_target_properties[idx].default_uint_value));
5123 const uint32_t idx = ePropertyMemoryModuleLoadLevel;
5126 g_target_properties[idx].default_uint_value));
5130 const uint32_t idx = ePropertyTrapHandlerNames;
5135 const uint32_t idx = ePropertyTrapHandlerNames;
5140 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
5142 idx, g_target_properties[idx].default_uint_value != 0);
5146 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
5151 const uint32_t idx = ePropertyDisplayRecognizedArguments;
5153 idx, g_target_properties[idx].default_uint_value != 0);
5157 const uint32_t idx = ePropertyDisplayRecognizedArguments;
5173 if (input_file_action) {
5178 if (output_file_action) {
5183 if (error_file_action) {
5189 launch_info.
GetFlags().
Test(lldb::eLaunchFlagInheritTCCFromParent));
5194 const uint32_t idx = ePropertyRequireHardwareBreakpoints;
5196 idx, g_target_properties[idx].default_uint_value != 0);
5200 const uint32_t idx = ePropertyRequireHardwareBreakpoints;
5205 const uint32_t idx = ePropertyAutoInstallMainExecutable;
5207 idx, g_target_properties[idx].default_uint_value != 0);
5241 m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
5243 m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
5250 m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
5255 m_launch_info.GetFlags().Set(lldb::eLaunchFlagInheritTCCFromParent);
5257 m_launch_info.GetFlags().Clear(lldb::eLaunchFlagInheritTCCFromParent);
5262 m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
5264 m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
5268 const uint32_t idx = ePropertyDebugUtilityExpression;
5270 idx, g_target_properties[idx].default_uint_value != 0);
5274 const uint32_t idx = ePropertyDebugUtilityExpression;
5295 return "Target::TargetEventData";
5332 return created_target_sp;
5354 return m_stats.ToJSON(*
this, options);
5372 lldb::BreakpointEventType eventKind) {
5374 std::shared_ptr<Breakpoint::BreakpointEventData> data_sp =
5375 std::make_shared<Breakpoint::BreakpointEventData>(
5376 eventKind, bp.shared_from_this());
5394 if (option_name.empty())
5395 return llvm::createStringError(
"can't set an option with an empty name");
5400 return llvm::createStringErrorV(
"trying to override existing option '{0}' "
5401 "of type '{1}' with a boolean value",
5402 option_name, existing_sp->GetType());
5406 return llvm::Error::success();
5410 llvm::StringRef option_name)
const {
5413 if (!opts.
HasKey(option_name))
5414 return llvm::createStringErrorV(
"option '{0}' does not exist", option_name);
5418 return llvm::createStringErrorV(
"failed to get option '{0}' as boolean",
5440 "c++-ignore-context-qualifiers";
5453 return llvm::cantFail(
static void dump(const StructuredData::Array &array, Stream &s)
static llvm::raw_ostream & error(Stream &strm)
#define INTERRUPT_REQUESTED(debugger,...)
This handy define will keep you from having to generate a report for the interruption by hand.
#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,...)
static void skip(TSLexer *lexer)
static double elapsed(const StatsTimepoint &start, const StatsTimepoint &end)
static Status installExecutable(const Installer &installer)
constexpr llvm::StringLiteral s_cpp_ignore_context_qualifiers_option
static constexpr OptionEnumValueElement g_dynamic_class_info_helper_value_types[]
static bool CheckIfWatchpointsSupported(Target *target, Status &error)
static constexpr OptionEnumValueElement g_load_cwd_lldbinit_values[]
static constexpr OptionEnumValueElement g_dynamic_value_types[]
static constexpr OptionEnumValueElement g_memory_module_load_level_values[]
static constexpr OptionEnumValueElement g_load_script_from_sym_file_values[]
static std::atomic< lldb::user_id_t > g_target_unique_id
static constexpr OptionEnumValueElement g_x86_dis_flavor_value_types[]
static constexpr OptionEnumValueElement g_hex_immediate_style_values[]
static constexpr OptionEnumValueElement g_inline_breakpoint_enums[]
static constexpr OptionEnumValueElement g_import_std_module_value_types[]
#define LLDB_SCOPED_TIMERF(...)
TargetExperimentalOptionValueProperties()
const Property * GetPropertyAtIndex(size_t idx, const ExecutionContext *exe_ctx=nullptr) const override
TargetOptionValueProperties(llvm::StringRef name)
static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool SetLoadAddress(lldb::addr_t load_addr, Target *target, bool allow_section_end=false)
Set the address to represent load_addr.
lldb::SectionSP GetSection() const
Get const accessor for the section.
bool Slide(int64_t offset)
lldb::ModuleSP GetModule() const
Get accessor for the module for this address.
lldb::addr_t GetFileAddress() const
Get the file address.
lldb::addr_t GetOffset() const
Get the section relative offset value.
bool IsValid() const
Check if the object state is valid.
bool IsSectionOffset() const
Check if an address is section offset.
bool SetOffset(lldb::addr_t offset)
Set accessor for the offset.
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
llvm::Triple & GetTriple()
Architecture triple accessor.
void MergeFrom(const ArchSpec &other)
Merges fields from another ArchSpec into this ArchSpec.
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
A command line argument class.
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
bool AddBreakpointID(BreakpointID bp_id)
BreakpointID GetBreakpointIDAtIndex(size_t index) const
lldb::break_id_t GetBreakpointID() const
static bool StringIsBreakpointName(llvm::StringRef str, Status &error)
Takes an input string and checks to see whether it is a breakpoint name.
General Outline: Allows adding and removing breakpoints and find by ID and index.
BreakpointIterable Breakpoints()
void GetListMutex(std::unique_lock< std::recursive_mutex > &lock)
Sets the passed in Locker to hold the Breakpoint List mutex.
void ResetHitCounts()
Resets the hit count of all breakpoints.
size_t GetSize() const
Returns the number of elements in this breakpoint list.
lldb::BreakpointSP GetBreakpointAtIndex(size_t i) const
Returns a shared pointer to the breakpoint with index i.
void MergeInto(const Permissions &incoming)
ConstString GetName() const
Permissions & GetPermissions()
BreakpointOptions & GetOptions()
void ConfigureBreakpoint(lldb::BreakpointSP bp_sp)
"lldb/Breakpoint/BreakpointOptions.h" Class that manages the options on a breakpoint or breakpoint lo...
void CopyOverSetOptions(const BreakpointOptions &rhs)
Copy over only the options set in the incoming BreakpointOptions.
"lldb/Breakpoint/BreakpointResolverFileLine.h" This class sets breakpoints by file and line.
"lldb/Breakpoint/BreakpointResolverFileRegex.h" This class sets breakpoints by file and line.
"lldb/Breakpoint/BreakpointResolverName.h" This class sets breakpoints on a given function name,...
"lldb/Breakpoint/BreakpointResolverScripted.h" This class sets breakpoints on a given Address.
General Outline: A breakpoint has four main parts, a filter, a resolver, the list of breakpoint locat...
virtual StructuredData::ObjectSP SerializeToStructuredData()
static lldb::BreakpointSP CreateFromStructuredData(lldb::TargetSP target_sp, StructuredData::ObjectSP &data_object_sp, Status &error)
static lldb::BreakpointSP CopyFromBreakpoint(lldb::TargetSP new_target, const Breakpoint &bp_to_copy_from)
static const char * GetSerializationKey()
static bool SerializedBreakpointMatchesNames(StructuredData::ObjectSP &bkpt_object_sp, std::vector< std::string > &names)
bool EventTypeHasListeners(uint32_t event_type)
Broadcaster(lldb::BroadcasterManagerSP manager_sp, std::string name)
Construct with a broadcaster with a name.
void SetEventName(uint32_t event_mask, const char *name)
Set the name for an event bit.
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
void CheckInWithManager()
A class that implements CRTP-based "virtual constructor" idiom.
void SetStopOnContinue(bool stop_on_continue)
void SetPrintErrors(bool print_errors)
void SetEchoCommands(bool echo_commands)
void SetAddToHistory(bool add_to_history)
void SetStopOnError(bool stop_on_error)
void SetPrintResults(bool print_results)
void HandleCommands(const StringList &commands, const ExecutionContext &context, const CommandInterpreterRunOptions &options, CommandReturnObject &result)
Execute a list of commands in sequence.
void SetInteractive(bool b)
void SetImmediateOutputStream(const lldb::StreamSP &stream_sp)
lldb::ReturnStatus GetStatus() const
Generic representation of a type in a programming language.
A uniqued constant string class.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t GetByteSize() const override
Get the number of bytes in the data buffer.
void SetAsyncExecution(bool async)
CommandInterpreter & GetCommandInterpreter()
lldb::StreamUP GetAsyncErrorStream()
TargetList & GetTargetList()
Get accessor for the target list.
static llvm::ThreadPoolInterface & GetThreadPool()
Shared thread pool. Use only with ThreadPoolTaskGroup.
static void ReportError(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report error events.
PlatformList & GetPlatformList()
lldb::ListenerSP GetListener()
llvm::Error GetAsError(lldb::ExpressionResults result, llvm::Twine message={}) const
Returns an ExpressionError with arg as error code.
static lldb::DisassemblerSP DisassembleBytes(const ArchSpec &arch, const char *plugin_name, const char *flavor, const char *cpu, const char *features, const Address &start, const void *bytes, size_t length, uint32_t max_num_instructions, bool data_from_file)
A class that measures elapsed time in an exception safe way.
EvaluateExpressionOptions()
bool GetCppIgnoreContextQualifiers() const
void SetCppIgnoreContextQualifiers(bool value)
const StructuredData::Dictionary & GetLanguageOptions() const
llvm::Expected< bool > GetBooleanLanguageOption(llvm::StringRef option_name) const
Get the language-plugin specific boolean option called option_name.
void SetTryAllThreads(bool try_others=true)
void SetStopOthers(bool stop_others=true)
llvm::Error SetBooleanLanguageOption(llvm::StringRef option_name, bool value)
Set language-plugin specific option called option_name to the specified boolean value.
StructuredData::DictionarySP m_language_options_sp
Dictionary mapping names of language-plugin specific options to values.
virtual llvm::StringRef GetFlavor() const =0
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
virtual void CalculateExecutionContext(ExecutionContext &exe_ctx)=0
Reconstruct the object's execution context into sc.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
void Clear()
Clear the object's state.
void SetTargetPtr(Target *target)
Set accessor to set only the target shared pointer from a target pointer.
StackFrame * GetFramePtr() const
Returns a pointer to the frame object.
Target * GetTargetPtr() const
Returns a pointer to the target object.
Thread & GetThreadRef() const
Returns a reference to the thread object.
Represents a file descriptor action to be performed during process launch.
const FileSpec & GetFileSpec() const
Get the file specification for open actions.
const FileSpec & GetFileSpecAtIndex(size_t idx) const
Get file at index.
void Append(const FileSpec &file)
Append a FileSpec object to the list.
size_t GetSize() const
Get the number of files in the file list.
bool AppendIfUnique(const FileSpec &file)
Append a FileSpec object if unique.
void AppendPathComponent(llvm::StringRef component)
void SetDirectory(ConstString directory)
Directory string set accessor.
const ConstString & GetFilename() const
Filename string const get accessor.
const ConstString & GetDirectory() const
Directory string const get accessor.
void SetPath(llvm::StringRef p)
Temporary helper for FileSystem change.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
bool IsSourceImplementationFile() const
Returns true if the filespec represents an implementation source file (files with a "....
void SetFilename(ConstString filename)
Filename string set accessor.
bool Exists(const FileSpec &file_spec) const
Returns whether the given file exists.
bool IsDirectory(const FileSpec &file_spec) const
Returns whether the given path is a directory.
static FileSystem & Instance()
bool IsValid() const override
IsValid.
bool Test(ValueType bit) const
Test a single flag bit.
ValueType Set(ValueType mask)
Set one or more flags by logical OR'ing mask with the current flags.
Encapsulates a function that can be called.
static lldb::BreakpointSP CreateExceptionBreakpoint(Target &target, lldb::LanguageType language, bool catch_bp, bool throw_bp, bool is_internal=false)
static LanguageSet GetLanguagesSupportingREPLs()
static Language * FindPlugin(lldb::LanguageType language)
static const char * GetNameForLanguageType(lldb::LanguageType language)
Returns the internal LLDB name for the specified language.
static LanguageSet GetLanguagesSupportingTypeSystemsForExpressions()
virtual llvm::StringRef GetUserEntryPointName() const
static std::set< lldb::LanguageType > GetSupportedLanguages()
static lldb::ListenerSP MakeListener(const char *name)
A collection class for Module objects.
bool AnyOf(std::function< bool(lldb_private::Module &module)> const &callback) const
Returns true if 'callback' returns true for one of the modules in this ModuleList.
static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr, bool invoke_locate_callback=true)
static bool RemoveSharedModuleIfOrphaned(const lldb::ModuleWP module_ptr)
void PreloadSymbols(bool parallelize) const
For each module in this ModuleList, preload its symbols.
bool AppendIfNeeded(const lldb::ModuleSP &new_module, bool notify=true)
Append a module to the module list, if it is not already there.
void FindModules(const ModuleSpec &module_spec, ModuleList &matching_module_list) const
Finds modules whose file specification matches module_spec.
lldb::ModuleSP GetModuleAtIndex(size_t idx) const
Get the module shared pointer for the module at index idx.
void Append(const lldb::ModuleSP &module_sp, bool notify=true)
Append a module to the module list.
bool LoadScriptingResourcesInTarget(Target *target, std::list< Status > &errors, bool continue_on_error=true)
size_t GetSize() const
Gets the size of the module list.
void ForEach(std::function< IterationAction(const lldb::ModuleSP &module_sp)> const &callback) const
Applies 'callback' to each module in this ModuleList.
void SetTarget(lldb::TargetSP target)
Set the target to be used when resolving a module.
A class that describes an executable image and its associated object and symbol files.
virtual ObjectFile * GetObjectFile()
Get the object file representation for the current architecture.
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
A plug-in interface definition class for object file parsers.
virtual uint32_t GetDependentModules(FileSpecList &file_list)=0
Extract the dependent modules from an object file.
virtual lldb_private::Address GetEntryPointAddress()
Returns the address of the Entry Point in this object file - if the object file doesn't have an entry...
@ eTypeExecutable
A normal executable.
@ eTypeDebugInfo
An object file that contains only debug information.
@ eTypeStubLibrary
A library that can be linked against but not used for execution.
@ eTypeObjectFile
An intermediate object file.
@ eTypeDynamicLinker
The platform's dynamic linker executable.
@ eTypeCoreFile
A core file that has a checkpoint of a program's execution state.
@ eTypeSharedLibrary
A shared library that can be used during execution.
virtual size_t ReadSectionData(Section *section, lldb::offset_t section_offset, void *dst, size_t dst_len)
void AppendCurrentValue(const FileSpec &value)
const lldb::DataBufferSP & GetFileContents()
PathMappingList & GetCurrentValue()
auto GetPropertyAtIndexAs(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
Property * ProtectedGetPropertyAtIndex(size_t idx)
bool SetPropertyAtIndex(size_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
static lldb::OptionValuePropertiesSP CreateLocalCopy(const Properties &global_properties)
bool RemapPath(ConstString path, ConstString &new_path) const
std::optional< llvm::StringRef > ReverseRemapPath(const FileSpec &file, FileSpec &fixed) const
Perform reverse source path remap for input file.
static std::unique_ptr< Architecture > CreateArchitectureInstance(const ArchSpec &arch)
static lldb::RegisterTypeBuilderSP GetRegisterTypeBuilder(Target &target)
bool ProcessInfoSpecified() const
lldb::ListenerSP GetListenerForProcess(Debugger &debugger)
llvm::StringRef GetProcessPluginName() const
void SetHijackListener(const lldb::ListenerSP &listener_sp)
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
lldb::ScriptedMetadataSP GetScriptedMetadata() const
lldb::ListenerSP GetHijackListener() const
llvm::StringRef GetArg0() const
void SetScriptedMetadata(lldb::ScriptedMetadataSP metadata_sp)
FileSpec & GetExecutableFile()
lldb::ListenerSP GetListener() const
lldb::ListenerSP GetShadowListener() const
Environment & GetEnvironment()
bool IsScriptedProcess() const
ArchSpec & GetArchitecture()
llvm::StringRef GetProcessPluginName() const
const FileSpec & GetShell() const
llvm::Error SetUpPtyRedirection()
bool AppendOpenFileAction(int fd, const FileSpec &file_spec, bool read, bool write)
bool AppendSuppressFileAction(int fd, bool read, bool write)
const FileAction * GetFileActionForFD(int fd) const
void SetProcessPluginName(llvm::StringRef plugin)
static void SettingsInitialize()
static constexpr llvm::StringRef AttachSynchronousHijackListenerName
static lldb::ProcessSP FindPlugin(lldb::TargetSP target_sp, llvm::StringRef plugin_name, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
Find a Process plug-in that can debug module using the currently selected architecture.
static constexpr llvm::StringRef LaunchSynchronousHijackListenerName
static ProcessProperties & GetGlobalProperties()
static void SettingsTerminate()
A Progress indicator helper class.
lldb::OptionValuePropertiesSP m_collection_sp
T GetPropertyAtIndexAs(uint32_t idx, T default_value, const ExecutionContext *exe_ctx=nullptr) const
static llvm::StringRef GetExperimentalSettingsName()
bool SetPropertyAtIndex(uint32_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
lldb::OptionValuePropertiesSP GetValueProperties() const
const lldb::OptionValueSP & GetValue() const
static lldb::REPLSP Create(Status &Status, lldb::LanguageType language, Debugger *debugger, Target *target, const char *repl_options)
Get a REPL with an existing target (or, failing that, a debugger to use), and (optional) extra argume...
bool SignExtend(uint32_t bit_pos)
unsigned long long ULongLong(unsigned long long fail_value=0) const
long long SLongLong(long long fail_value=0) const
virtual lldb::ScriptedStopHookInterfaceSP CreateScriptedStopHookInterface()
size_t GetNumSections(uint32_t depth) const
lldb::SectionSP GetSectionAtIndex(size_t idx) const
void Dump(Stream &s, Target *target)
bool ResolveLoadAddress(lldb::addr_t load_addr, Address &so_addr, bool allow_section_end=false) const
lldb::addr_t GetSectionLoadAddress(const lldb::SectionSP §ion_sp) const
"lldb/Core/SourceLocationSpec.h" A source location specifier class.
Class that provides a registry of known stack frame recognizers.
virtual const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
void Clear()
Clear the object state.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
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.
const char * GetData() const
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 Indent(llvm::StringRef s="")
Indent the current line in the stream.
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.
IndentScope MakeIndentScope(unsigned indent_amount=2)
Create an indentation scope that restores the original indent level when the object goes out of scope...
void IndentLess(unsigned amount=2)
Decrement the current indentation level.
void IndentMore(unsigned amount=2)
Increment the current indentation level.
void AddItem(const ObjectSP &item)
ObjectSP GetItemAtIndex(size_t idx) const
bool GetValueForKeyAsBoolean(llvm::StringRef key, bool &result) const
ObjectSP GetValueForKey(llvm::StringRef key) const
bool HasKey(llvm::StringRef key) const
void ForEach(std::function< bool(llvm::StringRef key, Object *object)> const &callback) const
virtual bool IsValid() const
void Dump(lldb_private::Stream &s, bool pretty_print=true) const
A class which can hold structured data.
std::shared_ptr< Object > ObjectSP
std::shared_ptr< Array > ArraySP
static ObjectSP ParseJSONFromFile(const FileSpec &file, Status &error)
A class that wraps a std::map of SummaryStatistics objects behind a mutex.
Defines a symbol context baton that can be handed other debug core functions.
lldb::TargetSP target_sp
The Target for a given query.
TargetExperimentalProperties()
lldb::TargetSP GetTargetAtIndex(uint32_t index) const
size_t GetNumTargets() const
uint32_t GetMaximumSizeOfStringSummary() const
FileSpecList GetDebugFileSearchPaths()
llvm::StringRef GetLaunchWorkingDirectory() const
bool GetDisplayRecognizedArguments() const
ImportStdModule GetImportStdModule() const
bool GetDisableSTDIO() const
bool GetMoveToNearestCode() const
~TargetProperties() override
void AppendExecutableSearchPaths(const FileSpec &)
void SetInheritTCC(bool b)
bool GetEnableSyntheticValue() const
void UpdateLaunchInfoFromProperties()
ProcessLaunchInfo m_launch_info
uint64_t GetExprAllocAlign() const
MemoryModuleLoadLevel GetMemoryModuleLoadLevel() const
llvm::StringRef GetArg0() const
uint32_t GetMaximumMemReadSize() const
void SetRunArguments(const Args &args)
FileSpec GetStandardErrorPath() const
bool GetEnableNotifyAboutFixIts() const
bool SetPreferDynamicValue(lldb::DynamicValueType d)
void SetDisplayRecognizedArguments(bool b)
std::optional< bool > GetExperimentalPropertyValue(size_t prop_idx, ExecutionContext *exe_ctx=nullptr) const
bool GetDisableASLR() const
bool GetUseFastStepping() const
const ProcessLaunchInfo & GetProcessLaunchInfo() const
Environment ComputeEnvironment() const
void Arg0ValueChangedCallback()
bool GetUserSpecifiedTrapHandlerNames(Args &args) const
uint64_t GetExprErrorLimit() const
bool GetEnableAutoImportClangModules() const
bool GetDebugUtilityExpression() const
void CheckJITObjectsDir()
bool GetSkipPrologue() const
DynamicClassInfoHelper GetDynamicClassInfoHelper() const
FileSpec GetStandardOutputPath() const
void InputPathValueChangedCallback()
void SetDisplayRuntimeSupportValues(bool b)
uint32_t GetMaximumNumberOfChildrenToDisplay() const
void SetRequireHardwareBreakpoints(bool b)
void SetDisableSTDIO(bool b)
bool GetAutoInstallMainExecutable() const
const char * GetDisassemblyFeatures() const
RealpathPrefixes GetSourceRealpathPrefixes() const
uint64_t GetNumberOfRetriesWithFixits() const
uint64_t GetExprAllocSize() const
llvm::StringRef GetExpressionPrefixContents()
PathMappingList & GetObjectPathMap() const
const char * GetDisassemblyFlavor() const
void SetPreloadSymbols(bool b)
FileSpec GetStandardInputPath() const
bool GetInheritTCC() const
void InheritTCCValueChangedCallback()
lldb::DynamicValueType GetPreferDynamicValue() const
void DisableSTDIOValueChangedCallback()
InlineStrategy GetInlineStrategy() const
Environment GetTargetEnvironment() const
bool GetDisplayRuntimeSupportValues() const
void SetDetachOnError(bool b)
void SetUserSpecifiedTrapHandlerNames(const Args &args)
bool GetUseHexImmediates() const
bool GetPreloadSymbols() const
uint32_t GetMaxZeroPaddingInFloatFormat() const
uint64_t GetExprAllocAddress() const
void DetachOnErrorValueChangedCallback()
LoadCWDlldbinitFile GetLoadCWDlldbinitFile() const
Environment GetInheritedEnvironment() const
void SetArg0(llvm::StringRef arg)
void EnvVarsValueChangedCallback()
bool GetInjectLocalVariables(ExecutionContext *exe_ctx) const
bool ShowHexVariableValuesWithLeadingZeroes() const
SourceLanguage GetLanguage() const
void OutputPathValueChangedCallback()
Environment GetEnvironment() const
void SetProcessLaunchInfo(const ProcessLaunchInfo &launch_info)
void RunArgsValueChangedCallback()
FileSpec GetSaveJITObjectsDir() const
void SetEnvironment(Environment env)
LoadScriptFromSymFile GetLoadScriptFromSymbolFile() const
const char * GetDisassemblyCPU() const
void SetStandardErrorPath(llvm::StringRef path)
bool GetRunArguments(Args &args) const
bool GetBreakpointsConsultPlatformAvoidList()
FileSpecList GetExecutableSearchPaths()
void SetDisableASLR(bool b)
ArchSpec GetDefaultArchitecture() const
Disassembler::HexImmediateStyle GetHexImmediateStyle() const
bool GetParallelModuleLoad() const
void SetUseDIL(ExecutionContext *exe_ctx, bool b)
std::unique_ptr< TargetExperimentalProperties > m_experimental_properties_up
FileSpecList GetClangModuleSearchPaths()
void SetStandardOutputPath(llvm::StringRef path)
void ErrorPathValueChangedCallback()
bool GetRequireHardwareBreakpoints() const
PathMappingList & GetSourcePathMap() const
bool GetAutoSourceMapRelative() const
bool GetUseDIL(ExecutionContext *exe_ctx) const
void SetDefaultArchitecture(const ArchSpec &arch)
void SetStandardInputPath(llvm::StringRef path)
TargetProperties(Target *target)
bool GetDisplayExpressionsInCrashlogs() const
void DisableASLRValueChangedCallback()
bool GetEnableAutoApplyFixIts() const
void SetDebugUtilityExpression(bool debug)
std::pair< uint32_t, bool > GetMaximumDepthOfChildrenToDisplay() const
Get the max depth value, augmented with a bool to indicate whether the depth is the default.
bool GetDetachOnError() const
std::unique_ptr< Architecture > m_plugin_up
const Arch & operator=(const ArchSpec &spec)
Arch(const ArchSpec &spec)
StringList & GetCommands()
void SetActionFromString(const std::string &strings)
void SetActionFromStrings(const std::vector< std::string > &strings)
StopHookResult HandleStop(ExecutionContext &exc_ctx, lldb::StreamSP output_sp) override
void GetSubclassDescription(Stream &s, lldb::DescriptionLevel level) const override
Status SetScriptCallback(std::string class_name, StructuredData::ObjectSP extra_args_sp)
StopHookResult HandleStop(ExecutionContext &exc_ctx, lldb::StreamSP output) override
void GetSubclassDescription(Stream &s, lldb::DescriptionLevel level) const override
StructuredDataImpl m_extra_args
This holds the dictionary of keys & values that can be used to parametrize any given callback's behav...
lldb::ScriptedStopHookInterfaceSP m_interface_sp
SymbolContextSpecifier * GetSpecifier()
void SetSpecifier(SymbolContextSpecifier *specifier)
std::unique_ptr< ThreadSpec > m_thread_spec_up
void SetThreadSpecifier(ThreadSpec *specifier)
ThreadSpec * GetThreadSpecifier()
lldb::TargetSP m_target_sp
StopHook(const StopHook &rhs)
bool ExecutionContextPasses(const ExecutionContext &exe_ctx)
lldb::TargetSP & GetTarget()
lldb::SymbolContextSpecifierSP m_specifier_sp
virtual void GetSubclassDescription(Stream &s, lldb::DescriptionLevel level) const =0
void GetDescription(Stream &s, lldb::DescriptionLevel level) const
void Dump(Stream *s) const override
static llvm::StringRef GetFlavorString()
static lldb::TargetSP GetCreatedTargetFromEvent(const Event *event_ptr)
static ModuleList GetModuleListFromEvent(const Event *event_ptr)
~TargetEventData() override
static const TargetEventData * GetEventDataFromEvent(const Event *event_ptr)
lldb::TargetSP m_created_target_sp
TargetEventData(const lldb::TargetSP &target_sp)
lldb::TargetSP m_target_sp
static lldb::TargetSP GetTargetFromEvent(const Event *event_ptr)
void ModulesDidLoad(ModuleList &module_list)
This call may preload module symbols, and may do so in parallel depending on the following target set...
lldb::ThreadSP CalculateThread() override
llvm::Expected< uint32_t > AddScriptedFrameProviderDescriptor(const ScriptedFrameProviderDescriptor &descriptor)
Add or update a scripted frame provider descriptor for this target.
StopHookCollection m_stop_hooks
Module * GetExecutableModulePointer()
void Dump(Stream *s, lldb::DescriptionLevel description_level)
Dump a description of this object to a Stream.
bool m_suppress_stop_hooks
void DisableAllBreakpoints(bool internal_also=false)
lldb::WatchpointSP CreateWatchpoint(lldb::addr_t addr, size_t size, const CompilerType *type, uint32_t kind, Status &error)
void ApplyNameToBreakpoints(BreakpointName &bp_name)
lldb::TraceSP GetTrace()
Get the Trace object containing processor trace information of this target.
PathMappingList & GetImageSearchPathList()
void FinalizeFileActions(ProcessLaunchInfo &info)
lldb::addr_t GetCallableLoadAddress(lldb::addr_t load_addr, AddressClass addr_class=AddressClass::eInvalid) const
Get load_addr as a callable code load address for this target.
lldb::addr_t GetOpcodeLoadAddress(lldb::addr_t load_addr, AddressClass addr_class=AddressClass::eInvalid) const
Get load_addr as an opcode for this target.
lldb::BreakpointSP CreateScriptedBreakpoint(const llvm::StringRef class_name, const FileSpecList *containingModules, const FileSpecList *containingSourceFiles, bool internal, bool request_hardware, StructuredData::ObjectSP extra_args_sp, Status *creation_error=nullptr)
static Target * GetTargetFromContexts(const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
lldb::addr_t GetBreakableLoadAddress(lldb::addr_t addr)
void ClearDummySignals(Args &signal_names)
Clear the dummy signals in signal_names from the target, or all signals if signal_names is empty.
static void ImageSearchPathsChanged(const PathMappingList &path_list, void *baton)
llvm::Expected< lldb_private::Address > GetEntryPointAddress()
This method will return the address of the starting function for this binary, e.g.
bool IgnoreWatchpointByID(lldb::watch_id_t watch_id, uint32_t ignore_count)
lldb::BreakpointSP CreateFuncRegexBreakpoint(const FileSpecList *containingModules, const FileSpecList *containingSourceFiles, RegularExpression func_regexp, lldb::LanguageType requested_language, LazyBool skip_prologue, bool internal, bool request_hardware)
lldb::BreakpointSP GetBreakpointByID(lldb::break_id_t break_id)
std::shared_ptr< StopHook > StopHookSP
void SymbolsDidLoad(ModuleList &module_list)
bool ClearAllWatchpointHistoricValues()
const std::vector< StopHookSP > GetStopHooks(bool internal=false) const
void SetTrace(const lldb::TraceSP &trace_sp)
Set the Trace object containing processor trace information of this target.
BreakpointList & GetBreakpointList(bool internal=false)
CompilerType GetRegisterType(const std::string &name, const lldb_private::RegisterFlags &flags, uint32_t byte_size)
BreakpointNameList m_breakpoint_names
lldb_private::SummaryStatisticsCache & GetSummaryStatisticsCache()
lldb::addr_t GetSectionLoadAddress(const lldb::SectionSP §ion_sp)
llvm::StringRef GetABIName() const
Returns the name of the target's ABI plugin.
SourceManager & GetSourceManager()
lldb::SearchFilterSP GetSearchFilterForModuleList(const FileSpecList *containingModuleList)
StopHookSP GetStopHookByID(lldb::user_id_t uid)
llvm::StringMap< DummySignalValues > m_dummy_signals
These are used to set the signal state when you don't have a process and more usefully in the Dummy t...
lldb::ProcessSP m_process_sp
Debugger & GetDebugger() const
lldb::SearchFilterSP m_search_filter_sp
PersistentExpressionState * GetPersistentExpressionStateForLanguage(lldb::LanguageType language)
void UpdateSignalsFromDummy(lldb::UnixSignalsSP signals_sp, lldb::StreamSP warning_stream_sp)
Updates the signals in signals_sp using the stored dummy signals.
bool m_is_dummy_target
Used to not run stop hooks for expressions.
static bool UpdateSignalFromDummy(lldb::UnixSignalsSP signals_sp, const DummySignalElement &element)
PathMappingList m_image_search_paths
bool ModuleIsExcludedForUnconstrainedSearches(const FileSpec &module_spec)
Return whether this FileSpec corresponds to a module that should be considered for general searches.
lldb::StackFrameSP CalculateStackFrame() override
SectionLoadList & GetSectionLoadList()
lldb::addr_t GetPersistentSymbol(ConstString name)
void PrimeFromDummyTarget(Target &target)
bool RemoveScriptedFrameProviderDescriptor(uint32_t id)
Remove a scripted frame provider descriptor by id.
lldb::RegisterTypeBuilderSP m_register_type_builder_sp
static void SettingsTerminate()
bool EnableWatchpointByID(lldb::watch_id_t watch_id)
bool ResolveFileAddress(lldb::addr_t load_addr, Address &so_addr)
bool ClearAllWatchpointHitCounts()
size_t ReadMemoryFromFileCache(const Address &addr, void *dst, size_t dst_len, Status &error)
void ClearAllLoadedSections()
std::vector< lldb::TypeSystemSP > GetScratchTypeSystems(bool create_on_demand=true)
size_t ReadScalarIntegerFromMemory(const Address &addr, uint32_t byte_size, bool is_signed, Scalar &scalar, Status &error, bool force_live_memory=false)
void AddNameToBreakpoint(BreakpointID &id, llvm::StringRef name, Status &error)
void DumpSectionLoadList(Stream &s)
void DeleteCurrentProcess()
BreakpointList m_internal_breakpoint_list
int64_t ReadSignedIntegerFromMemory(const Address &addr, size_t integer_byte_size, int64_t fail_value, Status &error, bool force_live_memory=false)
void DisableAllowedBreakpoints()
bool SetSectionUnloaded(const lldb::SectionSP §ion_sp)
lldb::TargetSP CalculateTarget() override
const lldb::ProcessSP & GetProcessSP() const
void ClearModules(bool delete_locations)
bool RemoveBreakpointByID(lldb::break_id_t break_id)
lldb::ModuleSP GetOrCreateModule(const ModuleSpec &module_spec, bool notify, Status *error_ptr=nullptr)
Find a binary on the system and return its Module, or return an existing Module that is already in th...
static bool ResetSignalFromDummy(lldb::UnixSignalsSP signals_sp, const DummySignalElement &element)
Architecture * GetArchitecturePlugin() const
llvm::json::Value ReportStatistics(const lldb_private::StatisticsOptions &options)
Get metrics associated with this target in JSON format.
FunctionCaller * GetFunctionCallerForLanguage(lldb::LanguageType language, const CompilerType &return_type, const Address &function_address, const ValueList &arg_value_list, const char *name, Status &error)
void EnableAllBreakpoints(bool internal_also=false)
Status Launch(ProcessLaunchInfo &launch_info, Stream *stream)
bool DisableBreakpointByID(lldb::break_id_t break_id)
lldb::BreakpointSP CreateBreakpointAtUserEntry(Status &error)
BreakpointName * FindBreakpointName(ConstString name, bool can_create, Status &error)
llvm::Expected< lldb::TraceSP > CreateTrace()
Create a Trace object for the current target using the using the default supported tracing technology...
lldb::TraceSP m_trace_sp
An optional lldb_private::Trace object containing processor trace information of this target.
bool RemoveAllWatchpoints(bool end_to_end=true)
bool ReadPointerFromMemory(const Address &addr, Status &error, Address &pointer_addr, bool force_live_memory=false)
void UndoCreateStopHook(lldb::user_id_t uid)
If you tried to create a stop hook, and that failed, call this to remove the stop hook,...
WatchpointList m_watchpoint_list
BreakpointList m_breakpoint_list
lldb::SourceManagerUP m_source_manager_up
bool RemoveWatchpointByID(lldb::watch_id_t watch_id)
bool ResolveLoadAddress(lldb::addr_t load_addr, Address &so_addr, uint32_t stop_id=SectionLoadHistory::eStopIDNow, bool allow_section_end=false)
size_t ReadStringFromMemory(const Address &addr, char *dst, size_t max_bytes, Status &error, size_t type_width, bool force_live_memory=true)
Read a NULL terminated string from memory.
const llvm::DenseMap< uint32_t, ScriptedFrameProviderDescriptor > & GetScriptedFrameProviderDescriptors() const
Get all scripted frame provider descriptors for this target.
void DeleteBreakpointName(ConstString name)
void NotifyWillClearList(const ModuleList &module_list) override
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
void NotifyModuleAdded(const ModuleList &module_list, const lldb::ModuleSP &module_sp) override
Implementing of ModuleList::Notifier.
llvm::Expected< lldb::TypeSystemSP > GetScratchTypeSystemForLanguage(lldb::LanguageType language, bool create_on_demand=true)
void ConfigureBreakpointName(BreakpointName &bp_name, const BreakpointOptions &options, const BreakpointName::Permissions &permissions)
lldb_private::SummaryStatisticsSP GetSummaryStatisticsSPForProviderName(lldb_private::TypeSummaryImpl &summary_provider)
lldb::SearchFilterSP GetSearchFilterForModuleAndCUList(const FileSpecList *containingModules, const FileSpecList *containingSourceFiles)
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
bool SetStopHookActiveStateByID(lldb::user_id_t uid, bool active_state)
const lldb::ProcessSP & CreateProcess(lldb::ListenerSP listener_sp, llvm::StringRef plugin_name, const FileSpec *crash_file, bool can_connect)
void SetAllStopHooksActiveState(bool active_state)
std::vector< StopHookSP > m_internal_stop_hooks
lldb::ExpressionVariableSP GetPersistentVariable(ConstString name)
void NotifyModulesRemoved(lldb_private::ModuleList &module_list) override
StopHookSP CreateStopHook(StopHook::StopHookKind kind, bool internal=false)
Add an empty stop hook to the Target's stop hook list, and returns a shared pointer to the new hook.
size_t ReadCStringFromMemory(const Address &addr, std::string &out_str, Status &error, bool force_live_memory=false)
std::recursive_mutex m_mutex
An API mutex that is used by the lldb::SB* classes make the SB interface thread safe.
std::recursive_mutex m_frame_provider_descriptors_mutex
lldb::user_id_t m_target_unique_id
The globally unique ID assigned to this target.
void ModulesDidUnload(ModuleList &module_list, bool delete_locations)
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
llvm::Expected< lldb::DisassemblerSP > ReadInstructions(const Address &start_addr, uint32_t count, const char *flavor_string=nullptr)
llvm::Expected< lldb::TraceSP > GetTraceOrCreate()
If a Trace object is present, this returns it, otherwise a new Trace is created with Trace::CreateTra...
void NotifyModuleUpdated(const ModuleList &module_list, const lldb::ModuleSP &old_module_sp, const lldb::ModuleSP &new_module_sp) override
SummaryStatisticsCache m_summary_statistics_cache
Status SerializeBreakpointsToFile(const FileSpec &file, const BreakpointIDList &bp_ids, bool append)
void DidExec()
Called as the last function in Process::DidExec().
void SaveScriptedLaunchInfo(lldb_private::ProcessInfo &process_info)
lldb::user_id_t m_stop_hook_next_id
void RemoveAllStopHooks()
static FileSpecList GetDefaultExecutableSearchPaths()
lldb::BreakpointSP CreateExceptionBreakpoint(enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal, Args *additional_args=nullptr, Status *additional_args_error=nullptr)
void NotifyBreakpointChanged(Breakpoint &bp, lldb::BreakpointEventType event_kind)
Sends a breakpoint notification event.
lldb::SearchFilterSP GetSearchFilterForModule(const FileSpec *containingModule)
llvm::StringMapEntry< DummySignalValues > DummySignalElement
std::recursive_mutex & GetAPIMutex()
static llvm::StringRef GetStaticBroadcasterClass()
static FileSpecList GetDefaultDebugFileSearchPaths()
void EnableAllowedBreakpoints()
virtual size_t ReadMemory(const Address &addr, void *dst, size_t dst_len, Status &error, bool force_live_memory=false, lldb::addr_t *load_addr_ptr=nullptr, bool *did_read_live_memory=nullptr)
llvm::Error SetLabel(llvm::StringRef label)
Set a label for a target.
uint32_t m_latest_stop_hook_id
void RemoveAllowedBreakpoints()
bool DisableAllWatchpoints(bool end_to_end=true)
bool RunStopHooks(bool at_initial_stop=false)
void ClearSectionLoadList()
lldb::addr_t GetReasonableReadSize(const Address &addr)
Return a recommended size for memory reads at addr, optimizing for cache usage.
lldb::PlatformSP m_platform_sp
The platform for this target.
llvm::Expected< std::unique_ptr< UtilityFunction > > CreateUtilityFunction(std::string expression, std::string name, lldb::LanguageType language, ExecutionContext &exe_ctx)
Creates and installs a UtilityFunction for the given language.
static TargetProperties & GetGlobalProperties()
Status Install(ProcessLaunchInfo *launch_info)
lldb::PlatformSP GetPlatform()
void NotifyModuleRemoved(const ModuleList &module_list, const lldb::ModuleSP &module_sp) override
lldb::BreakpointSP CreateAddressInModuleBreakpoint(lldb::addr_t file_addr, bool internal, const FileSpec &file_spec, bool request_hardware)
lldb::BreakpointSP CreateBreakpoint(const FileSpecList *containingModules, const FileSpec &file, uint32_t line_no, uint32_t column, lldb::addr_t offset, LazyBool check_inlines, LazyBool skip_prologue, bool internal, bool request_hardware, LazyBool move_to_nearest_code)
void RemoveAllBreakpoints(bool internal_also=false)
lldb::BreakpointSP CreateSourceRegexBreakpoint(const FileSpecList *containingModules, const FileSpecList *source_file_list, const std::unordered_set< std::string > &function_names, RegularExpression source_regex, bool internal, bool request_hardware, LazyBool move_to_nearest_code)
static ArchSpec GetDefaultArchitecture()
void ResetBreakpointHitCounts()
Resets the hit count of all breakpoints.
const ModuleList & GetImages() const
Get accessor for the images for this process.
const ArchSpec & GetArchitecture() const
WatchpointList & GetWatchpointList()
@ eBroadcastBitModulesLoaded
@ eBroadcastBitSymbolsLoaded
@ eBroadcastBitModulesUnloaded
@ eBroadcastBitWatchpointChanged
@ eBroadcastBitBreakpointChanged
@ eBroadcastBitNewTargetCreated
bool EnableBreakpointByID(lldb::break_id_t break_id)
uint64_t ReadUnsignedIntegerFromMemory(const Address &addr, size_t integer_byte_size, uint64_t fail_value, Status &error, bool force_live_memory=false)
void InvalidateThreadFrameProviders()
Invalidate all potentially cached frame providers for all threads and trigger a stack changed event f...
bool IgnoreAllWatchpoints(uint32_t ignore_count)
void AddBreakpoint(lldb::BreakpointSP breakpoint_sp, bool internal)
std::string m_target_session_name
The target session name for this target, used to name debugging sessions in DAP.
TypeSystemMap m_scratch_type_system_map
void AddBreakpointName(std::unique_ptr< BreakpointName > bp_name)
SectionLoadHistory m_section_load_history
void GetBreakpointNames(std::vector< std::string > &names)
Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp, bool is_dummy_target)
Construct with optional file and arch.
size_t UnloadModuleSections(const lldb::ModuleSP &module_sp)
llvm::DenseMap< uint32_t, ScriptedFrameProviderDescriptor > m_frame_provider_descriptors
Map of scripted frame provider descriptors for this target.
bool m_valid
This records the last natural stop at which we ran a stop-hook.
bool DisableWatchpointByID(lldb::watch_id_t watch_id)
void AddDummySignal(llvm::StringRef name, LazyBool pass, LazyBool print, LazyBool stop)
Add a signal to the Target's list of stored signals/actions.
void ClearScriptedFrameProviderDescriptors()
Clear all scripted frame provider descriptors for this target.
lldb::WatchpointSP m_last_created_watchpoint
Status CreateBreakpointsFromFile(const FileSpec &file, BreakpointIDList &new_bps)
void SetREPL(lldb::LanguageType language, lldb::REPLSP repl_sp)
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
lldb::StackFrameRecognizerManagerUP m_frame_recognizer_manager_up
Stores the frame recognizers of this target.
lldb::REPLSP GetREPL(Status &err, lldb::LanguageType language, const char *repl_options, bool can_create)
UserExpression * GetUserExpressionForLanguage(llvm::StringRef expr, llvm::StringRef prefix, SourceLanguage language, Expression::ResultType desired_type, const EvaluateExpressionOptions &options, ValueObject *ctx_obj, Status &error)
ModuleList m_images
The list of images for this process (shared libraries and anything dynamically loaded).
lldb::ProcessSP CalculateProcess() override
void PrintDummySignals(Stream &strm, Args &signals)
Print all the signals set in this target.
void SetPlatform(const lldb::PlatformSP &platform_sp)
bool SetSectionLoadAddress(const lldb::SectionSP §ion, lldb::addr_t load_addr, bool warn_multiple=false)
Status Attach(ProcessAttachInfo &attach_info, Stream *stream)
static void SetDefaultArchitecture(const ArchSpec &arch)
lldb::BreakpointSP m_last_created_breakpoint
void RemoveNameFromBreakpoint(lldb::BreakpointSP &bp_sp, ConstString name)
bool RemoveStopHookByID(lldb::user_id_t uid)
static void SettingsInitialize()
bool EnableAllWatchpoints(bool end_to_end=true)
std::recursive_mutex m_private_mutex
When the private state thread calls SB API's - usually because it is running OS plugin or Python Thre...
lldb::ExpressionResults EvaluateExpression(llvm::StringRef expression, ExecutionContextScope *exe_scope, lldb::ValueObjectSP &result_valobj_sp, const EvaluateExpressionOptions &options=EvaluateExpressionOptions(), std::string *fixed_expression=nullptr, ValueObject *ctx_obj=nullptr)
bool MergeArchitecture(const ArchSpec &arch_spec)
uint32_t GetSize(bool can_update=true)
lldb::ThreadSP GetThreadAtIndex(uint32_t idx, bool can_update=true)
@ eBroadcastBitStackChanged
static llvm::Expected< lldb::TraceSP > FindPluginForLiveProcess(llvm::StringRef plugin_name, Process &process)
Find a trace plug-in to trace a live process.
Represents UUID's of various sizes.
void Dump(Stream &s) const
Encapsulates a one-time expression for use in lldb.
static lldb::ExpressionResults Evaluate(ExecutionContext &exe_ctx, const EvaluateExpressionOptions &options, llvm::StringRef expr_cstr, llvm::StringRef expr_prefix, lldb::ValueObjectSP &result_valobj_sp, std::string *fixed_expression=nullptr, ValueObject *ctx_obj=nullptr)
Evaluate one expression in the scratch context of the target passed in the exe_ctx and return its res...
void GetListMutex(std::unique_lock< std::recursive_mutex > &lock)
Sets the passed in Locker to hold the Watchpoint List mutex.
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_WATCH_TYPE_WRITE
#define LLDB_INVALID_BREAK_ID
#define LLDB_INVALID_SIGNAL_NUMBER
#define LLDB_INVALID_INDEX32
#define LLDB_WATCH_TYPE_IS_VALID(type)
#define LLDB_BREAK_ID_IS_INTERNAL(bid)
#define LLDB_WATCH_TYPE_MODIFY
#define LLDB_WATCH_TYPE_READ
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_PROCESS_ID
@ SelectMostRelevantFrame
A class that represents a running process on the host machine.
@ eMemoryModuleLoadLevelPartial
@ eMemoryModuleLoadLevelComplete
@ eMemoryModuleLoadLevelMinimal
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< SummaryStatistics > SummaryStatisticsSP
@ eLoadScriptFromSymFileTrue
@ eLoadScriptFromSymFileTrusted
@ eLoadScriptFromSymFileFalse
@ eLoadScriptFromSymFileWarn
static uint32_t bit(const uint32_t val, const uint32_t msbit)
@ eDynamicClassInfoHelperCopyRealizedClassList
@ eDynamicClassInfoHelperGetRealizedClassList
@ eDynamicClassInfoHelperAuto
@ eDynamicClassInfoHelperRealizedClassesStruct
OptionEnumValues GetDynamicValueTypes()
@ eImportStdModuleFallback
void LoadTypeSummariesForModule(lldb::ModuleSP module_sp)
Load type summaries embedded in the binary.
const char * StateAsCString(lldb::StateType state)
Converts a StateType to a C string.
llvm::ArrayRef< OptionEnumValueElement > OptionEnumValues
void LoadFormattersForModule(lldb::ModuleSP module_sp)
Load data formatters embedded in the binary.
@ eInlineBreakpointsNever
@ eInlineBreakpointsAlways
@ eInlineBreakpointsHeaders
std::shared_ptr< lldb_private::OptionValueProperties > OptionValuePropertiesSP
std::shared_ptr< lldb_private::Trace > TraceSP
std::shared_ptr< lldb_private::TypeSystem > TypeSystemSP
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::SearchFilter > SearchFilterSP
std::shared_ptr< lldb_private::BreakpointResolver > BreakpointResolverSP
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
@ eDescriptionLevelVerbose
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::ExpressionVariable > ExpressionVariableSP
std::shared_ptr< lldb_private::UnixSignals > UnixSignalsSP
std::shared_ptr< lldb_private::Platform > PlatformSP
StateType
Process and Thread States.
@ eStateConnected
Process is connected to remote debug services, but not launched or attached to anything yet.
@ eStateStopped
Process or thread is stopped and can be examined.
@ eStateAttaching
Process is currently trying to attach.
@ eStateExited
Process has exited and can't be examined.
LanguageType
Programming language type.
@ eLanguageTypeMipsAssembler
Mips_Assembler.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeC
Non-standardized C, such as K&R.
std::shared_ptr< lldb_private::Stream > StreamSP
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
ExpressionResults
The results of expression evaluation.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::BreakpointPrecondition > BreakpointPreconditionSP
std::shared_ptr< lldb_private::Event > EventSP
ReturnStatus
Command Return Status Types.
@ eReturnStatusSuccessContinuingResult
@ eReturnStatusSuccessContinuingNoResult
std::shared_ptr< lldb_private::Watchpoint > WatchpointSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::Section > SectionSP
std::shared_ptr< lldb_private::Target > TargetSP
@ eStructuredDataTypeBoolean
std::shared_ptr< lldb_private::Module > ModuleSP
std::shared_ptr< lldb_private::EventData > EventDataSP
std::shared_ptr< lldb_private::REPL > REPLSP
A SmallBitVector that represents a set of source languages (lldb::LanguageType).
llvm::SmallBitVector bitvector
std::optional< lldb::LanguageType > GetSingularLanguage()
If the set contains a single language only, return it.
This struct contains the metadata needed to instantiate a frame provider and optional filters to cont...
uint32_t GetID() const
Get a unique identifier for this descriptor based on its contents.
llvm::StringRef GetName() const
Get the name of this descriptor (the scripted class name).
bool IsValid() const
Check if this descriptor has valid metadata for script-based providers.
A type-erased pair of llvm::dwarf::SourceLanguageName and version.
lldb::LanguageType AsLanguageType() const
llvm::StringRef GetDescription() const
UserID(lldb::user_id_t uid=LLDB_INVALID_UID)
Construct with optional user ID.
lldb::user_id_t GetID() const
Get accessor for the user ID.
std::string triple
The triple of this executable module.
bool is_start_entry
If true, this entry was emitted at the beginning of an event (eg., before the executable is set).
UUID uuid
The same as the executable-module's UUID.
lldb::pid_t pid
PID of the process owned by this target.
Helper RAII class for collecting telemetry.
void DispatchOnExit(llvm::unique_function< void(Info *info)> final_callback)
void DispatchNow(llvm::unique_function< void(Info *info)> populate_fields_cb)