64#include "llvm/ADT/ScopeExit.h"
65#include "llvm/ADT/StringRef.h"
66#include "llvm/Support/FileSystem.h"
67#include "llvm/Support/FormatAdapters.h"
73 const char *prefix_cstr,
74 bool show_stopped_process_status,
Stream &strm) {
79 bool exe_valid =
false;
84 ::strcpy(exe_path,
"<none>");
86 std::string formatted_label =
"";
87 const std::string &label = target->
GetLabel();
89 formatted_label =
" (" + label +
")";
92 strm.
Printf(
"%starget #%u%s: %s", prefix_cstr ? prefix_cstr :
"", target_idx,
93 formatted_label.data(), exe_path);
95 uint32_t properties = 0;
103 strm.
Format(
"{0}platform={1}", properties++ > 0 ?
", " :
" ( ",
104 platform_sp->GetName());
107 bool show_process_status =
false;
110 StateType state = process_sp->GetState();
111 if (show_stopped_process_status)
115 strm.
Printf(
"%spid=%" PRIu64, properties++ > 0 ?
", " :
" ( ", pid);
116 strm.
Printf(
"%sstate=%s", properties++ > 0 ?
", " :
" ( ", state_cstr);
122 if (show_process_status) {
123 const bool only_threads_with_stop_reason =
true;
124 const uint32_t start_frame = 0;
125 const uint32_t num_frames = 1;
126 const uint32_t num_frames_with_source = 1;
127 const bool stop_format =
false;
128 process_sp->GetStatus(strm);
129 process_sp->GetThreadStatus(strm, only_threads_with_stop_reason,
130 start_frame, num_frames, num_frames_with_source,
136 bool show_stopped_process_status,
Stream &strm) {
141 for (uint32_t i = 0; i < num_targets; ++i) {
144 bool is_selected = target_sp.get() == selected_target_sp.get();
146 show_stopped_process_status, strm);
153#define LLDB_OPTIONS_target_dependents
154#include "CommandOptions.inc"
163 return llvm::ArrayRef(g_target_dependents_options);
171 if (option_value.empty()) {
176 const char short_option =
177 g_target_dependents_options[option_idx].short_option;
178 if (short_option ==
'd') {
181 option_value, g_target_dependents_options[option_idx].enum_values, 0,
187 "unrecognized short option '%c'", short_option);
207#pragma mark CommandObjectTargetCreate
213 interpreter,
"target create",
214 "Create a target using the argument as the main executable.",
218 "Fullpath to a core file to use for this target."),
220 "Optional name for this target.", nullptr),
223 "Fullpath to a stand alone debug "
224 "symbols file for when debug symbols "
225 "are not in the executable."),
228 "Fullpath to the file on the remote host if debugging remotely.") {
259 llvm::toString(file.takeError()));
264 if (argc == 1 || core_file || remote_file) {
273 llvm::toString(file.takeError()));
281 bool must_set_platform_path =
false;
286 llvm::StringRef arch_cstr =
m_arch_option.GetArchitectureName();
288 debugger, file_path, arch_cstr,
297 const llvm::StringRef label =
298 m_label.GetOptionValue().GetCurrentValueAsRef();
299 if (!label.empty()) {
300 if (
auto E = target_sp->SetLabel(label))
307 llvm::scope_exit on_error(
309 target_list.DeleteTarget(target_sp);
316 PlatformSP platform_sp = target_sp->GetPlatform();
320 file_spec.
SetFile(file_path, FileSpec::Style::native);
325 if (platform_sp && platform_sp->IsHost() &&
335 if (!platform_sp->GetFileExists(remote_file)) {
336 Status err = platform_sp->PutFile(file_spec, remote_file);
350 Status err = platform_sp->GetFile(remote_file, file_spec);
364 if (platform_sp->IsHost()) {
365 result.
AppendError(
"Supply a local file, not a remote file, "
366 "when debugging on the host.");
369 if (platform_sp->IsConnected() && !platform_sp->GetFileExists(remote_file)) {
370 result.
AppendError(
"remote --> local transfer without local "
371 "path is not implemented yet");
378 target_sp->SetProcessLaunchInfo(launch_info);
382 result.
AppendError(
"no platform found for target");
387 if (symfile || remote_file) {
388 ModuleSP module_sp(target_sp->GetExecutableModule());
391 module_sp->SetSymbolFileFileSpec(symfile);
393 std::string remote_path = remote_file.
GetPath();
394 target_sp->SetArg0(remote_path.c_str());
395 module_sp->SetPlatformFileSpec(remote_file);
400 if (must_set_platform_path) {
403 target_sp->GetOrCreateModule(main_module_spec,
true );
405 module_sp->SetPlatformFileSpec(remote_file);
411 target_sp->AppendExecutableSearchPaths(core_file_dir);
413 ProcessSP process_sp(target_sp->CreateProcess(
414 GetDebugger().GetListener(), llvm::StringRef(), &core_file,
false));
421 target_sp->GetStatistics().GetLoadCoreTime());
422 error = process_sp->LoadCore();
430 "Core file '{0}' ({1}) was loaded.\n", core_file.
GetPath(),
431 target_sp->GetArchitecture().GetArchitectureName());
432 if (
auto core_args = process_sp->GetCoreFileArgs())
443 "Current executable set to '{0}' ({1}).",
445 target_sp->GetArchitecture().GetArchitectureName());
451 "argument, or use the --core option",
467#pragma mark CommandObjectTargetList
473 interpreter,
"target list",
474 "List all current targets in the current debug session.", nullptr) {
483 bool show_stopped_process_status =
false;
485 show_stopped_process_status, strm) == 0) {
492#pragma mark CommandObjectTargetSelect
498 interpreter,
"target select",
499 "Select a target as the current target by target index.", nullptr) {
512 if (llvm::to_integer(target_identifier, target_idx)) {
513 if (target_idx < num_targets) {
516 bool show_stopped_process_status =
false;
520 if (num_targets > 0) {
522 "index %u is out of range, valid target indexes are 0 - %u",
523 target_idx, num_targets - 1);
526 "index %u is out of range since there are no active targets",
531 for (
size_t i = 0; i < num_targets; i++) {
533 const std::string &label = target_sp->GetLabel();
534 if (!label.empty() && label == target_identifier) {
544 bool show_stopped_process_status =
false;
554 "'target select' takes a single argument: a target index\n");
559#pragma mark CommandObjectTargetDelete
565 "Delete one or more targets by target index.",
571 "Perform extra cleanup to minimize memory consumption after "
572 "deleting the target. "
573 "By default, LLDB will keep in memory any modules previously "
574 "loaded by the target as well "
575 "as all of its debug info. Specifying --clean will unload all of "
576 "these shared modules and "
577 "cause them to be reparsed again the next time the target is run",
592 std::vector<TargetSP> delete_target_list;
599 }
else if (argc > 0) {
602 if (num_targets == 0) {
607 for (
auto &entry : args.
entries()) {
609 if (entry.ref().getAsInteger(0, target_idx)) {
614 if (target_idx < num_targets) {
617 delete_target_list.push_back(target_sp);
623 "target indexes are 0 - %u",
624 target_idx, num_targets - 1);
627 "target index %u is out of range, the only valid index is 0",
638 delete_target_list.push_back(target_sp);
641 const size_t num_targets_to_delete = delete_target_list.size();
642 for (
size_t idx = 0; idx < num_targets_to_delete; ++idx) {
643 target_sp = delete_target_list[idx];
645 target_sp->Destroy();
650 const bool mandatory =
true;
654 (uint32_t)num_targets_to_delete);
667 interpreter,
"target show-launch-environment",
668 "Shows the environment being passed to the process when launched, "
669 "taking info account 3 settings: target.env-vars, "
670 "target.inherit-env and target.unset-env-vars.",
671 nullptr, eCommandRequiresTarget) {}
680 std::vector<Environment::value_type *> env_vector;
681 env_vector.reserve(env.size());
683 env_vector.push_back(&KV);
684 std::sort(env_vector.begin(), env_vector.end(),
685 [](Environment::value_type *a, Environment::value_type *b) {
686 return a->first() < b->first();
690 for (
auto &KV : env_vector)
691 strm.
Format(
"{0}={1}\n", KV->first(), KV->second);
697#pragma mark CommandObjectTargetVariable
706 "Read global variables for the current target, "
707 "before or while running a process.",
708 nullptr, eCommandRequiresTarget),
713 "A basename or fullpath to a file that contains "
714 "global variables. This option can be "
715 "specified multiple times."),
719 "A basename or fullpath to a shared library to use in the search "
721 "variables. This option can be specified multiple times.") {
740 const char *root_name) {
743 if (!valobj_sp->GetTargetSP()->GetDisplayRuntimeSupportValues() &&
744 valobj_sp->IsRuntimeSupportValue())
747 switch (var_sp->GetScope()) {
778 bool show_fullpaths =
false;
779 bool show_module =
true;
780 if (var_sp->DumpDeclaration(&s, show_fullpaths, show_module))
790 if (llvm::Error
error = valobj_sp->Dump(s, options))
796 size_t old_size = variable_list.
GetSize();
801 return variable_list.
GetSize() - old_size;
812 if (variable_list.
Empty())
816 s.
Format(
"Global variables for {0} in {1}:\n",
819 s.
Printf(
"Global variables for %s\n",
820 sc.
module_sp->GetFileSpec().GetPath().c_str());
849 bool use_var_name =
false;
854 "error: invalid regular expression: '%s'\n", arg.c_str());
860 matches = variable_list.
GetSize();
863 arg.c_str(),
m_exe_ctx.GetBestExecutionContextScope(),
865 matches = variable_list.
GetSize();
873 for (uint32_t global_idx = 0; global_idx < matches; ++global_idx) {
880 m_exe_ctx.GetBestExecutionContextScope(), var_sp);
884 use_var_name ? var_sp->GetName().GetCString()
896 const size_t num_compile_units = compile_units.
GetSize();
897 const size_t num_shlibs = shlibs.
GetSize();
898 if (num_compile_units == 0 && num_shlibs == 0) {
899 bool success =
false;
906 const bool can_create =
true;
909 if (comp_unit_varlist_sp) {
910 size_t count = comp_unit_varlist_sp->GetSize();
923 "no global variables in current compile unit: {0}\n",
929 result.
AppendError(
"'target variable' takes one or more global "
930 "variable names as arguments\n");
935 if (num_shlibs > 0) {
936 for (
size_t shlib_idx = 0; shlib_idx < num_shlibs; ++shlib_idx) {
943 if (num_compile_units > 0) {
944 for (
size_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
945 module_sp->FindCompileUnits(
955 "target doesn't contain the specified shared library: %s",
956 module_file.
GetPath().c_str());
962 for (
size_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
969 const bool can_create =
true;
971 sc.comp_unit->GetVariableList(can_create));
972 if (comp_unit_varlist_sp)
975 }
else if (sc.module_sp) {
978 llvm::StringRef(
"."));
980 sc.module_sp->FindGlobalVariables(all_globals_regex,
UINT32_MAX,
1002#pragma mark CommandObjectTargetModulesSearchPathsAdd
1008 "Add new image search paths substitution pairs to "
1009 "the current target.",
1010 nullptr, eCommandRequiresTarget) {
1029 arg.push_back(old_prefix_arg);
1030 arg.push_back(new_prefix_arg);
1040 assert(target &&
"target guaranteed by eCommandRequiresTarget");
1043 result.
AppendError(
"add requires an even number of arguments\n");
1045 for (
size_t i = 0; i < argc; i += 2) {
1049 if (from[0] && to[0]) {
1051 "target modules search path adding ImageSearchPath "
1052 "pair: '%s' -> '%s'",
1054 bool last_pair = ((argc - i) == 2);
1056 from, to, last_pair);
1060 result.
AppendError(
"<path-prefix> can't be empty\n");
1062 result.
AppendError(
"<new-path-prefix> can't be empty\n");
1069#pragma mark CommandObjectTargetModulesSearchPathsClear
1075 "Clear all current image search path substitution "
1076 "pairs from the current target.",
1077 "target modules search-paths clear",
1078 eCommandRequiresTarget) {}
1085 assert(target &&
"target guaranteed by eCommandRequiresTarget");
1092#pragma mark CommandObjectTargetModulesSearchPathsInsert
1098 "Insert a new image search path substitution pair "
1099 "into the current target at the specified index.",
1100 nullptr, eCommandRequiresTarget) {
1112 arg1.push_back(index_arg);
1128 arg2.push_back(old_prefix_arg);
1129 arg2.push_back(new_prefix_arg);
1147 const size_t num = list.
GetSize();
1148 std::string old_path, new_path;
1149 for (
size_t i = 0; i < num; ++i) {
1153 strm << old_path <<
" -> " << new_path;
1161 assert(target &&
"target guaranteed by eCommandRequiresTarget");
1164 if (argc >= 3 && argc & 1) {
1165 uint32_t insert_idx;
1169 "<index> parameter is not an integer: '%s'",
1178 for (uint32_t i = 0; i < argc; i += 2, ++insert_idx) {
1182 if (from[0] && to[0]) {
1183 bool last_pair = ((argc - i) == 2);
1189 result.
AppendError(
"<path-prefix> can't be empty\n");
1191 result.
AppendError(
"<new-path-prefix> can't be empty\n");
1196 result.
AppendError(
"insert requires at least three arguments\n");
1201#pragma mark CommandObjectTargetModulesSearchPathsList
1207 "List all current image search path substitution "
1208 "pairs in the current target.",
1209 "target modules search-paths list",
1210 eCommandRequiresTarget) {}
1217 assert(target &&
"target guaranteed by eCommandRequiresTarget");
1223#pragma mark CommandObjectTargetModulesSearchPathsQuery
1229 interpreter,
"target modules search-paths query",
1230 "Transform a path using the first applicable image search path.",
1231 nullptr, eCommandRequiresTarget) {
1240 assert(target &&
"target guaranteed by eCommandRequiresTarget");
1242 result.
AppendError(
"query requires one argument\n");
1247 std::string transformed;
1259 bool full_triple, uint32_t width) {
1264 module->GetArchitecture().DumpTriple(arch_strm.AsRawOstream());
1267 std::string arch_str = std::string(arch_strm.
GetString());
1270 strm.
Printf(
"%-*s", width, arch_str.c_str());
1278 module->GetUUID().Dump(strm);
1287 uint32_t num_matches = 0;
1290 num_matches =
module->ResolveSymbolContextsForFileSpec(
1291 file_spec, 0, false, eSymbolContextCompUnit, sc_list);
1293 bool first_module =
true;
1298 strm <<
"Line table for " << sc.comp_unit->GetPrimaryFile() <<
" in `"
1299 <<
module->GetFileSpec().GetFilename() << "\n";
1300 LineTable *line_table = sc.comp_unit->GetLineTable();
1306 strm <<
"No line table";
1308 first_module =
false;
1316 if (file_spec_ptr) {
1318 std::string fullpath = file_spec_ptr->
GetPath();
1319 strm.
Printf(
"%-*s", width, fullpath.c_str());
1328 strm.
Printf(
"%-*s", width,
"");
1333 if (file_spec_ptr) {
1336 llvm::AlignStyle::Left, width));
1343 strm.
Printf(
"%-*s", width,
"");
1348 if (file_spec_ptr) {
1351 llvm::AlignStyle::Left, width));
1358 strm.
Printf(
"%-*s", width,
"");
1362 std::lock_guard<std::recursive_mutex> guard(module_list.
GetMutex());
1363 const size_t num_modules = module_list.
GetSize();
1364 if (num_modules == 0)
1367 size_t num_dumped = 0;
1368 strm.
Format(
"Dumping headers for {0} module(s).\n", num_modules);
1372 if (num_dumped++ > 0) {
1376 ObjectFile *objfile = module_sp->GetObjectFile();
1378 objfile->
Dump(&strm);
1380 strm.
Format(
"No object file for module: {0:F}\n",
1381 module_sp->GetFileSpec());
1396 sort_order, name_preference);
1402 SectionList *section_list =
module->GetSectionList();
1404 strm.
Printf(
"Sections for '%s' (%s):\n",
1417 symbol_file->Dump(strm);
1425 Module *module,
bool errors_only,
1426 bool load_all_debug_info) {
1430 if (symbol_file->GetSeparateDebugInfo(d, errors_only,
1431 load_all_debug_info)) {
1433 std::make_shared<StructuredData::Dictionary>(std::move(d)));
1446 "------------------ --- -----------------------------------------");
1455 strm.
Printf(
"0x%16.16" PRIx64
" ", dwo_id);
1459 llvm::StringRef
error;
1461 strm <<
"E " <<
error;
1463 llvm::StringRef resolved_dwo_path;
1465 resolved_dwo_path)) {
1466 strm <<
" " << resolved_dwo_path;
1467 if (resolved_dwo_path.ends_with(
".dwp")) {
1468 llvm::StringRef dwo_name;
1470 strm <<
"(" << dwo_name <<
")";
1483 strm.
PutCString(
"------------------ --- ---------------------");
1490 uint32_t oso_mod_time;
1492 strm.
Printf(
"0x%16.16" PRIx32
" ", oso_mod_time);
1494 llvm::StringRef
error;
1496 strm <<
"E " <<
error;
1498 llvm::StringRef oso_path;
1500 strm <<
" " << oso_path;
1509 bool verbose,
bool all_ranges,
Stream &strm,
1510 std::optional<Stream::HighlightSettings> settings = std::nullopt) {
1512 strm.
Indent(
" Address: ");
1517 strm.
Indent(
" Summary: ");
1533 Module *module, uint32_t resolve_mask,
1535 bool verbose,
bool all_ranges) {
1544 else if (so_addr.
GetModule().get() != module)
1553 DumpAddress(exe_scope, so_addr, verbose, all_ranges, strm);
1562 const char *name,
bool name_is_regex,
1563 bool verbose,
bool all_ranges) {
1567 Symtab *symtab =
module->GetSymtab();
1573 std::vector<uint32_t> match_indexes;
1575 uint32_t num_matches = 0;
1576 if (name_is_regex) {
1585 if (num_matches > 0) {
1587 strm.
Printf(
"%u symbols match %s'%s' in ", num_matches,
1588 name_is_regex ?
"the regular expression " :
"", name);
1595 for (uint32_t i = 0; i < num_matches; ++i) {
1602 use_color && name_is_regex
1603 ? std::optional<Stream::HighlightSettings>{settings}
1611 use_color && name_is_regex
1612 ? std::optional<Stream::HighlightSettings>{settings}
1633 std::optional<Stream::HighlightSettings> settings = std::nullopt) {
1635 bool first_module =
true;
1641 if (sc.line_entry.IsValid())
1642 addr = sc.line_entry.range.GetBaseAddress();
1643 else if (sc.block && sc.block->GetContainingInlinedBlock())
1644 sc.block->GetContainingInlinedBlock()->GetStartAddress(addr);
1646 addr = sc.GetFunctionOrSymbolAddress();
1648 DumpAddress(exe_scope, addr, verbose, all_ranges, strm, settings);
1649 first_module =
false;
1656 const char *name,
bool name_is_regex,
1658 bool verbose,
bool all_ranges) {
1659 if (module && name && name[0]) {
1661 size_t num_matches = 0;
1662 if (name_is_regex) {
1664 module->FindFunctions(function_name_regex, options, sc_list);
1667 module->FindFunctions(function_name, CompilerDeclContext(),
1668 eFunctionNameTypeAuto, options, sc_list);
1670 num_matches = sc_list.
GetSize();
1673 strm.
Printf(
"%" PRIu64
" match%s found in ", (uint64_t)num_matches,
1674 num_matches > 1 ?
"es" :
"");
1679 strm, sc_list, verbose, all_ranges);
1688 Module *module,
const char *name_cstr,
1689 bool name_is_regex) {
1690 if (module && name_cstr && name_cstr[0]) {
1693 module->FindTypes(query, results);
1698 sc.
module_sp =
module->shared_from_this();
1702 if (type_list.
Empty())
1705 const uint64_t num_matches = type_list.
GetSize();
1708 strm.
Printf(
"%" PRIu64
" match%s found in ", num_matches,
1709 num_matches > 1 ?
"es" :
"");
1717 type_sp->GetFullCompilerType();
1720 TypeSP typedef_type_sp(type_sp);
1721 TypeSP typedefed_type_sp(typedef_type_sp->GetTypedefType());
1722 while (typedefed_type_sp) {
1724 strm.
Printf(
" typedef '%s': ",
1725 typedef_type_sp->GetName().GetCString());
1726 typedefed_type_sp->GetFullCompilerType();
1729 typedef_type_sp = typedefed_type_sp;
1730 typedefed_type_sp = typedef_type_sp->GetTypedefType();
1741 const char *name_cstr,
bool name_is_regex) {
1744 module.FindTypes(query, results);
1747 sc.
module_sp =
module.shared_from_this();
1749 if (type_list.
Empty())
1761 type_sp->GetFullCompilerType();
1764 TypeSP typedef_type_sp(type_sp);
1765 TypeSP typedefed_type_sp(typedef_type_sp->GetTypedefType());
1766 while (typedefed_type_sp) {
1768 strm.
Printf(
" typedef '%s': ",
1769 typedef_type_sp->GetName().GetCString());
1770 typedefed_type_sp->GetFullCompilerType();
1773 typedef_type_sp = typedefed_type_sp;
1774 typedefed_type_sp = typedef_type_sp->GetTypedefType();
1784 uint32_t line,
bool check_inlines,
1785 bool verbose,
bool all_ranges) {
1786 if (module && file_spec) {
1788 const uint32_t num_matches =
module->ResolveSymbolContextsForFileSpec(
1789 file_spec, line, check_inlines, eSymbolContextEverything, sc_list);
1790 if (num_matches > 0) {
1792 strm.
Printf(
"%u match%s found in ", num_matches,
1793 num_matches > 1 ?
"es" :
"");
1796 strm.
Printf(
":%u", line);
1802 strm, sc_list, verbose, all_ranges);
1811 bool check_global_list) {
1812 FileSpec module_file_spec(module_name);
1815 const size_t initial_size = module_list.
GetSize();
1817 if (check_global_list) {
1819 std::lock_guard<std::recursive_mutex> guard(
1823 for (
size_t image_idx = 0; image_idx < num_modules; ++image_idx) {
1828 module_sp =
module->shared_from_this();
1836 const size_t num_matches = module_list.
GetSize();
1840 if (num_matches == 0) {
1849 return module_list.
GetSize() - initial_size;
1852#pragma mark CommandObjectTargetModulesModuleAutoComplete
1879#pragma mark CommandObjectTargetModulesSourceFileAutoComplete
1889 const char *syntax, uint32_t flags)
1904#pragma mark CommandObjectTargetModulesDumpObjfile
1911 interpreter,
"target modules dump objfile",
1912 "Dump the object file headers from one or more target modules.",
1913 nullptr, eCommandRequiresTarget) {}
1920 assert(target &&
"target guaranteed by eCommandRequiresTarget");
1921 size_t num_dumped = 0;
1926 if (num_dumped == 0) {
1927 result.
AppendError(
"the target has no associated executable images");
1932 const char *arg_cstr;
1933 for (
int arg_idx = 0;
1936 size_t num_matched =
1938 if (num_matched == 0) {
1940 "unable to find an image that matches '{0}'", arg_cstr);
1948 if (num_dumped > 0) {
1951 result.
AppendError(
"no matching executable images found");
1956#define LLDB_OPTIONS_target_modules_dump_symtab
1957#include "CommandOptions.inc"
1964 interpreter,
"target modules dump symtab",
1965 "Dump the symbol table from one or more target modules.", nullptr,
1966 eCommandRequiresTarget) {}
1983 switch (short_option) {
1996 llvm_unreachable(
"Unimplemented option");
2007 return llvm::ArrayRef(g_target_modules_dump_symtab_options);
2017 assert(target &&
"target guaranteed by eCommandRequiresTarget");
2018 uint32_t num_dumped = 0;
2026 std::lock_guard<std::recursive_mutex> guard(module_list.
GetMutex());
2027 const size_t num_modules = module_list.
GetSize();
2028 if (num_modules > 0) {
2030 "Dumping symbol table for {0} modules.\n", num_modules);
2032 if (num_dumped > 0) {
2037 "Interrupted in dump all symtabs with {0} "
2038 "of {1} dumped.", num_dumped, num_modules))
2043 module_sp.get(),
m_options.m_sort_order,
2047 result.
AppendError(
"the target has no associated executable images");
2052 const char *arg_cstr;
2053 for (
int arg_idx = 0;
2057 const size_t num_matches =
2059 if (num_matches > 0) {
2062 if (num_dumped > 0) {
2067 "Interrupted in dump symtab list with {0} of {1} dumped.",
2068 num_dumped, num_matches))
2073 module_sp.get(),
m_options.m_sort_order,
2079 "unable to find an image that matches '{0}'", arg_cstr);
2086 result.
AppendError(
"no matching executable images found");
2093#pragma mark CommandObjectTargetModulesDumpSections
2102 interpreter,
"target modules dump sections",
2103 "Dump the sections from one or more target modules.",
2105 nullptr, eCommandRequiresTarget) {}
2112 assert(target &&
"target guaranteed by eCommandRequiresTarget");
2113 uint32_t num_dumped = 0;
2118 if (num_modules == 0) {
2119 result.
AppendError(
"the target has no associated executable images");
2125 for (
size_t image_idx = 0; image_idx < num_modules; ++image_idx) {
2127 "Interrupted in dump all sections with {0} of {1} dumped",
2128 image_idx, num_modules))
2138 const char *arg_cstr;
2139 for (
int arg_idx = 0;
2143 const size_t num_matches =
2145 if (num_matches > 0) {
2146 for (
size_t i = 0; i < num_matches; ++i) {
2148 "Interrupted in dump section list with {0} of {1} dumped.",
2161 std::lock_guard<std::recursive_mutex> guard(
2165 "unable to find an image that matches '{0}'", arg_cstr);
2173 result.
AppendError(
"no matching executable images found");
2178#pragma mark CommandObjectTargetModulesDumpClangAST
2187 interpreter,
"target modules dump ast",
2188 "Dump the clang ast for a given module's symbol file.",
2189 "target modules dump ast [--filter <name>] [<file1> ...]",
2190 eCommandRequiresTarget),
2192 "Dump only the decls whose names contain the specified filter "
2209 assert(target &&
"target guaranteed by eCommandRequiresTarget");
2211 const size_t num_modules = module_list.
GetSize();
2212 if (num_modules == 0) {
2213 result.
AppendError(
"the target has no associated executable images");
2217 llvm::StringRef filter =
m_filter.GetOptionValue().GetCurrentValueAsRef();
2226 if (
SymbolFile *sf = module_sp->GetSymbolFile())
2237 const size_t num_matches =
2239 if (num_matches == 0) {
2241 std::lock_guard<std::recursive_mutex> guard(
2245 "unable to find an image that matches '{0}'", arg.c_str());
2249 for (
size_t i = 0; i < num_matches; ++i) {
2251 "Interrupted in dump clang ast list with {0} of {1} dumped.",
2265#pragma mark CommandObjectTargetModulesDumpSymfile
2274 interpreter,
"target modules dump symfile",
2275 "Dump the debug symbol file for one or more target modules.",
2277 nullptr, eCommandRequiresTarget) {}
2284 assert(target &&
"target guaranteed by eCommandRequiresTarget");
2285 uint32_t num_dumped = 0;
2290 std::lock_guard<std::recursive_mutex> guard(target_modules.
GetMutex());
2291 const size_t num_modules = target_modules.
GetSize();
2292 if (num_modules == 0) {
2293 result.
AppendError(
"the target has no associated executable images");
2297 "Dumping debug symbols for {0} modules.\n", num_modules);
2300 "debug symbols with {0} of {1} modules dumped",
2301 num_dumped, num_modules))
2309 const char *arg_cstr;
2310 for (
int arg_idx = 0;
2314 const size_t num_matches =
2316 if (num_matches > 0) {
2317 for (
size_t i = 0; i < num_matches; ++i) {
2319 "of {1} requested modules",
2330 "unable to find an image that matches '{0}'", arg_cstr);
2337 result.
AppendError(
"no matching executable images found");
2342#pragma mark CommandObjectTargetModulesDumpLineTable
2343#define LLDB_OPTIONS_target_modules_dump
2344#include "CommandOptions.inc"
2353 interpreter,
"target modules dump line-table",
2354 "Dump the line table for one or more compilation units.", nullptr,
2355 eCommandRequiresTarget) {}
2364 uint32_t total_num_dumped = 0;
2367 result.
AppendError(
"file option must be specified");
2371 const char *arg_cstr;
2372 for (
int arg_idx = 0;
2378 std::lock_guard<std::recursive_mutex> guard(target_modules.
GetMutex());
2379 size_t num_modules = target_modules.
GetSize();
2380 if (num_modules > 0) {
2381 uint32_t num_dumped = 0;
2384 "Interrupted in dump all line tables with "
2385 "{0} of {1} dumped", num_dumped,
2396 if (num_dumped == 0)
2400 total_num_dumped += num_dumped;
2405 if (total_num_dumped > 0)
2408 result.
AppendError(
"no source filenames matched any command arguments");
2418 assert(option_idx == 0 &&
"We only have one option.");
2429 return llvm::ArrayRef(g_target_modules_dump_options);
2438#pragma mark CommandObjectTargetModulesDumpSeparateDebugInfoFiles
2439#define LLDB_OPTIONS_target_modules_dump_separate_debug_info
2440#include "CommandOptions.inc"
2450 interpreter,
"target modules dump separate-debug-info",
2451 "List the separate debug info symbol files for one or more target "
2453 nullptr, eCommandRequiresTarget) {}
2470 switch (short_option) {
2476 m_json.SetCurrentValue(
true);
2477 m_json.SetOptionWasSet();
2484 llvm_unreachable(
"Unimplemented option");
2496 return llvm::ArrayRef(g_target_modules_dump_separate_debug_info_options);
2507 assert(target &&
"target guaranteed by eCommandRequiresTarget");
2508 uint32_t num_dumped = 0;
2514 std::lock_guard<std::recursive_mutex> guard(target_modules.
GetMutex());
2515 const size_t num_modules = target_modules.
GetSize();
2516 if (num_modules == 0) {
2517 result.
AppendError(
"the target has no associated executable images");
2523 "Interrupted in dumping all "
2524 "separate debug info with {0} of {1} modules dumped",
2525 num_dumped, num_modules))
2536 const char *arg_cstr;
2537 for (
int arg_idx = 0;
2541 const size_t num_matches =
2543 if (num_matches > 0) {
2544 for (
size_t i = 0; i < num_matches; ++i) {
2546 "Interrupted dumping {0} "
2547 "of {1} requested modules",
2558 "unable to find an image that matches '{0}'", arg_cstr);
2562 if (num_dumped > 0) {
2567 separate_debug_info_lists_by_module.
Dump(strm,
2571 separate_debug_info_lists_by_module.
ForEach(
2581 if (!separate_debug_info_list) {
2585 llvm::StringRef type;
2586 llvm::StringRef symfile;
2593 "separate-debug-info-files", files))) {
2597 strm <<
"Symbol file: " << symfile;
2599 strm <<
"Type: \"" << type <<
"\"";
2601 if (type ==
"dwo") {
2603 }
else if (type ==
"oso") {
2607 "found unsupported debug info type '{0}'", type);
2614 result.
AppendError(
"no matching executable images found");
2621#pragma mark CommandObjectTargetModulesDump
2630 interpreter,
"target modules dump",
2631 "Commands for dumping information about one or more target "
2633 "target modules dump "
2634 "[objfile|symtab|sections|ast|symfile|line-table|pcm-info|separate-"
2636 "[<file1> <file2> ...]") {
2668 "Add a new module to the current target's modules.",
2669 "target modules add [<module>]",
2670 eCommandRequiresTarget),
2673 "Fullpath to a stand alone debug "
2674 "symbols file for when debug symbols "
2675 "are not in the executable.") {
2694 assert(target &&
"target guaranteed by eCommandRequiresTarget");
2720 "Unable to create the executable or symbol file with "
2721 "UUID %s with path %s and symbol file %s",
2726 "Unable to create the executable or symbol file with "
2727 "UUID %s with path %s",
2733 "or symbol file with UUID %s",
2742 "Unable to locate the executable or symbol file with UUID %s",
2749 "one or more executable image paths must be specified");
2753 for (
auto &entry : args.
entries()) {
2754 if (entry.ref().empty())
2770 module_spec,
true , &
error));
2772 const char *error_cstr =
error.AsCString();
2784 std::string resolved_path = file_spec.
GetPath();
2785 if (resolved_path != entry.ref()) {
2787 "invalid module path '%s' with resolved path '%s'",
2788 entry.ref().str().c_str(), resolved_path.c_str());
2811 interpreter,
"target modules load",
2812 "Set the load addresses for one or more sections in a target "
2814 "target modules load [--file <module> --uuid <uuid>] <sect-name> "
2815 "<address> [<sect-name> <address> ....]",
2816 eCommandRequiresTarget),
2818 "Fullpath or basename for module to load.",
""),
2820 "Write file contents to the memory.", false, true),
2822 "Set PC to the entry point."
2823 " Only applicable with '--load' option.",
2826 "Set the load address for all sections to be the "
2827 "virtual address in the file plus the offset.",
2845 assert(target &&
"target guaranteed by eCommandRequiresTarget");
2846 const bool load =
m_load_option.GetOptionValue().GetCurrentValue();
2847 const bool set_pc =
m_pc_option.GetOptionValue().GetCurrentValue();
2851 bool search_using_module_spec =
false;
2858 if (module_list.
GetSize() == 1) {
2859 search_using_module_spec =
true;
2867 search_using_module_spec =
true;
2868 const char *arg_cstr =
m_file_option.GetOptionValue().GetCurrentValue();
2869 const bool use_global_module_list =
true;
2872 target, arg_cstr, module_list, use_global_module_list);
2873 if (num_matches == 1) {
2876 }
else if (num_matches > 1) {
2877 search_using_module_spec =
false;
2881 search_using_module_spec =
false;
2888 search_using_module_spec =
true;
2893 if (search_using_module_spec) {
2896 const size_t num_matches = matching_modules.
GetSize();
2899 if (num_matches == 1) {
2902 ObjectFile *objfile =
module->GetObjectFile();
2904 SectionList *section_list =
module->GetSectionList();
2906 bool changed =
false;
2911 const bool slide_is_offset =
true;
2912 module->SetLoadAddress(*target, slide, slide_is_offset,
2915 result.
AppendError(
"one or more section name + load "
2916 "address pair must be specified");
2921 result.
AppendError(
"The \"--slide <offset>\" option can't "
2922 "be used in conjunction with setting "
2923 "section load addresses.\n");
2927 for (
size_t i = 0; i < argc; i += 2) {
2930 if (sect_name && load_addr_cstr) {
2932 if (llvm::to_integer(load_addr_cstr, load_addr)) {
2936 if (section_sp->IsThreadSpecific()) {
2938 "thread specific sections are not yet "
2939 "supported (section '%s')",
2947 "section '{0}' loaded at {1:x}", sect_name,
2952 "matches the section "
2959 "invalid load address string '%s'", load_addr_cstr);
2964 result.
AppendError(
"section names must be followed by "
2965 "a load address.\n");
2967 result.
AppendError(
"one or more section name + load "
2968 "address pair must be specified.\n");
2987 if (set_pc && !file_entry.
IsValid()) {
2988 result.
AppendError(
"No entry address in object file");
2991 std::vector<ObjectFile::LoadableData> loadables(
2993 if (loadables.size() == 0) {
2997 Status error = process->WriteObjectFile(std::move(loadables));
3003 ThreadList &thread_list = process->GetThreadList();
3007 if (!reg_context->SetPC(file_entry_addr)) {
3015 module->GetFileSpec().GetPath(path, sizeof(path));
3020 module->GetFileSpec().GetPath(path, sizeof(path));
3026 if (module_spec_file) {
3027 module_spec_file->
GetPath(path,
sizeof(path));
3033 std::string uuid_str;
3042 if (num_matches > 1) {
3044 "multiple modules match%s%s%s%s:", path[0] ?
" file=" :
"", path,
3045 !uuid_str.empty() ?
" uuid=" :
"", uuid_str.c_str());
3046 for (
size_t i = 0; i < num_matches; ++i) {
3054 "no modules were found that match%s%s%s%s",
3055 path[0] ?
" file=" :
"", path, !uuid_str.empty() ?
" uuid=" :
"",
3060 result.
AppendError(
"either the \"--file <module>\" or the \"--uuid "
3061 "<uuid>\" option must be specified.\n");
3075#pragma mark CommandObjectTargetModulesList
3077#define LLDB_OPTIONS_target_modules_list
3078#include "CommandOptions.inc"
3093 if (short_option ==
'g') {
3095 }
else if (short_option ==
'a') {
3099 unsigned long width = 0;
3100 option_arg.getAsInteger(0, width);
3113 return llvm::ArrayRef(g_target_modules_list_options);
3125 interpreter,
"target modules list",
3126 "List current executable and dependent shared library images.",
3127 nullptr, eCommandAllowsDummyTarget) {
3138 const bool use_global_module_list =
m_options.m_use_global_module_list;
3141 if (!use_global_module_list && (!target || target->
IsDummyTarget())) {
3162 "Couldn't find module matching address: 0x%" PRIx64,
3167 "Couldn't find module containing address: 0x%" PRIx64,
3173 size_t num_modules = 0;
3179 std::unique_lock<std::recursive_mutex> guard(
3185 if (use_global_module_list) {
3195 target, arg.c_str(), module_list, use_global_module_list);
3196 if (num_matches == 0) {
3205 module_list_ptr = &module_list;
3208 std::unique_lock<std::recursive_mutex> lock;
3209 if (module_list_ptr !=
nullptr) {
3211 std::unique_lock<std::recursive_mutex>(module_list_ptr->
GetMutex());
3213 num_modules = module_list_ptr->
GetSize();
3216 if (num_modules > 0) {
3217 for (uint32_t image_idx = 0; image_idx < num_modules; ++image_idx) {
3220 if (module_list_ptr) {
3222 module = module_sp.get();
3224 module = Module::GetAllocatedModuleAtIndex(image_idx);
3225 module_sp =
module->shared_from_this();
3228 const size_t indent = strm.
Printf(
"[%3u] ", image_idx);
3234 if (use_global_module_list)
3236 "the global module list has no matching modules");
3238 result.
AppendError(
"the target has no matching modules");
3240 if (use_global_module_list)
3241 result.
AppendError(
"the global module list is empty");
3244 "the target has no associated executable images");
3251 if (module ==
nullptr) {
3256 bool dump_object_name =
false;
3258 m_options.m_format_array.push_back(std::make_pair(
'u', 0));
3259 m_options.m_format_array.push_back(std::make_pair(
'h', 0));
3260 m_options.m_format_array.push_back(std::make_pair(
'f', 0));
3261 m_options.m_format_array.push_back(std::make_pair(
'S', 0));
3263 const size_t num_entries =
m_options.m_format_array.size();
3264 bool print_space =
false;
3265 for (
size_t i = 0; i < num_entries; ++i) {
3269 const char format_char =
m_options.m_format_array[i].first;
3270 uint32_t width =
m_options.m_format_array[i].second;
3271 switch (format_char) {
3282 dump_object_name =
true;
3291 dump_object_name =
true;
3298 uint32_t addr_nibble_width =
3301 ObjectFile *objfile =
module->GetObjectFile();
3308 base_addr.
Dump(&strm, &target,
3312 if (format_char ==
'o') {
3314 strm.
Printf(
"0x%*.*" PRIx64, addr_nibble_width,
3319 strm.
Printf(
"0x%*.*" PRIx64, addr_nibble_width,
3320 addr_nibble_width, load_addr);
3331 strm.
Printf(
"%*s", addr_nibble_width + 2,
"");
3336 size_t ref_count = 0;
3337 char in_shared_cache =
'Y';
3339 ModuleSP module_sp(module->shared_from_this());
3341 in_shared_cache =
'N';
3344 ref_count = module_sp.use_count() - 1;
3347 strm.
Printf(
"{%c %*" PRIu64
"}", in_shared_cache, width, (uint64_t)ref_count);
3349 strm.
Printf(
"{%c %" PRIu64
"}", in_shared_cache, (uint64_t)ref_count);
3356 symbol_file->GetObjectFile()->GetFileSpec();
3357 if (format_char ==
'S') {
3359 if (!symfile_spec || symfile_spec == module->
GetFileSpec()) {
3360 print_space =
false;
3364 strm.
Printf(
"\n%*s", indent,
"");
3367 dump_object_name =
true;
3370 strm.
Printf(
"%.*s", width,
"<NONE>");
3375 llvm::AlignStyle::Left, width));
3379 strm.
Printf(
"%p",
static_cast<void *
>(module));
3390 if (dump_object_name) {
3391 const char *object_name =
module->GetObjectName().GetCString();
3393 strm.
Printf(
"(%s)", object_name);
3394 std::optional<addr_t> memory_addr =
module->GetMemoryModuleAddress();
3395 if (memory_addr.has_value())
3396 strm.
Printf(
"(0x%" PRIx64
")", memory_addr.value());
3404#pragma mark CommandObjectTargetModulesShowUnwind
3407#define LLDB_OPTIONS_target_modules_show_unwind
3408#include "CommandOptions.inc"
3433 switch (short_option) {
3435 m_str = std::string(option_arg);
3441 "invalid address string '%s'", option_arg.str().c_str());
3446 m_str = std::string(option_arg);
3451 bool value, success;
3457 "invalid boolean value '{}' passed for -c option", option_arg);
3462 llvm_unreachable(
"Unimplemented option");
3476 return llvm::ArrayRef(g_target_modules_show_unwind_options);
3490 interpreter,
"target modules show-unwind",
3491 "Show synthesized unwind instructions for a function.", nullptr,
3492 eCommandRequiresTarget | eCommandRequiresProcess |
3493 eCommandProcessMustBeLaunched | eCommandProcessMustBePaused) {}
3505 abi = process->
GetABI().get();
3507 if (process ==
nullptr) {
3509 "You must have a process running to use this command.");
3515 result.
AppendError(
"the process must be paused to use this command");
3521 result.
AppendError(
"the process must be paused to use this command");
3533 function_options, sc_list);
3539 module_sp->ResolveSymbolContextForAddress(addr,
3540 eSymbolContextEverything, sc);
3547 "address-expression or function name option must be specified.");
3558 if (sc.symbol ==
nullptr && sc.function ==
nullptr)
3560 if (!sc.module_sp || sc.module_sp->GetObjectFile() ==
nullptr)
3562 Address addr = sc.GetFunctionOrSymbolAddress();
3572 UnwindTable &uw_table = sc.module_sp->GetUnwindTable();
3579 if (!func_unwinders_sp)
3583 "UNWIND PLANS for {0}`{1} (start addr {2:x})\n",
3584 sc.module_sp->GetPlatformFileSpec().GetFilename(), funcname,
3590 for (
size_t i = 0; i < count; i++) {
3592 if (strcmp(funcname.
GetCString(), trap_func_name) == 0)
3595 "treated as a trap handler function via user setting.\n");
3599 const std::vector<std::string> &trap_handler_names(
3600 platform_sp->GetTrapHandlerSymbolNames());
3601 for (
const std::string &trap_name : trap_handler_names) {
3602 if (llvm::StringRef(trap_name) == funcname) {
3605 "name is listed by the platform as a trap handler.\n");
3612 if (std::shared_ptr<const UnwindPlan> plan_sp =
3613 func_unwinders_sp->GetUnwindPlanAtNonCallSite(*target, *thread)) {
3615 "Asynchronous (not restricted to call-sites) UnwindPlan is '{0}'\n",
3616 plan_sp->GetSourceName());
3618 if (std::shared_ptr<const UnwindPlan> plan_sp =
3619 func_unwinders_sp->GetUnwindPlanAtCallSite(*target, *thread)) {
3621 "Synchronous (restricted to call-sites) UnwindPlan is '{0}'\n",
3622 plan_sp->GetSourceName());
3624 if (std::shared_ptr<const UnwindPlan> plan_sp =
3625 func_unwinders_sp->GetUnwindPlanFastUnwind(*target, *thread)) {
3627 plan_sp->GetSourceName());
3632 if (std::shared_ptr<const UnwindPlan> plan_sp =
3633 func_unwinders_sp->GetAssemblyUnwindPlan(*target, *thread)) {
3635 "Assembly language inspection UnwindPlan:\n");
3641 if (std::shared_ptr<const UnwindPlan> plan_sp =
3642 func_unwinders_sp->GetObjectFileUnwindPlan(*target)) {
3649 if (std::shared_ptr<const UnwindPlan> plan_sp =
3650 func_unwinders_sp->GetObjectFileAugmentedUnwindPlan(*target,
3658 if (std::shared_ptr<const UnwindPlan> plan_sp =
3659 func_unwinders_sp->GetEHFrameUnwindPlan(*target)) {
3666 if (std::shared_ptr<const UnwindPlan> plan_sp =
3667 func_unwinders_sp->GetEHFrameAugmentedUnwindPlan(*target,
3675 if (std::shared_ptr<const UnwindPlan> plan_sp =
3676 func_unwinders_sp->GetDebugFrameUnwindPlan(*target)) {
3683 if (std::shared_ptr<const UnwindPlan> plan_sp =
3684 func_unwinders_sp->GetDebugFrameAugmentedUnwindPlan(*target,
3692 if (std::shared_ptr<const UnwindPlan> plan_sp =
3693 func_unwinders_sp->GetArmUnwindUnwindPlan(*target)) {
3700 if (std::shared_ptr<const UnwindPlan> plan_sp =
3701 func_unwinders_sp->GetSymbolFileUnwindPlan(*thread)) {
3708 if (std::shared_ptr<const UnwindPlan> plan_sp =
3709 func_unwinders_sp->GetCompactUnwindUnwindPlan(*target)) {
3716 if (std::shared_ptr<const UnwindPlan> plan_sp =
3717 func_unwinders_sp->GetUnwindPlanFastUnwind(*target, *thread)) {
3726 if (
UnwindPlanSP plan_sp = abi_sp->CreateDefaultUnwindPlan()) {
3727 assert(((!plan_sp || plan_sp->GetRowCount() == 0 ||
3728 plan_sp->GetRowAtIndex(0)
3729 ->GetUnspecifiedRegistersAreUndefined())) &&
3730 "Default UnwindPlan must set "
3731 "UnspecifiedRegistersAreUndefined to true");
3738 if (
UnwindPlanSP plan_sp = abi_sp->CreateFunctionEntryUnwindPlan()) {
3740 "Arch default at entry point UnwindPlan:\n");
3756#define LLDB_OPTIONS_target_modules_lookup
3757#include "CommandOptions.inc"
3784 switch (short_option) {
3792 if (option_arg.getAsInteger(0,
m_offset))
3794 "invalid offset string '%s'", option_arg.str().c_str());
3798 m_str = std::string(option_arg);
3803 m_file.SetFile(option_arg, FileSpec::Style::native);
3814 "invalid line number string '%s'", option_arg.str().c_str());
3821 m_str = std::string(option_arg);
3826 m_str = std::string(option_arg);
3831 m_str = std::string(option_arg);
3851 llvm_unreachable(
"Unimplemented option");
3876 "conjunction with --verbose.");
3882 return llvm::ArrayRef(g_target_modules_lookup_options);
3903 "Look up information within executable and "
3904 "dependent shared library images.",
3905 nullptr, eCommandRequiresTarget) {
3914 bool &syntax_error) {
3932 const SymbolContext &sym_ctx(frame->GetSymbolContext(eSymbolContextModule));
3962 eSymbolContextEverything |
3964 ?
static_cast<int>(eSymbolContextVariable)
4009 m_options.m_use_regex, function_options,
4034 syntax_error =
true;
4045 assert(target &&
"target guaranteed by eCommandRequiresTarget");
4046 bool syntax_error =
false;
4048 uint32_t num_successful_lookups = 0;
4057 num_successful_lookups++;
4067 std::lock_guard<std::recursive_mutex> guard(target_modules.
GetMutex());
4068 if (target_modules.
GetSize() == 0) {
4069 result.
AppendError(
"the target has no associated executable images");
4077 num_successful_lookups++;
4082 const char *arg_cstr;
4087 const size_t num_matches =
4089 if (num_matches > 0) {
4090 for (
size_t j = 0; j < num_matches; ++j) {
4095 num_successful_lookups++;
4101 "unable to find an image that matches '{0}'", arg_cstr);
4105 if (num_successful_lookups > 0)
4114#pragma mark CommandObjectMultiwordImageSearchPaths
4123 interpreter,
"target modules search-paths",
4124 "Commands for managing module search paths for a target.",
4125 "target modules search-paths <subcommand> [<subcommand-options>]") {
4147#pragma mark CommandObjectTargetModules
4156 "Commands for accessing information for one or "
4157 "more target modules.",
4158 "target modules <sub-command> ...") {
4192 interpreter,
"target symbols add",
4193 "Add a debug symbol file to one of the target's current modules by "
4194 "specifying a path to a debug symbols file or by using the options "
4195 "to specify a module.",
4196 "target symbols add <cmd-options> [<symfile>]",
4197 eCommandRequiresTarget),
4201 "Locate the debug symbols for the shared library specified by "
4205 "Locate the debug symbols for the currently selected frame.", false,
4208 "Locate the debug symbols for every frame in "
4209 "the current call stack.",
4232 if (!symbol_fspec) {
4234 "one or more executable image paths must be specified");
4239 symbol_fspec.
GetPath(symfile_path,
sizeof(symfile_path));
4254 if (symfile_module_specs.
GetSize() > 0) {
4260 symfile_module_spec)) {
4264 symfile_uuid_module_spec.
GetUUID() = symfile_module_spec.
GetUUID();
4270 if (matching_modules.
IsEmpty()) {
4273 const size_t num_symfile_module_specs = symfile_module_specs.
GetSize();
4275 i < num_symfile_module_specs && matching_modules.
IsEmpty(); ++i) {
4277 i, symfile_module_spec)) {
4281 symfile_uuid_module_spec.
GetUUID() =
4282 symfile_module_spec.
GetUUID();
4293 if (matching_modules.
IsEmpty())
4296 while (matching_modules.
IsEmpty()) {
4300 if (!filename_no_extension)
4312 if (matching_modules.
GetSize() > 1) {
4314 "use the --uuid option to resolve the "
4320 if (matching_modules.
GetSize() == 1) {
4326 module_sp->SetSymbolFileFileSpec(symbol_fspec);
4332 if (object_file && object_file->
GetFileSpec() == symbol_fspec) {
4334 const FileSpec &module_fs = module_sp->GetFileSpec();
4336 "symbol file '{0}' has been added to '{1}'", symfile_path,
4342 module_list.
Append(module_sp);
4347 std::list<Status> errors;
4349 for (
const auto &err : errors)
4358 module_sp->SetSymbolFileFileSpec(
FileSpec());
4363 ss_symfile_uuid <<
" (";
4365 ss_symfile_uuid <<
')';
4368 "symbol file '%s'%s does not match any existing module%s", symfile_path,
4370 !llvm::sys::fs::is_regular_file(symbol_fspec.
GetPath())
4371 ?
"\n please specify the full path to the symbol file"
4398 error_strm.
PutCString(
"unable to find debug symbols for UUID ");
4418 module_spec.
GetFileSpec() = module_sp->GetFileSpec();
4420 module_spec.
GetUUID() = module_sp->GetUUID();
4429 "unable to find debug symbols for the executable file ");
4444 "a process must exist in order to use the --frame option");
4463 if (!frame_module_sp) {
4469 module_spec.
GetUUID() = frame_module_sp->GetUUID();
4471 module_spec.
GetFileSpec() = frame_module_sp->GetPlatformFileSpec();
4474 result.
AppendError(
"unable to find debug symbols for the current frame");
4487 "a process must exist in order to use the --stack option");
4504 bool symbols_found =
false;
4505 uint32_t frame_count = thread->GetStackFrameCount();
4506 for (uint32_t i = 0; i < frame_count; ++i) {
4510 frame_sp->GetSymbolContext(eSymbolContextModule).module_sp);
4511 if (!frame_module_sp)
4515 module_spec.
GetUUID() = frame_module_sp->GetUUID();
4516 module_spec.
GetFileSpec() = frame_module_sp->GetPlatformFileSpec();
4519 bool current_frame_flush =
false;
4521 symbols_found =
true;
4522 flush |= current_frame_flush;
4525 if (!symbols_found) {
4527 "unable to find debug symbols in the current call stack");
4539 const bool uuid_option_set =
4541 const bool file_option_set =
m_file_option.GetOptionValue().OptionWasSet();
4542 const bool frame_option_set =
4544 const bool stack_option_set =
4549 if (uuid_option_set)
4551 else if (file_option_set)
4553 else if (frame_option_set)
4555 else if (stack_option_set)
4558 result.
AppendError(
"one or more symbol file paths must be specified, "
4559 "or options must be specified");
4561 if (uuid_option_set) {
4562 result.
AppendError(
"specify either one or more paths to symbol files "
4563 "or use the --uuid option without arguments");
4564 }
else if (frame_option_set) {
4565 result.
AppendError(
"specify either one or more paths to symbol files "
4566 "or use the --frame option without arguments");
4567 }
else if (file_option_set && argc > 1) {
4568 result.
AppendError(
"specify at most one symbol file path when "
4569 "--shlib option is set");
4573 for (
auto &entry : args.
entries()) {
4574 if (!entry.ref().empty()) {
4576 symbol_file_spec.
SetFile(entry.ref(), FileSpec::Style::native);
4578 if (file_option_set) {
4585 ->ResolveSymbolFile(*target, module_spec, symfile_spec)
4590 bool symfile_exists =
4593 if (symfile_exists) {
4597 std::string resolved_symfile_path =
4599 if (resolved_symfile_path != entry.ref()) {
4601 "invalid module path '%s' with resolved path '%s'",
4602 entry.c_str(), resolved_symfile_path.c_str());
4628#pragma mark CommandObjectTargetSymbols
4637 interpreter,
"target symbols",
4638 "Commands for adding and managing debug symbol files.",
4639 "target symbols <sub-command> ...") {
4653#pragma mark CommandObjectTargetStopHookAdd
4656#define LLDB_OPTIONS_target_stop_hook_add
4657#include "CommandOptions.inc"
4669 return llvm::ArrayRef(g_target_stop_hook_add_options);
4675 const int short_option =
4676 g_target_stop_hook_add_options[option_idx].short_option;
4678 switch (short_option) {
4685 if (option_arg.getAsInteger(0,
m_line_end)) {
4687 "invalid end line number: \"%s\"", option_arg.str().c_str());
4694 bool value, success;
4700 "invalid boolean value '%s' passed for -G option",
4701 option_arg.str().c_str());
4706 "invalid start line number: \"%s\"", option_arg.str().c_str());
4735 "invalid thread id string '%s'", option_arg.str().c_str());
4752 "invalid thread index string '%s'", option_arg.str().c_str());
4762 bool value, success;
4768 "invalid boolean value '%s' passed for -F option",
4769 option_arg.str().c_str());
4773 llvm_unreachable(
"Unimplemented option");
4808 eFunctionNameTypeAuto;
4826 "Add a hook to be executed when the target stops."
4827 "The hook can either be a list of commands or an "
4828 "appropriately defined Python class. You can also "
4829 "add filters so the hook only runs a certain stop "
4831 "target stop-hook add", eCommandAllowsDummyTarget),
4837Command Based stop-hooks:
4838-------------------------
4839 Stop hooks can run a list of lldb commands by providing one or more
4840 --one-liner options. The commands will get run in the order they are added.
4841 Or you can provide no commands, in which case you will enter a command editor
4842 where you can enter the commands to be run.
4844Python Based Stop Hooks:
4845------------------------
4846 Stop hooks can be implemented with a suitably defined Python class, whose name
4847 is passed in the --python-class option.
4849 When the stop hook is added, the class is initialized by calling:
4851 def __init__(self, target, extra_args, internal_dict):
4853 target: The target that the stop hook is being added to.
4854 extra_args: An SBStructuredData Dictionary filled with the -key -value
4855 option pairs passed to the command.
4856 dict: An implementation detail provided by lldb.
4858 Then when the stop-hook triggers, lldb will run the 'handle_stop' method.
4859 The method has the signature:
4861 def handle_stop(self, exe_ctx, stream):
4863 exe_ctx: An SBExecutionContext for the thread that has stopped.
4864 stream: An SBStream, anything written to this stream will be printed in the
4865 the stop message when the process stops.
4867 Return Value: The method returns "should_stop". If should_stop is false
4868 from all the stop hook executions on threads that stopped
4869 with a reason, then the process will continue. Note that this
4870 will happen only after all the stop hooks are run.
4874 Stop hooks can be set to always run, or to only run when the stopped thread
4875 matches the filter options passed on the command line. The available filter
4876 options include a shared library or a thread or queue specification,
4877 a line range in a source file, a function name or a class name.
4897 "Enter your stop hook command(s). Type 'DONE' to end.\n");
4903 std::string &line)
override {
4909 locked_stream.
Printf(
"error: stop hook #%" PRIu64
4910 " aborted, no commands.\n",
4916 Target::StopHookCommandLine *hook_ptr =
4917 static_cast<Target::StopHookCommandLine *
>(
m_stop_hook_sp.get());
4922 LockedStreamFile locked_stream = output_sp->Lock();
4923 locked_stream.
Printf(
"Stop hook #%" PRIu64
" added.\n",
4932 void DoExecute(Args &command, CommandReturnObject &result)
override {
4936 assert(target &&
"target guaranteed by eCommandRequiresTarget");
4939 ? Target::StopHook::StopHookKind::CommandBased
4940 : Target::StopHook::StopHookKind::ScriptBased);
4943 std::unique_ptr<SymbolContextSpecifier> specifier_up;
4946 std::make_unique<SymbolContextSpecifier>(target->shared_from_this());
4949 specifier_up->AddSpecification(
4955 specifier_up->AddSpecification(
4961 specifier_up->AddSpecification(
m_options.m_file_name.c_str(),
4966 specifier_up->AddLineSpecification(
4972 specifier_up->AddLineSpecification(
4976 if (!
m_options.m_function_name.empty()) {
4977 specifier_up->AddSpecification(
4984 new_hook_sp->SetSpecifier(specifier_up.release());
4987 new_hook_sp->SetRunAtInitialStop(
m_options.m_at_initial_stop);
4992 ThreadSpec *thread_spec =
new ThreadSpec();
5007 new_hook_sp->SetThreadSpecifier(thread_spec);
5017 new_hook_sp->GetID());
5020 Target::StopHookScripted *hook_ptr =
5021 static_cast<Target::StopHookScripted *
>(new_hook_sp.get());
5022 ScriptedMetadata scripted_metadata(
5026 if (
error.Success())
5028 new_hook_sp->GetID());
5052#pragma mark CommandObjectTargetStopHookDelete
5060 interpreter,
"target stop-hook delete",
"Delete a stop-hook.",
5061 "target stop-hook delete [<idx>]", eCommandAllowsDummyTarget) {
5064Deletes the stop hook by index.
5066At any given stop, all enabled stop hooks that pass the stop filter will
5067get a chance to run. That means if one stop-hook deletes another stop hook
5068while executing, the deleted stop hook will still fire for the stop at which
5087 assert(target &&
"target guaranteed by eCommandRequiresTarget");
5090 if (num_args == 0) {
5098 for (
size_t i = 0; i < num_args; i++) {
5116#pragma mark CommandObjectTargetStopHookEnableDisable
5123 bool enable,
const char *name,
5124 const char *help,
const char *syntax)
5126 eCommandAllowsDummyTarget),
5144 assert(target &&
"target guaranteed by eCommandRequiresTarget");
5149 if (num_args == 0) {
5152 for (
size_t i = 0; i < num_args; i++) {
5174#pragma mark CommandObjectTargetStopHookList
5177#define LLDB_OPTIONS_target_stop_hook_list
5178#include "CommandOptions.inc"
5184 "List all stop-hooks.", nullptr,
5185 eCommandAllowsDummyTarget) {}
5201 switch (short_option) {
5206 llvm_unreachable(
"Unimplemented option");
5217 return llvm::ArrayRef(g_target_stop_hook_list_options);
5227 assert(target &&
"target guaranteed by eCommandRequiresTarget");
5228 bool printed_hook =
false;
5233 printed_hook =
true;
5246#pragma mark CommandObjectMultiwordTargetStopHooks
5254 interpreter,
"target stop-hook",
5255 "Commands for operating on debugger target stop-hooks.",
5256 "target stop-hook <subcommand> [<subcommand-options>]") {
5264 interpreter,
false,
"target stop-hook disable [<id>]",
5265 "Disable a stop-hook.",
"target stop-hook disable")));
5268 interpreter,
true,
"target stop-hook enable [<id>]",
5269 "Enable a stop-hook.",
"target stop-hook enable")));
5277#pragma mark CommandObjectTargetHookAdd
5279#define LLDB_OPTIONS_target_hook_add
5280#include "CommandOptions.inc"
5291 return llvm::ArrayRef(g_target_hook_add_options);
5297 const int short_option =
5298 g_target_hook_add_options[option_idx].short_option;
5299 switch (short_option) {
5318 uint32_t thread_index;
5319 if (option_arg.getAsInteger(0, thread_index))
5321 option_arg.str().c_str());
5329 if (option_arg.getAsInteger(0, thread_id))
5331 option_arg.str().c_str());
5351 if (option_arg.getAsInteger(0, line))
5353 "invalid start line number '%s'", option_arg.str().c_str());
5361 if (option_arg.getAsInteger(0, line))
5363 "invalid end line number '%s'", option_arg.str().c_str());
5378 bool value, success;
5384 "invalid boolean value '%s' passed for -G option",
5385 option_arg.str().c_str());
5389 bool value, success;
5395 "invalid boolean value '%s' passed for -I option",
5396 option_arg.str().c_str());
5400 llvm_unreachable(
"unhandled option");
5452 interpreter,
"target hook add",
5453 "Add a hook to be executed on target lifecycle events.",
5454 "target hook add", eCommandAllowsDummyTarget),
5461 Specify which triggers the hook responds to with --on-load (-L),
5462 --on-unload (-u), and/or --on-stop (-S). At least one trigger is required.
5463 Provide commands with --one-liner (-o), or omit -o to enter an interactive
5464 command editor. All commands run for every trigger the hook is signed up
5465 for; there is no per-trigger command list.
5468 target hook add -L -o "script print('module loaded')"
5469 target hook add -L -u -o "script print('module event')"
5470 target hook add -S -o "bt"
5471 target hook add -L -u -S -o "script print('all events')"
5472 target hook add -S -s mylib.so -n main -o "bt"
5473 target hook add -S -G true -o "thread info"
5477 Provide a Python class with --python-class (-P). The class controls which
5478 events it handles by implementing the corresponding methods; you do not
5479 specify triggers on the command line. Use -k <key> -v <value> to pass
5480 extra_args to the class constructor.
5483 target hook add -P mymodule.MyHook
5484 target hook add -P mymodule.MyHook -k verbose -v true
5486 The Python class should implement at least one of these methods:
5489 def __init__(self, target, extra_args, internal_dict):
5490 self.target = target
5491 def handle_module_loaded(self, stream):
5493 def handle_module_unloaded(self, stream):
5495 def handle_stop(self, exe_ctx, stream):
5496 return True # True = should_stop, False = continue
5500 Filters (-s, -f, -l, -e, -c, -n, -x, -t, -T, -q) restrict when the hook
5501 fires. They apply to both command-based and Python class hooks.
5524 "Enter your hook command(s). Type 'DONE' to end.\n");
5530 std::string &line)
override {
5535 LockedStreamFile locked_stream = error_sp->Lock();
5536 locked_stream.
Printf(
"error: hook #%" PRIu64
5537 " aborted, no commands.\n",
5542 auto *hook =
static_cast<Target::HookCommandLine *
>(
m_hook_sp.get());
5543 hook->SetActionFromString(line);
5546 LockedStreamFile locked_stream = output_sp->Lock();
5547 locked_stream.
Printf(
"Hook #%" PRIu64
" added.\n",
5556 void DoExecute(Args &command, CommandReturnObject &result)
override {
5559 assert(target &&
"target guaranteed by eCommandRequiresTarget");
5565 result.
AppendError(
"at least one trigger must be specified: "
5566 "--on-load (-L), --on-unload (-u), or --on-stop (-S)");
5571 is_python_class ? Target::Hook::HookKind::ScriptBased
5572 : Target::Hook::HookKind::CommandBased;
5576 if (!is_python_class) {
5579 static_cast<Target::HookCommandLine *
>(new_hook_sp.get());
5580 uint32_t trigger_mask = 0;
5587 cmd_hook->SetTriggerMask(trigger_mask);
5595 std::make_unique<SymbolContextSpecifier>(target->shared_from_this());
5598 specifier_up->AddSpecification(
5603 specifier_up->AddSpecification(
5608 specifier_up->AddSpecification(
m_options.m_file_name.c_str(),
5612 specifier_up->AddLineSpecification(
5617 specifier_up->AddLineSpecification(
5621 specifier_up->AddSpecification(
5625 new_hook_sp->SetSCSpecifier(specifier_up.release());
5630 ThreadSpec *thread_spec =
new ThreadSpec();
5644 new_hook_sp->SetThreadSpecifier(thread_spec);
5654 new_hook_sp->GetID());
5656 auto *hook =
static_cast<Target::HookScripted *
>(new_hook_sp.get());
5657 ScriptedMetadata scripted_metadata(
5660 Status callback_error = hook->SetScriptCallback(scripted_metadata);
5661 if (callback_error.
Fail()) {
5668 new_hook_sp->GetID());
5684#pragma mark CommandObjectTargetHookDelete
5690 "target hook delete [<id>]",
5691 eCommandAllowsDummyTarget) {
5700 assert(target &&
"target guaranteed by eCommandRequiresTarget");
5728#pragma mark CommandObjectTargetHookEnableDisable
5733 bool enable,
const char *name,
5734 const char *help,
const char *syntax)
5736 eCommandAllowsDummyTarget),
5746 assert(target &&
"target guaranteed by eCommandRequiresTarget");
5774#pragma mark CommandObjectTargetHookModify
5776#define LLDB_OPTIONS_target_hook_modify
5777#include "CommandOptions.inc"
5789 return llvm::ArrayRef(g_target_hook_modify_options);
5795 const int short_option =
5796 g_target_hook_modify_options[option_idx].short_option;
5797 switch (short_option) {
5805 llvm_unreachable(
"unhandled option");
5821 "Modify trigger settings on a hook.",
5822 "target hook modify [--enable-trigger <name>] "
5823 "[--disable-trigger <name>] [<id>]",
5824 eCommandAllowsDummyTarget) {
5827Modify trigger settings on command-based hooks. Scripted hooks derive their
5828triggers from the class methods and cannot be modified.
5830If no hook ID is given, the last added hook is modified.
5832Valid trigger names: load, unload, stop.
5835 target hook modify --enable-trigger stop 1
5836 target hook modify --disable-trigger load 1
5837 target hook modify --enable-trigger stop (modifies last added hook)
5849 if (name ==
"unload")
5858 assert(target &&
"target guaranteed by eCommandRequiresTarget");
5861 result.
AppendError(
"at least one of --enable-trigger or "
5862 "--disable-trigger must be specified");
5870 if (num_hooks == 0) {
5891 if (hook_sp->GetHookKind() != Target::Hook::HookKind::CommandBased) {
5892 result.
AppendError(
"cannot modify triggers on a scripted hook; "
5893 "triggers are determined by the class methods");
5896 auto *cmd_hook =
static_cast<Target::HookCommandLine *
>(hook_sp.get());
5898 if (!
m_options.m_enable_trigger.empty()) {
5902 "Valid names: load, unload, stop",
5906 cmd_hook->AddTrigger(trigger);
5909 if (!
m_options.m_disable_trigger.empty()) {
5913 "Valid names: load, unload, stop",
5917 cmd_hook->RemoveTrigger(trigger);
5927#pragma mark CommandObjectTargetHookList
5933 "target hook list", eCommandAllowsDummyTarget) {}
5940 assert(target &&
"target guaranteed by eCommandRequiresTarget");
5942 if (num_hooks == 0) {
5945 for (
size_t i = 0; i < num_hooks; i++) {
5956#pragma mark CommandObjectMultiwordTargetHooks
5962 interpreter,
"target hook",
5963 "Commands for operating on target hooks.",
5964 "target hook <subcommand> [<subcommand-options>]") {
5971 interpreter,
false,
"target hook disable",
5972 "Disable a hook.",
"target hook disable [<id> ...]")));
5975 interpreter,
true,
"target hook enable",
5976 "Enable a hook.",
"target hook enable [<id> ...]")));
5986#pragma mark CommandObjectTargetDumpTypesystem
5993 interpreter,
"target dump typesystem",
5994 "Dump the state of the target's internal type system. Intended to "
5995 "be used for debugging LLDB itself.",
5996 nullptr, eCommandRequiresTarget) {}
6012#pragma mark CommandObjectTargetDumpSectionLoadList
6019 interpreter,
"target dump section-load-list",
6020 "Dump the state of the target's internal section load list. "
6021 "Intended to be used for debugging LLDB itself.",
6022 nullptr, eCommandRequiresTarget) {}
6029 assert(target &&
"target guaranteed by eCommandRequiresTarget");
6035#pragma mark CommandObjectTargetDump
6043 interpreter,
"target dump",
6044 "Commands for dumping information about the target.",
6045 "target dump [typesystem|section-load-list]") {
6057#pragma mark CommandObjectTargetFrameProvider
6059#define LLDB_OPTIONS_target_frame_provider_register
6060#include "CommandOptions.inc"
6066 interpreter,
"target frame-provider register",
6067 "Register frame provider for all threads in this target.", nullptr,
6068 eCommandRequiresTarget),
6081 uint32_t index)
override {
6082 return std::string(
"");
6093 class="code hl_function" href="classlldb__private_1_1CommandObject.html#a8fe108f167b4280f3e9cec952614099e">GetDebugger().
GetDummyTarget();
6108 result.
SetError(id_or_err.takeError());
6113 "successfully registered scripted frame provider '{0}' for target",
6126 interpreter,
"target frame-provider clear",
6127 "Clear all registered frame providers from this target.", nullptr,
6128 eCommandRequiresTarget) {}
6150 interpreter,
"target frame-provider list",
6151 "List all registered frame providers for the target.", nullptr,
6152 eCommandRequiresTarget) {}
6160 class="code hl_function" href="classlldb__private_1_1CommandObject.html#a8fe108f167b4280f3e9cec952614099e">GetDebugger().
GetDummyTarget();
6163 if (descriptors.empty()) {
6164 result.
AppendMessage(
"no frame providers registered for this target.");
6170 strm << llvm::formatv(
"{0} frame provider(s) registered:\n\n",
6171 descriptors.size());
6173 for (
const auto &entry : descriptors) {
6175 descriptor.
Dump(&strm);
6187 interpreter,
"target frame-provider remove",
6188 "Remove a registered frame provider from the target by id.",
6189 "target frame-provider remove <provider-id>",
6190 eCommandRequiresTarget) {
6200 class="code hl_function" href="classlldb__private_1_1CommandObject.html#a8fe108f167b4280f3e9cec952614099e">GetDebugger().
GetDummyTarget();
6202 std::vector<uint32_t> removed_provider_ids;
6204 uint32_t provider_id = 0;
6205 if (!llvm::to_integer(command[i].ref(), provider_id)) {
6206 result.
AppendError(
"target frame-provider remove requires integer "
6207 "provider id argument");
6213 "no frame provider named '%u' found in target", provider_id);
6216 removed_provider_ids.push_back(provider_id);
6219 if (
size_t num_removed_providers = removed_provider_ids.size()) {
6221 "Successfully removed {0} frame-providers.", num_removed_providers);
6224 result.
AppendError(
"0 frame providers removed.\n");
6233 interpreter,
"target frame-provider",
6234 "Commands for registering and viewing frame providers for the "
6236 "target frame-provider [<sub-command-options>] ") {
6254#pragma mark CommandObjectMultiwordTarget
6261 "Commands for operating on debugger targets.",
6262 "target <subcommand> [<subcommand-options>]") {
static bool GetSeparateDebugInfoList(StructuredData::Array &list, Module *module, bool errors_only, bool load_all_debug_info)
static uint32_t DumpTargetList(TargetList &target_list, bool show_stopped_process_status, Stream &strm)
static void DumpModuleUUID(Stream &strm, Module *module)
static void DumpModuleSections(CommandInterpreter &interpreter, Stream &strm, Module *module)
static void DumpModuleArchitecture(Stream &strm, Module *module, bool full_triple, uint32_t width)
static bool LookupAddressInModule(CommandInterpreter &interpreter, Stream &strm, Module *module, uint32_t resolve_mask, lldb::addr_t raw_addr, lldb::addr_t offset, bool verbose, bool all_ranges)
static void DumpTargetInfo(uint32_t target_idx, Target *target, const char *prefix_cstr, bool show_stopped_process_status, Stream &strm)
static void DumpDirectory(Stream &strm, const FileSpec *file_spec_ptr, uint32_t width)
static uint32_t LookupSymbolInModule(CommandInterpreter &interpreter, Stream &strm, Module *module, const char *name, bool name_is_regex, bool verbose, bool all_ranges)
static size_t LookupTypeInModule(Target *target, CommandInterpreter &interpreter, Stream &strm, Module *module, const char *name_cstr, bool name_is_regex)
static bool DumpModuleSymbolFile(Stream &strm, Module *module)
static void DumpFullpath(Stream &strm, const FileSpec *file_spec_ptr, uint32_t width)
static void DumpDwoFilesTable(Stream &strm, StructuredData::Array &dwo_listings)
static size_t LookupFunctionInModule(CommandInterpreter &interpreter, Stream &strm, Module *module, const char *name, bool name_is_regex, const ModuleFunctionSearchOptions &options, bool verbose, bool all_ranges)
static size_t LookupTypeHere(Target *target, CommandInterpreter &interpreter, Stream &strm, Module &module, const char *name_cstr, bool name_is_regex)
static uint32_t DumpCompileUnitLineTable(CommandInterpreter &interpreter, Stream &strm, Module *module, const FileSpec &file_spec, lldb::DescriptionLevel desc_level)
static void DumpBasename(Stream &strm, const FileSpec *file_spec_ptr, uint32_t width)
static size_t DumpModuleObjfileHeaders(Stream &strm, ModuleList &module_list)
static uint32_t LookupFileAndLineInModule(CommandInterpreter &interpreter, Stream &strm, Module *module, const FileSpec &file_spec, uint32_t line, bool check_inlines, bool verbose, bool all_ranges)
static void DumpSymbolContextList(ExecutionContextScope *exe_scope, Stream &strm, const SymbolContextList &sc_list, bool verbose, bool all_ranges, std::optional< Stream::HighlightSettings > settings=std::nullopt)
static void DumpOsoFilesTable(Stream &strm, StructuredData::Array &oso_listings)
static size_t FindModulesByName(Target *target, const char *module_name, ModuleList &module_list, bool check_global_list)
static void DumpModuleSymtab(CommandInterpreter &interpreter, Stream &strm, Module *module, SortOrder sort_order, Mangled::NamePreference name_preference)
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_LOGF(log,...)
#define LLDB_SCOPED_TIMERF(...)
CommandObjectMultiwordTargetHooks(CommandInterpreter &interpreter)
~CommandObjectMultiwordTargetHooks() override=default
~CommandObjectMultiwordTargetStopHooks() override=default
CommandObjectMultiwordTargetStopHooks(CommandInterpreter &interpreter)
OptionGroupString m_label
OptionGroupPlatform m_platform_options
~CommandObjectTargetCreate() override=default
Options * GetOptions() override
OptionGroupFile m_symbol_file
OptionGroupFile m_remote_file
OptionGroupOptions m_option_group
OptionGroupArchitecture m_arch_option
CommandObjectTargetCreate(CommandInterpreter &interpreter)
OptionGroupDependents m_add_dependents
OptionGroupFile m_core_file
void DoExecute(Args &command, CommandReturnObject &result) override
OptionGroupBoolean m_cleanup_option
OptionGroupOptions m_option_group
void DoExecute(Args &args, CommandReturnObject &result) override
CommandObjectTargetDelete(CommandInterpreter &interpreter)
OptionGroupBoolean m_all_option
~CommandObjectTargetDelete() override=default
Options * GetOptions() override
Dumps the SectionLoadList of the selected Target.
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetDumpSectionLoadList() override=default
CommandObjectTargetDumpSectionLoadList(CommandInterpreter &interpreter)
Dumps the TypeSystem of the selected Target.
CommandObjectTargetDumpTypesystem(CommandInterpreter &interpreter)
~CommandObjectTargetDumpTypesystem() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
Multi-word command for 'target dump'.
CommandObjectTargetDump(CommandInterpreter &interpreter)
~CommandObjectTargetDump() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectTargetFrameProviderClear(CommandInterpreter &interpreter)
~CommandObjectTargetFrameProviderClear() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetFrameProviderList() override=default
CommandObjectTargetFrameProviderList(CommandInterpreter &interpreter)
OptionGroupPythonClassWithDict m_class_options
~CommandObjectTargetFrameProviderRegister() override=default
Options * GetOptions() override
OptionGroupOptions m_all_options
CommandObjectTargetFrameProviderRegister(CommandInterpreter &interpreter)
std::optional< std::string > GetRepeatCommand(Args ¤t_command_args, uint32_t index) override
Get the command that appropriate for a "repeat" of the current command.
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetFrameProviderRemove() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectTargetFrameProviderRemove(CommandInterpreter &interpreter)
~CommandObjectTargetFrameProvider() override=default
CommandObjectTargetFrameProvider(CommandInterpreter &interpreter)
std::string m_thread_name
std::string m_function_name
std::string m_module_name
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
void OptionParsingStarting(ExecutionContext *execution_context) override
std::vector< std::string > m_one_liner
~CommandOptions() override=default
CommandObjectTargetHookAdd(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
OptionGroupOptions m_all_options
OptionGroupPythonClassWithDict m_python_class_options
void IOHandlerInputComplete(IOHandler &io_handler, std::string &line) override
Called when a line or lines have been retrieved.
~CommandObjectTargetHookAdd() override=default
Options * GetOptions() override
void IOHandlerActivated(IOHandler &io_handler, bool interactive) override
CommandObjectTargetHookDelete(CommandInterpreter &interpreter)
~CommandObjectTargetHookDelete() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetHookEnableDisable() override=default
CommandObjectTargetHookEnableDisable(CommandInterpreter &interpreter, bool enable, const char *name, const char *help, const char *syntax)
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectTargetHookList(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetHookList() override=default
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
~CommandOptions() override=default
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
void OptionParsingStarting(ExecutionContext *execution_context) override
std::string m_enable_trigger
std::string m_disable_trigger
Modify trigger settings on a hook.
void DoExecute(Args &command, CommandReturnObject &result) override
Options * GetOptions() override
static uint32_t ParseTriggerName(llvm::StringRef name)
CommandObjectTargetHookModify(CommandInterpreter &interpreter)
~CommandObjectTargetHookModify() override=default
CommandObjectTargetList(CommandInterpreter &interpreter)
void DoExecute(Args &args, CommandReturnObject &result) override
~CommandObjectTargetList() override=default
OptionGroupOptions m_option_group
OptionGroupFile m_symbol_file
CommandObjectTargetModulesAdd(CommandInterpreter &interpreter)
void DoExecute(Args &args, CommandReturnObject &result) override
OptionGroupUUID m_uuid_option_group
~CommandObjectTargetModulesAdd() override=default
Options * GetOptions() override
CommandObjectTargetModulesDumpClangAST(CommandInterpreter &interpreter)
Options * GetOptions() override
void DoExecute(Args &command, CommandReturnObject &result) override
OptionGroupString m_filter
~CommandObjectTargetModulesDumpClangAST() override=default
OptionGroupOptions m_option_group
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
void OptionParsingStarting(ExecutionContext *execution_context) override
~CommandObjectTargetModulesDumpLineTable() override=default
Options * GetOptions() override
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectTargetModulesDumpLineTable(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetModulesDumpObjfile() override=default
CommandObjectTargetModulesDumpObjfile(CommandInterpreter &interpreter)
CommandObjectTargetModulesDumpSections(CommandInterpreter &interpreter)
~CommandObjectTargetModulesDumpSections() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
void OptionParsingStarting(ExecutionContext *execution_context) override
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
~CommandOptions() override=default
OptionValueBoolean m_errors_only
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
OptionValueBoolean m_json
OptionValueBoolean m_load_all_debug_info
~CommandObjectTargetModulesDumpSeparateDebugInfoFiles() override=default
CommandObjectTargetModulesDumpSeparateDebugInfoFiles(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
Options * GetOptions() override
CommandObjectTargetModulesDumpSymfile(CommandInterpreter &interpreter)
~CommandObjectTargetModulesDumpSymfile() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
void OptionParsingStarting(ExecutionContext *execution_context) override
~CommandOptions() override=default
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
OptionValueBoolean m_prefer_mangled
Options * GetOptions() override
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectTargetModulesDumpSymtab(CommandInterpreter &interpreter)
~CommandObjectTargetModulesDumpSymtab() override=default
~CommandObjectTargetModulesDump() override=default
CommandObjectTargetModulesDump(CommandInterpreter &interpreter)
CommandObjectTargetModulesImageSearchPaths(CommandInterpreter &interpreter)
~CommandObjectTargetModulesImageSearchPaths() override=default
bool m_use_global_module_list
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
void OptionParsingStarting(ExecutionContext *execution_context) override
FormatWidthCollection m_format_array
std::vector< std::pair< char, uint32_t > > FormatWidthCollection
~CommandOptions() override=default
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
lldb::addr_t m_module_addr
CommandObjectTargetModulesList(CommandInterpreter &interpreter)
~CommandObjectTargetModulesList() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
void PrintModule(Target &target, Module *module, int indent, Stream &strm)
Options * GetOptions() override
OptionGroupBoolean m_pc_option
OptionGroupUInt64 m_slide_option
OptionGroupBoolean m_load_option
void DoExecute(Args &args, CommandReturnObject &result) override
Options * GetOptions() override
OptionGroupUUID m_uuid_option_group
~CommandObjectTargetModulesLoad() override=default
OptionGroupOptions m_option_group
CommandObjectTargetModulesLoad(CommandInterpreter &interpreter)
OptionGroupString m_file_option
~CommandOptions() override=default
void OptionParsingStarting(ExecutionContext *execution_context) override
Status OptionParsingFinished(ExecutionContext *execution_context) override
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
bool LookupInModule(CommandInterpreter &interpreter, Module *module, CommandReturnObject &result, bool &syntax_error)
Options * GetOptions() override
@ eLookupTypeFunctionOrSymbol
~CommandObjectTargetModulesLookup() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
bool LookupHere(CommandInterpreter &interpreter, CommandReturnObject &result, bool &syntax_error)
CommandObjectTargetModulesLookup(CommandInterpreter &interpreter)
CommandObjectTargetModulesModuleAutoComplete(CommandInterpreter &interpreter, const char *name, const char *help, const char *syntax, uint32_t flags=0)
~CommandObjectTargetModulesModuleAutoComplete() override=default
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
~CommandObjectTargetModulesSearchPathsAdd() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectTargetModulesSearchPathsAdd(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetModulesSearchPathsClear() override=default
CommandObjectTargetModulesSearchPathsClear(CommandInterpreter &interpreter)
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
~CommandObjectTargetModulesSearchPathsInsert() override=default
CommandObjectTargetModulesSearchPathsInsert(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetModulesSearchPathsList() override=default
CommandObjectTargetModulesSearchPathsList(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetModulesSearchPathsQuery() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectTargetModulesSearchPathsQuery(CommandInterpreter &interpreter)
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
void OptionParsingStarting(ExecutionContext *execution_context) override
~CommandOptions() override=default
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
@ eLookupTypeFunctionOrSymbol
CommandObjectTargetModulesShowUnwind(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
Options * GetOptions() override
~CommandObjectTargetModulesShowUnwind() override=default
CommandObjectTargetModulesSourceFileAutoComplete(CommandInterpreter &interpreter, const char *name, const char *help, const char *syntax, uint32_t flags)
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
~CommandObjectTargetModulesSourceFileAutoComplete() override=default
~CommandObjectTargetModules() override=default
const CommandObjectTargetModules & operator=(const CommandObjectTargetModules &)=delete
CommandObjectTargetModules(const CommandObjectTargetModules &)=delete
CommandObjectTargetModules(CommandInterpreter &interpreter)
~CommandObjectTargetSelect() override=default
void DoExecute(Args &args, CommandReturnObject &result) override
CommandObjectTargetSelect(CommandInterpreter &interpreter)
CommandObjectTargetShowLaunchEnvironment(CommandInterpreter &interpreter)
void DoExecute(Args &args, CommandReturnObject &result) override
~CommandObjectTargetShowLaunchEnvironment() override=default
uint32_t m_func_name_type_mask
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
std::string m_function_name
std::vector< std::string > m_one_liner
~CommandOptions() override=default
std::string m_thread_name
void OptionParsingStarting(ExecutionContext *execution_context) override
std::string m_module_name
OptionGroupOptions m_all_options
Target::StopHookSP m_stop_hook_sp
void IOHandlerActivated(IOHandler &io_handler, bool interactive) override
CommandObjectTargetStopHookAdd(CommandInterpreter &interpreter)
void IOHandlerInputComplete(IOHandler &io_handler, std::string &line) override
Called when a line or lines have been retrieved.
~CommandObjectTargetStopHookAdd() override=default
Options * GetOptions() override
OptionGroupPythonClassWithDict m_python_class_options
void DoExecute(Args &command, CommandReturnObject &result) override
void DoExecute(Args &command, CommandReturnObject &result) override
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
CommandObjectTargetStopHookDelete(CommandInterpreter &interpreter)
~CommandObjectTargetStopHookDelete() override=default
~CommandObjectTargetStopHookEnableDisable() override=default
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectTargetStopHookEnableDisable(CommandInterpreter &interpreter, bool enable, const char *name, const char *help, const char *syntax)
~CommandOptions() override=default
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
void OptionParsingStarting(ExecutionContext *execution_context) override
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectTargetStopHookList() override=default
Options * GetOptions() override
CommandObjectTargetStopHookList(CommandInterpreter &interpreter)
bool AddSymbolsForUUID(CommandReturnObject &result, bool &flush)
bool DownloadObjectAndSymbolFile(ModuleSpec &module_spec, CommandReturnObject &result, bool &flush)
bool AddSymbolsForStack(CommandReturnObject &result, bool &flush)
OptionGroupBoolean m_current_stack_option
OptionGroupBoolean m_current_frame_option
CommandObjectTargetSymbolsAdd(CommandInterpreter &interpreter)
bool AddSymbolsForFrame(CommandReturnObject &result, bool &flush)
OptionGroupOptions m_option_group
~CommandObjectTargetSymbolsAdd() override=default
Options * GetOptions() override
void DoExecute(Args &args, CommandReturnObject &result) override
OptionGroupFile m_file_option
OptionGroupUUID m_uuid_option_group
bool AddModuleSymbols(Target *target, ModuleSpec &module_spec, bool &flush, CommandReturnObject &result)
bool AddSymbolsForFile(CommandReturnObject &result, bool &flush)
const CommandObjectTargetSymbols & operator=(const CommandObjectTargetSymbols &)=delete
CommandObjectTargetSymbols(CommandInterpreter &interpreter)
~CommandObjectTargetSymbols() override=default
CommandObjectTargetSymbols(const CommandObjectTargetSymbols &)=delete
OptionGroupFormat m_option_format
void DumpGlobalVariableList(const ExecutionContext &exe_ctx, const SymbolContext &sc, const VariableList &variable_list, CommandReturnObject &result)
void DumpValueObject(Stream &s, VariableSP &var_sp, ValueObjectSP &valobj_sp, const char *root_name)
static size_t GetVariableCallback(void *baton, const char *name, VariableList &variable_list)
static const uint32_t SHORT_OPTION_SHLB
CommandObjectTargetVariable(CommandInterpreter &interpreter)
OptionGroupFileList m_option_shared_libraries
void DoExecute(Args &args, CommandReturnObject &result) override
Options * GetOptions() override
OptionGroupFileList m_option_compile_units
static const uint32_t SHORT_OPTION_FILE
OptionGroupVariable m_option_variable
OptionGroupValueObjectDisplay m_varobj_options
OptionGroupOptions m_option_group
~CommandObjectTargetVariable() override=default
~OptionGroupDependents() override=default
OptionGroupDependents()=default
LoadDependentFiles m_load_dependent_files
OptionGroupDependents(const OptionGroupDependents &)=delete
const OptionGroupDependents & operator=(const OptionGroupDependents &)=delete
void OptionParsingStarting(ExecutionContext *execution_context) override
Status SetOptionValue(uint32_t, const char *, ExecutionContext *)=delete
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_value, ExecutionContext *execution_context) override
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
virtual lldb::addr_t FixCodeAddress(lldb::addr_t pc)
Some targets might use bits in a code address to indicate a mode switch.
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.
@ DumpStyleFileAddress
Display as the file address (if any).
@ DumpStyleSectionNameOffset
Display as the section name + offset.
@ DumpStyleDetailedSymbolContext
Detailed symbol context information for an address for all symbol context members.
@ DumpStyleInvalid
Invalid dump style.
@ DumpStyleModuleWithFileAddress
Display as the file address with the module name prepended (if any).
@ DumpStyleResolvedDescription
Display the details about what an address resolves to.
bool Dump(Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, DumpStyle fallback_style=DumpStyleInvalid, uint32_t addr_byte_size=UINT32_MAX, bool all_ranges=false, std::optional< Stream::HighlightSettings > settings=std::nullopt) const
Dump a description of this object to a Stream.
lldb::ModuleSP GetModule() const
Get accessor for the module for this address.
lldb::addr_t GetFileAddress() const
Get the file address.
bool IsValid() const
Check if the object state is valid.
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
bool IsValid() const
Tests if this ArchSpec is valid.
void DumpTriple(llvm::raw_ostream &s) const
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
A command line argument class.
void Shift()
Shifts the first argument C string value of the array off the argument array.
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
llvm::ArrayRef< ArgEntry > entries() const
const char * GetArgumentAtIndex(size_t idx) const
Gets the null-terminated C string argument pointer for the argument at index idx.
static bool InvokeCommonCompletionCallbacks(CommandInterpreter &interpreter, uint32_t completion_mask, lldb_private::CompletionRequest &request, SearchFilter *searcher)
bool Confirm(llvm::StringRef message, bool default_answer)
ExecutionContext GetExecutionContext(bool adopt_dummy_target=true) const
Returns the execution context the interpreter should run a command in.
CommandObjectMultiwordTarget(CommandInterpreter &interpreter)
~CommandObjectMultiwordTarget() override
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
CommandObjectMultiword(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
friend class CommandInterpreter
CommandObjectParsed(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
std::vector< CommandArgumentData > CommandArgumentEntry
virtual void SetHelpLong(llvm::StringRef str)
void AddSimpleArgumentList(lldb::CommandArgumentType arg_type, ArgumentRepetitionType repetition_type=eArgRepeatPlain)
ExecutionContext m_exe_ctx
virtual const char * GetInvalidTargetDescription()
std::vector< CommandArgumentEntry > m_arguments
CommandInterpreter & GetCommandInterpreter()
CommandInterpreter & m_interpreter
virtual void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector)
The default version handles argument definitions that have only one argument type,...
Target * GetTarget()
Get the target this command should operate on.
void AppendMessage(llvm::StringRef in_string)
void AppendError(llvm::StringRef in_string)
const ValueObjectList & GetValueObjectList() const
void AppendWarningWithFormatv(const char *format, Args &&...args)
Stream & GetErrorStream()
void SetStatus(lldb::ReturnStatus status)
void SetError(Status error)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
void void AppendMessageWithFormatv(const char *format, Args &&...args)
lldb::ReturnStatus GetStatus() const
void AppendWarning(llvm::StringRef in_string)
void AppendErrorWithFormatv(const char *format, Args &&...args)
Stream & GetOutputStream()
A class that describes a compilation unit.
lldb::VariableListSP GetVariableList(bool can_create)
Get the variable list for a compile unit.
const FileSpec & GetPrimaryFile() const
Return the primary source spec associated with this compile unit.
"lldb/Utility/ArgCompletionRequest.h"
void TryCompleteCurrentArg(llvm::StringRef completion, llvm::StringRef description="")
Adds a possible completion string if the completion would complete the current argument.
size_t GetCursorIndex() const
A uniqued constant string class.
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 class to manage flag bits.
TargetList & GetTargetList()
Get accessor for the target list.
llvm::StringRef GetRegexMatchAnsiSuffix() const
Target & GetDummyTarget()
llvm::StringRef GetRegexMatchAnsiPrefix() const
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
DumpValueObjectOptions & SetRootValueObjectName(const char *name=nullptr)
DumpValueObjectOptions & SetFormat(lldb::Format format=lldb::eFormatDefault)
A class that measures elapsed time in an exception safe way.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
Target * GetTargetPtr() const
Returns a pointer to the target object.
const FileSpec & GetFileSpecAtIndex(size_t idx) const
Get file at index.
size_t GetSize() const
Get the number of files in the file list.
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
llvm::StringRef GetFileNameStrippingExtension() const
Return the filename without the extension part.
void SetFilename(llvm::StringRef filename)
Filename string set accessor.
llvm::StringRef GetFilename() const
Filename string const get accessor.
llvm::StringRef GetDirectory() const
Directory string const get accessor.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
void SetDirectory(llvm::StringRef directory)
Directory string set accessor.
void Dump(llvm::raw_ostream &s) const
Dump this object to a Stream.
bool ResolveExecutableLocation(FileSpec &file_spec)
Call into the Host to see if it can help find the file.
bool Exists(const FileSpec &file_spec) const
Returns whether the given file exists.
int Open(const char *path, int flags, int mode=0600)
Wraps open in a platform-independent way.
static FileSystem & Instance()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
IOHandlerDelegateMultiline(llvm::StringRef end_line, Completion completion=Completion::None)
A delegate class for use with IOHandler subclasses.
lldb::LockableStreamFileSP GetErrorStreamFileSP()
lldb::LockableStreamFileSP GetOutputStreamFileSP()
void GetDescription(Stream *s, Target *target, lldb::DescriptionLevel level)
A collection class for Module objects.
void FindFunctions(ConstString name, lldb::FunctionNameType name_type_mask, const ModuleFunctionSearchOptions &options, SymbolContextList &sc_list) const
ModuleIterableNoLocking ModulesNoLocking() const
static bool ModuleIsInCache(const Module *module_ptr)
void FindGlobalVariables(ConstString name, size_t max_matches, VariableList &variable_list) const
Find global and static variables by name.
std::recursive_mutex & GetMutex() const
lldb::ModuleSP FindFirstModule(const ModuleSpec &module_spec) const
Finds the first module whose file specification matches module_spec.
lldb::ModuleSP GetModuleAtIndexUnlocked(size_t idx) const
Get the module shared pointer for the module at index idx without acquiring the ModuleList mutex.
void FindCompileUnits(const FileSpec &path, SymbolContextList &sc_list) const
Find compile units by partial or full path.
bool AppendIfNeeded(const lldb::ModuleSP &new_module, bool notify=true)
Append a module to the module list, if it is not already there.
Module * GetModulePointerAtIndex(size_t idx) const
Get the module pointer for the module at index idx.
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.
static size_t RemoveOrphanSharedModules(bool mandatory)
static void FindSharedModules(const ModuleSpec &module_spec, ModuleList &matching_module_list)
bool LoadScriptingResourcesInTarget(Target *target, std::list< Status > &errors, bool continue_on_error=true)
ModuleIterable Modules() const
size_t GetSize() const
Gets the size of the module list.
bool GetModuleSpecAtIndex(size_t i, ModuleSpec &module_spec) const
bool FindMatchingModuleSpec(const ModuleSpec &module_spec, ModuleSpec &match_module_spec) const
FileSpec & GetPlatformFileSpec()
ArchSpec & GetArchitecture()
FileSpec * GetFileSpecPtr()
FileSpec & GetSymbolFileSpec()
A class that describes an executable image and its associated object and symbol files.
const lldb_private::UUID & GetUUID()
Get a reference to the UUID value contained in this object.
virtual SymbolFile * GetSymbolFile(bool can_create=true, Stream *feedback_strm=nullptr)
Get the module's symbol file.
static Module * GetAllocatedModuleAtIndex(size_t idx)
static std::recursive_mutex & GetAllocationModuleCollectionMutex()
bool ResolveFileAddress(lldb::addr_t vm_addr, Address &so_addr)
Symtab * GetSymtab(bool can_create=true)
Get the module's symbol table.
bool MatchesModuleSpec(const ModuleSpec &module_ref)
static size_t GetNumberAllocatedModules()
const ArchSpec & GetArchitecture() const
Get const accessor for the module architecture.
std::string GetSpecificationDescription() const
Get the module path and object name.
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
const llvm::sys::TimePoint & GetModificationTime() const
A plug-in interface definition class for object file parsers.
virtual void Dump(Stream *s)=0
Dump a description of this object to a Stream.
virtual std::vector< LoadableData > GetLoadableData(Target &target)
Loads this objfile to memory.
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...
virtual FileSpec & GetFileSpec()
Get accessor to the object file specification.
static ModuleSpecList GetModuleSpecifications(const FileSpec &file, lldb::offset_t file_offset, lldb::offset_t file_size, lldb::DataExtractorSP=lldb::DataExtractorSP())
virtual lldb_private::Address GetBaseAddress()
Returns base address of this object file.
A command line option parsing protocol class.
std::vector< Option > m_getopt_table
bool RemapPath(llvm::StringRef path, std::string &new_path) const
void Insert(llvm::StringRef path, llvm::StringRef replacement, uint32_t insert_idx, bool notify)
void Append(llvm::StringRef path, llvm::StringRef replacement, bool notify)
bool GetPathsAtIndex(uint32_t idx, std::string &path, std::string &new_path) const
void Dump(Stream *s, int pair_index=-1)
static bool DownloadObjectAndSymbolFile(ModuleSpec &module_spec, Status &error, bool force_lookup=true, bool copy_executable=true)
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
A plug-in interface definition class for debugging a process.
ThreadList & GetThreadList()
void Flush()
Flush all data in the process.
lldb::StateType GetState()
Get accessor for the current process state.
const lldb::ABISP & GetABI()
bool IsValid() const
Test if this object contains a valid regular expression.
virtual lldb::ScriptedFrameProviderInterfaceSP CreateScriptedFrameProviderInterface()
lldb::SectionSP FindSectionByName(llvm::StringRef section_name) const
void Dump(llvm::raw_ostream &s, unsigned indent, Target *target, bool show_header, uint32_t depth) const
This base class provides an interface to stack frames.
virtual const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
virtual uint32_t GetFrameIndex() const
Query this frame to find what frame it is in this Thread's StackFrameList.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
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.
void SetIndentLevel(unsigned level)
Set the current indentation level.
void PutCStringColorHighlighted(llvm::StringRef text, std::optional< HighlightSettings > settings=std::nullopt)
Output a C string to the stream with color highlighting.
size_t EOL()
Output and End of Line character to the stream.
void IndentLess(unsigned amount=2)
Decrement the current indentation level.
void IndentMore(unsigned amount=2)
Increment the current indentation level.
unsigned GetIndentLevel() const
Get the current indentation level.
void AddItem(const ObjectSP &item)
bool ForEach(std::function< bool(Object *object)> const &foreach_callback) const
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result) const
bool GetValueForKeyAsArray(llvm::StringRef key, Array *&result) const
Dictionary * GetAsDictionary()
void Dump(lldb_private::Stream &s, bool pretty_print=true) const
Defines a list of symbol context objects.
uint32_t GetSize() const
Get accessor for a symbol context list size.
void Append(const SymbolContext &sc)
Append a new symbol context to the list.
@ eClassOrNamespaceSpecified
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
void SortTypeList(TypeMap &type_map, TypeList &type_list) const
Sorts the types in TypeMap according to SymbolContext to TypeList.
lldb::ModuleSP module_sp
The Module for a given query.
CompileUnit * comp_unit
The CompileUnit for a given query.
Symbol * symbol
The Symbol for a given query.
Provides public interface for all SymbolFiles.
virtual ObjectFile * GetObjectFile()=0
bool ValueIsAddress() const
bool GetByteSizeIsValid() const
Address & GetAddressRef()
lldb::addr_t GetByteSize() const
ConstString GetDisplayName() const
uint64_t GetRawValue() const
Get the raw value of the symbol from the symbol table.
Symbol * SymbolAtIndex(size_t idx)
uint32_t AppendSymbolIndexesWithName(ConstString symbol_name, std::vector< uint32_t > &matches)
uint32_t AppendSymbolIndexesMatchingRegExAndType(const RegularExpression ®ex, lldb::SymbolType symbol_type, std::vector< uint32_t > &indexes, Mangled::NamePreference name_preference=Mangled::ePreferDemangled)
lldb::TargetSP GetTargetAtIndex(uint32_t index) const
Status CreateTarget(Debugger &debugger, llvm::StringRef user_exe_path, llvm::StringRef triple_str, LoadDependentFiles get_dependent_modules, const OptionGroupPlatform *platform_options, lldb::TargetSP &target_sp)
Create a new Target.
void SetSelectedTarget(uint32_t index)
bool DeleteTarget(lldb::TargetSP &target_sp)
Delete a Target object from the list.
lldb::TargetSP GetSelectedTarget()
size_t GetNumTargets() const
bool GetUserSpecifiedTrapHandlerNames(Args &args) const
Environment GetEnvironment() const
void SetActionFromStrings(const std::vector< std::string > &strings)
Populate the command list from a vector of individual command strings.
void SetActionFromString(const std::string &strings)
void SetActionFromStrings(const std::vector< std::string > &strings)
Status SetScriptCallback(const ScriptedMetadata &scripted_metadata)
void ModulesDidLoad(ModuleList &module_list)
This call may preload module symbols, and may do so in parallel depending on the following target set...
llvm::Expected< uint32_t > AddScriptedFrameProviderDescriptor(const ScriptedFrameProviderDescriptor &descriptor)
Add or update a scripted frame provider descriptor for this target.
Module * GetExecutableModulePointer()
bool RemoveHookByID(lldb::user_id_t uid)
PathMappingList & GetImageSearchPathList()
size_t GetNumHooks() const
std::shared_ptr< StopHook > StopHookSP
void SymbolsDidLoad(ModuleList &module_list)
const std::vector< StopHookSP > GetStopHooks(bool internal=false) const
const llvm::MapVector< uint32_t, ScriptedFrameProviderDescriptor > & GetScriptedFrameProviderDescriptors() const
Get all scripted frame provider descriptors for this target.
bool RemoveScriptedFrameProviderDescriptor(uint32_t id)
Remove a scripted frame provider descriptor by id.
HookSP CreateHook(Hook::HookKind kind)
void DumpSectionLoadList(Stream &s)
bool SetHookEnabledStateByID(lldb::user_id_t uid, bool enabled)
const lldb::ProcessSP & GetProcessSP() const
lldb::ModuleSP GetOrCreateModule(const ModuleSpec &module_spec, bool notify, Status *error_ptr=nullptr, bool invoke_symbol_locators=true)
Find a binary on the system and return its Module, or return an existing Module that is already in th...
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,...
bool ResolveLoadAddress(lldb::addr_t load_addr, Address &so_addr, uint32_t stop_id=SectionLoadHistory::eStopIDNow, bool allow_section_end=false)
HookSP GetHookByID(lldb::user_id_t uid)
bool SetStopHookActiveStateByID(lldb::user_id_t uid, bool active_state)
void SetAllStopHooksActiveState(bool active_state)
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.
void SetAllHooksEnabledState(bool enabled)
void RemoveAllStopHooks()
void UndoCreateHook(lldb::user_id_t uid)
Removes the most recently created hook.
HookSP GetHookAtIndex(size_t index)
lldb::PlatformSP GetPlatform()
const ModuleList & GetImages() const
Get accessor for the images for this process.
const ArchSpec & GetArchitecture() const
bool IsDummyTarget() const
const std::string & GetLabel() const
void ClearScriptedFrameProviderDescriptors()
Clear all scripted frame provider descriptors for this target.
std::shared_ptr< Hook > HookSP
lldb::ProcessSP CalculateProcess() override
bool SetSectionLoadAddress(const lldb::SectionSP §ion, lldb::addr_t load_addr, bool warn_multiple=false)
bool RemoveStopHookByID(lldb::user_id_t uid)
lldb::ThreadSP GetSelectedThread()
uint32_t GetSize(bool can_update=true)
lldb::ThreadSP GetThreadAtIndex(uint32_t idx, bool can_update=true)
void SetIndex(uint32_t index)
void SetName(llvm::StringRef name)
void SetTID(lldb::tid_t tid)
void SetQueueName(llvm::StringRef queue_name)
lldb::TypeSP GetTypeAtIndex(uint32_t idx) const
A class that contains all state required for type lookups.
This class tracks the state and results of a TypeQuery.
void Dump(Stream &s) const
std::string GetAsString(llvm::StringRef separator="-") const
lldb::FuncUnwindersSP GetFuncUnwindersContainingAddress(const Address &addr, const SymbolContext &sc)
lldb::FuncUnwindersSP GetUncachedFuncUnwindersContainingAddress(const Address &addr, const SymbolContext &sc)
A collection of ValueObject values that.
void Append(const lldb::ValueObjectSP &val_obj_sp)
lldb::ValueObjectSP GetValueObjectAtIndex(size_t idx)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, const lldb::VariableSP &var_sp)
lldb::VariableSP GetVariableAtIndex(size_t idx) const
static Status GetValuesForVariableExpressionPath(llvm::StringRef variable_expr_path, ExecutionContextScope *scope, GetVariableCallback callback, void *baton, VariableList &variable_list, ValueObjectList &valobj_list)
#define LLDB_OPT_SET_FROM_TO(A, B)
#define LLDB_INVALID_LINE_NUMBER
#define LLDB_INVALID_THREAD_ID
#define LLDB_INVALID_INDEX32
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_PROCESS_ID
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::vector< OptionArgElement > OptionElementVector
bool StateIsStoppedState(lldb::StateType state, bool must_exist)
Check if a state represents a state where the process or thread is stopped.
void DumpAddress(llvm::raw_ostream &s, uint64_t addr, uint32_t addr_size, const char *prefix=nullptr, const char *suffix=nullptr)
Output an address value to this stream.
const char * StateAsCString(lldb::StateType state)
Converts a StateType to a C string.
std::string toString(FormatterBytecode::OpCodes op)
std::shared_ptr< lldb_private::TypeSystem > TypeSystemSP
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ScriptedMetadata > ScriptedMetadataSP
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
Format
Display format definitions.
std::shared_ptr< lldb_private::Platform > PlatformSP
StateType
Process and Thread States.
std::shared_ptr< lldb_private::FuncUnwinders > FuncUnwindersSP
std::shared_ptr< lldb_private::Type > TypeSP
std::shared_ptr< lldb_private::Process > ProcessSP
@ eReturnStatusSuccessFinishResult
@ eReturnStatusSuccessFinishNoResult
@ eArgTypeUnsignedInteger
std::shared_ptr< lldb_private::VariableList > VariableListSP
std::shared_ptr< lldb_private::UnwindPlan > UnwindPlanSP
std::shared_ptr< lldb_private::Variable > VariableSP
std::shared_ptr< lldb_private::ScriptedFrameProviderInterface > ScriptedFrameProviderInterfaceSP
@ eValueTypeVariableGlobal
globals variable
@ eValueTypeVariableLocal
function local variables
@ eValueTypeVariableArgument
function argument variables
@ eValueTypeVariableStatic
static variable
@ eValueTypeVariableThreadLocal
thread local storage variable
std::shared_ptr< lldb_private::LockableStreamFile > LockableStreamFileSP
std::shared_ptr< lldb_private::Section > SectionSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::Module > ModuleSP
Used to build individual command argument lists.
ArgumentRepetitionType arg_repetition
lldb::CommandArgumentType arg_type
Options used by Module::FindFunctions.
bool include_inlines
Include inlined functions.
bool include_symbols
Include the symbol table.
static int64_t ToOptionEnum(llvm::StringRef s, const OptionEnumValues &enum_values, int32_t fail_value, Status &error)
static lldb::addr_t ToAddress(const ExecutionContext *exe_ctx, llvm::StringRef s, lldb::addr_t fail_value, Status *error_ptr)
Try to parse an address.
static bool ToBoolean(llvm::StringRef s, bool fail_value, bool *success_ptr)
This struct contains the metadata needed to instantiate a frame provider and optional filters to cont...
void Dump(Stream *s) const
Dump a description of this descriptor to the given stream.
lldb::ScriptedFrameProviderInterfaceSP interface_sp
Interface for calling static methods on the provider class.
Struct to store information for color highlighting in the stream.