33#include "llvm/ADT/SmallSet.h"
34#include "llvm/Support/FileSystem.h"
35#include "llvm/Support/ThreadPool.h"
42#include "mach/machine.h"
44#include <CoreFoundation/CoreFoundation.h>
57struct DebugSymbolsDylibFunctions {
58 CFURLRef (*DBGCopyFullDSYMURLForUUID)(CFUUIDRef uuid,
59 CFURLRef exec_url) =
nullptr;
60 CFDictionaryRef (*DBGCopyDSYMPropertyLists)(CFURLRef dsym_url) =
nullptr;
62 DebugSymbolsDylibFunctions() {
63 void *handle = dlopen(
64 "/System/Library/PrivateFrameworks/DebugSymbols.framework/DebugSymbols",
65 RTLD_LAZY | RTLD_LOCAL);
67 DBGCopyFullDSYMURLForUUID = (CFURLRef (*)(CFUUIDRef, CFURLRef))dlsym(
68 handle,
"DBGCopyFullDSYMURLForUUID");
69 DBGCopyDSYMPropertyLists = (CFDictionaryRef (*)(CFURLRef))dlsym(
70 handle,
"DBGCopyDSYMPropertyLists");
75 bool FoundFunctions()
const {
76 return DBGCopyFullDSYMURLForUUID !=
nullptr &&
77 DBGCopyDSYMPropertyLists !=
nullptr;
84 static DebugSymbolsDylibFunctions g_functions;
104 return "DebugSymbols symbol locator.";
115 LLDB_LOGF(log,
"Spotlight lookup for .dSYM bundles is disabled.");
119 return_module_spec = module_spec;
128 const DebugSymbolsDylibFunctions &dylib_functions =
130 if (!dylib_functions.FoundFunctions())
135 llvm::ArrayRef<uint8_t> module_uuid = uuid->
GetBytes();
136 if (module_uuid.size() == 16) {
138 NULL, module_uuid[0], module_uuid[1], module_uuid[2], module_uuid[3],
139 module_uuid[4], module_uuid[5], module_uuid[6], module_uuid[7],
140 module_uuid[8], module_uuid[9], module_uuid[10], module_uuid[11],
141 module_uuid[12], module_uuid[13], module_uuid[14], module_uuid[15]));
143 if (module_uuid_ref.
get()) {
148 if (exec_fspec->
GetPath(exec_cf_path,
sizeof(exec_cf_path)))
149 exec_url.
reset(::CFURLCreateFromFileSystemRepresentation(
150 NULL, (
const UInt8 *)exec_cf_path, strlen(exec_cf_path),
155 dylib_functions.DBGCopyFullDSYMURLForUUID(module_uuid_ref.
get(),
159 if (dsym_url.
get()) {
160 if (::CFURLGetFileSystemRepresentation(
161 dsym_url.
get(),
true, (UInt8 *)path,
sizeof(path) - 1)) {
163 "DebugSymbols framework returned dSYM path of %s for "
164 "UUID %s -- looking for the dSYM",
172 dsym_filespec, uuid, arch);
180 bool success =
false;
182 if (::CFURLGetFileSystemRepresentation(
183 dsym_url.
get(),
true, (UInt8 *)path,
sizeof(path) - 1)) {
185 "DebugSymbols framework returned dSYM path of %s for "
186 "UUID %s -- looking for an exec file",
192 dylib_functions.DBGCopyDSYMPropertyLists(dsym_url.
get()));
193 CFDictionaryRef uuid_dict = NULL;
196 uuid_dict =
static_cast<CFDictionaryRef
>(
197 ::CFDictionaryGetValue(dict.
get(), uuid_cfstr.
get()));
206 module_sp = std::make_shared<Module>(exe_spec);
207 if (module_sp && module_sp->GetObjectFile() &&
208 module_sp->MatchesModuleSpec(exe_spec)) {
211 LLDB_LOGF(log,
"using original binary filepath %s for UUID %s",
225 HostInfo::GetSharedCacheImageInfo(filepath, sc_mode);
235 "using binary from shared cache for filepath %s for "
244 if (!success && uuid_dict) {
247 uuid_dict, CFSTR(
"DBGSymbolRichExecutable")));
248 if (exec_cf_path && ::CFStringGetFileSystemRepresentation(
249 exec_cf_path, path,
sizeof(path))) {
250 LLDB_LOGF(log,
"plist bundle has exec path of %s for UUID %s",
265 if (::CFURLGetFileSystemRepresentation(
266 dsym_url.
get(),
true, (UInt8 *)path,
sizeof(path) - 1)) {
267 char *dsym_extension_pos = ::strstr(path,
".dSYM");
268 if (dsym_extension_pos) {
269 *dsym_extension_pos =
'\0';
271 "Looking for executable binary next to dSYM "
272 "bundle with name with name %s",
277 using namespace llvm::sys::fs;
278 switch (get_file_type(file_spec.
GetPath())) {
280 case file_type::directory_file:
285 if (bundle_exe_url.
get()) {
286 if (::CFURLGetFileSystemRepresentation(bundle_exe_url.
get(),
289 FileSpec bundle_exe_file_spec(path);
293 bundle_exe_file_spec, 0, 0);
294 module_specs.FindMatchingModuleSpec(
295 module_spec, matched_module_spec)) {
297 return_module_spec.
GetFileSpec() = bundle_exe_file_spec;
299 "Executable binary %s next to dSYM is "
307 case file_type::fifo_file:
308 case file_type::socket_file:
309 case file_type::file_not_found:
310 case file_type::status_error:
313 case file_type::type_unknown:
314 case file_type::regular_file:
315 case file_type::symlink_file:
316 case file_type::block_file:
317 case file_type::character_file:
320 module_specs.FindMatchingModuleSpec(
321 module_spec, matched_module_spec)) {
325 "Executable binary %s next to dSYM is "
340 return return_module_spec;
347 std::string dsym_bundle_path = dsym_bundle_fspec.
GetPath();
348 llvm::SmallString<128> buffer(dsym_bundle_path);
349 llvm::sys::path::append(buffer,
"Contents",
"Resources",
"DWARF");
352 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> vfs =
354 llvm::vfs::recursive_directory_iterator Iter(*vfs, buffer.str(), EC);
355 llvm::vfs::recursive_directory_iterator End;
356 for (; Iter != End && !EC; Iter.increment(EC)) {
357 llvm::ErrorOr<llvm::vfs::Status>
Status = vfs->status(Iter->path());
358 if (
Status->isDirectory())
364 if (module_specs.
GetSize() > 0) {
366 for (
size_t i = 0; i < module_specs.
GetSize(); ++i) {
370 if ((uuid ==
nullptr ||
389 if (module_specs.
GetSize() > 0) {
391 for (
size_t i = 0; i < module_specs.
GetSize(); ++i) {
415 llvm::StringRef filename = exec_fspec.
GetFilename();
416 FileSpec dsym_directory = exec_fspec;
419 std::string dsym_filename = filename.str();
420 dsym_filename +=
".dSYM";
430 dsym_fspec = dsym_directory;
442 std::string binary_name = filename.str();
443 auto last_dot = binary_name.find_last_of(
'.');
444 if (last_dot != std::string::npos) {
445 binary_name.erase(last_dot);
446 dsym_fspec = dsym_directory;
458 FileSpec dsym_yaa_fspec = exec_fspec;
460 std::string dsym_yaa_filename = filename.str();
461 dsym_yaa_filename +=
".dSYM.yaa";
496 LLDB_LOGF(log,
"dSYM with matching UUID & arch found at %s",
517 for (
int i = 0; i < 4; i++) {
523 if (fn.contains(
'.')) {
526 LLDB_LOGF(log,
"dSYM with matching UUID & arch found at %s",
543 LLDB_LOGF(log,
"Spotlight lookup for .dSYM bundles is disabled.");
547 return_module_spec = module_spec;
556 const DebugSymbolsDylibFunctions &dylib_functions =
558 if (!dylib_functions.FoundFunctions())
563 llvm::ArrayRef<uint8_t> module_uuid = uuid->
GetBytes();
564 if (module_uuid.size() == 16) {
566 NULL, module_uuid[0], module_uuid[1], module_uuid[2], module_uuid[3],
567 module_uuid[4], module_uuid[5], module_uuid[6], module_uuid[7],
568 module_uuid[8], module_uuid[9], module_uuid[10], module_uuid[11],
569 module_uuid[12], module_uuid[13], module_uuid[14], module_uuid[15]));
571 if (module_uuid_ref.
get()) {
576 if (exec_fspec->
GetPath(exec_cf_path,
sizeof(exec_cf_path)))
577 exec_url.
reset(::CFURLCreateFromFileSystemRepresentation(
578 NULL, (
const UInt8 *)exec_cf_path, strlen(exec_cf_path),
583 dylib_functions.DBGCopyFullDSYMURLForUUID(module_uuid_ref.
get(),
587 if (dsym_url.
get()) {
588 if (::CFURLGetFileSystemRepresentation(
589 dsym_url.
get(),
true, (UInt8 *)path,
sizeof(path) - 1)) {
591 "DebugSymbols framework returned dSYM path of %s for "
592 "UUID %s -- looking for the dSYM",
600 dsym_filespec, uuid, arch);
608 bool success =
false;
610 if (::CFURLGetFileSystemRepresentation(
611 dsym_url.
get(),
true, (UInt8 *)path,
sizeof(path) - 1)) {
613 "DebugSymbols framework returned dSYM path of %s for "
614 "UUID %s -- looking for an exec file",
620 dylib_functions.DBGCopyDSYMPropertyLists(dsym_url.
get()));
621 CFDictionaryRef uuid_dict = NULL;
624 uuid_dict =
static_cast<CFDictionaryRef
>(
625 ::CFDictionaryGetValue(dict.
get(), uuid_cfstr.
get()));
634 module_sp = std::make_shared<Module>(exe_spec);
635 if (module_sp && module_sp->GetObjectFile() &&
636 module_sp->MatchesModuleSpec(exe_spec)) {
639 LLDB_LOGF(log,
"using original binary filepath %s for UUID %s",
653 HostInfo::GetSharedCacheImageInfo(filepath, sc_mode);
663 "using binary from shared cache for filepath %s for "
672 if (!success && uuid_dict) {
675 uuid_dict, CFSTR(
"DBGSymbolRichExecutable")));
676 if (exec_cf_path && ::CFStringGetFileSystemRepresentation(
677 exec_cf_path, path,
sizeof(path))) {
678 LLDB_LOGF(log,
"plist bundle has exec path of %s for UUID %s",
693 if (::CFURLGetFileSystemRepresentation(
694 dsym_url.
get(),
true, (UInt8 *)path,
sizeof(path) - 1)) {
695 char *dsym_extension_pos = ::strstr(path,
".dSYM");
696 if (dsym_extension_pos) {
697 *dsym_extension_pos =
'\0';
699 "Looking for executable binary next to dSYM "
700 "bundle with name with name %s",
705 using namespace llvm::sys::fs;
706 switch (get_file_type(file_spec.
GetPath())) {
708 case file_type::directory_file:
713 if (bundle_exe_url.
get()) {
714 if (::CFURLGetFileSystemRepresentation(bundle_exe_url.
get(),
717 FileSpec bundle_exe_file_spec(path);
721 bundle_exe_file_spec, 0, 0);
722 module_specs.FindMatchingModuleSpec(
723 module_spec, matched_module_spec)) {
725 return_module_spec.
GetFileSpec() = bundle_exe_file_spec;
727 "Executable binary %s next to dSYM is "
735 case file_type::fifo_file:
736 case file_type::socket_file:
737 case file_type::file_not_found:
738 case file_type::status_error:
741 case file_type::type_unknown:
742 case file_type::regular_file:
743 case file_type::symlink_file:
744 case file_type::block_file:
745 case file_type::character_file:
748 module_specs.FindMatchingModuleSpec(
749 module_spec, matched_module_spec)) {
753 "Executable binary %s next to dSYM is "
777 "LocateExecutableSymbolFileDsym (file = %s, arch = %s, uuid = %p)",
778 exec_fspec ? exec_fspec->
GetFilename().nonEmptyOr(
"<NULL>").str().c_str()
783 "Locating external symbol file",
803 const std::string &command) {
805 bool success =
false;
806 if (uuid_dict != NULL && CFGetTypeID(uuid_dict) == CFDictionaryGetTypeID()) {
809 CFDictionaryRef cf_dict;
811 cf_str = (
CFStringRef)CFDictionaryGetValue((CFDictionaryRef)uuid_dict,
813 if (cf_str && CFGetTypeID(cf_str) == CFStringGetTypeID()) {
815 std::string errorstr = command;
823 (CFDictionaryRef)uuid_dict, CFSTR(
"DBGSymbolRichExecutable"));
824 if (cf_str && CFGetTypeID(cf_str) == CFStringGetTypeID()) {
829 "From dsymForUUID plist: Symbol rich executable is at '%s'",
834 cf_str = (
CFStringRef)CFDictionaryGetValue((CFDictionaryRef)uuid_dict,
835 CFSTR(
"DBGDSYMPath"));
836 if (cf_str && CFGetTypeID(cf_str) == CFStringGetTypeID()) {
839 FileSpec::Style::native);
842 LLDB_LOGF(log,
"From dsymForUUID plist: dSYM is at '%s'", str.c_str());
846 std::string DBGBuildSourcePath;
847 std::string DBGSourcePath;
856 cf_dict = (CFDictionaryRef)CFDictionaryGetValue(
857 (CFDictionaryRef)uuid_dict, CFSTR(
"DBGSourcePathRemapping"));
858 if (cf_dict && CFGetTypeID(cf_dict) == CFDictionaryGetTypeID()) {
861 bool new_style_source_remapping_dictionary =
false;
862 bool do_truncate_remapping_names =
false;
863 std::string original_DBGSourcePath_value = DBGSourcePath;
864 cf_str = (
CFStringRef)CFDictionaryGetValue((CFDictionaryRef)uuid_dict,
865 CFSTR(
"DBGVersion"));
866 if (cf_str && CFGetTypeID(cf_str) == CFStringGetTypeID()) {
869 if (!version.empty() && isdigit(version[0])) {
870 int version_number = atoi(version.c_str());
871 if (version_number > 1) {
872 new_style_source_remapping_dictionary =
true;
874 if (version_number == 2) {
875 do_truncate_remapping_names =
true;
880 CFIndex kv_pair_count = CFDictionaryGetCount((CFDictionaryRef)uuid_dict);
881 if (kv_pair_count > 0) {
886 if (keys !=
nullptr && values !=
nullptr) {
887 CFDictionaryGetKeysAndValues((CFDictionaryRef)uuid_dict,
889 (
const void **)values);
891 for (CFIndex i = 0; i < kv_pair_count; i++) {
892 DBGBuildSourcePath.clear();
893 DBGSourcePath.clear();
894 if (keys[i] && CFGetTypeID(keys[i]) == CFStringGetTypeID()) {
897 if (values[i] && CFGetTypeID(values[i]) == CFStringGetTypeID()) {
900 if (!DBGBuildSourcePath.empty() && !DBGSourcePath.empty()) {
905 if (new_style_source_remapping_dictionary &&
906 !original_DBGSourcePath_value.empty()) {
907 DBGSourcePath = original_DBGSourcePath_value;
909 if (DBGSourcePath[0] ==
'~') {
910 FileSpec resolved_source_path(DBGSourcePath.c_str());
912 DBGSourcePath = resolved_source_path.
GetPath();
919 DBGSourcePath,
true);
920 if (do_truncate_remapping_names) {
921 FileSpec build_path(DBGBuildSourcePath.c_str());
922 FileSpec source_path(DBGSourcePath.c_str());
942 cf_str = (
CFStringRef)CFDictionaryGetValue((CFDictionaryRef)uuid_dict,
943 CFSTR(
"DBGBuildSourcePath"));
944 if (cf_str && CFGetTypeID(cf_str) == CFStringGetTypeID()) {
948 cf_str = (
CFStringRef)CFDictionaryGetValue((CFDictionaryRef)uuid_dict,
949 CFSTR(
"DBGSourcePath"));
950 if (cf_str && CFGetTypeID(cf_str) == CFStringGetTypeID()) {
954 if (!DBGBuildSourcePath.empty() && !DBGSourcePath.empty()) {
955 if (DBGSourcePath[0] ==
'~') {
956 FileSpec resolved_source_path(DBGSourcePath.c_str());
958 DBGSourcePath = resolved_source_path.
GetPath();
961 DBGSourcePath,
true);
970 static std::once_flag g_once_flag;
971 static std::string g_dbgshell_command;
972 std::call_once(g_once_flag, [&]() {
973 CFTypeRef defaults_setting = CFPreferencesCopyAppValue(
974 CFSTR(
"DBGShellCommands"), CFSTR(
"com.apple.DebugSymbols"));
975 if (defaults_setting &&
976 CFGetTypeID(defaults_setting) == CFStringGetTypeID()) {
978 if (CFStringGetCString((
CFStringRef)defaults_setting, buffer,
979 sizeof(buffer), kCFStringEncodingUTF8)) {
980 g_dbgshell_command = buffer;
983 if (defaults_setting) {
984 CFRelease(defaults_setting);
987 return g_dbgshell_command;
996 if (
const char *dsymForUUID_env =
997 getenv(
"LLDB_APPLE_DSYMFORUUID_EXECUTABLE")) {
998 FileSpec dsymForUUID_executable(dsymForUUID_env);
1001 return dsymForUUID_executable;
1004 static std::once_flag g_once_flag;
1005 static FileSpec g_dsymForUUID_executable;
1006 std::call_once(g_once_flag, [&]() {
1009 if (!dbgshell_command.empty()) {
1010 g_dsymForUUID_executable =
FileSpec(dbgshell_command);
1018 g_dsymForUUID_executable =
FileSpec(
"/usr/local/bin/dsymForUUID");
1024 g_dsymForUUID_executable = {};
1026 return g_dsymForUUID_executable;
1031 bool copy_executable) {
1042 if (!force_lookup && dbgshell_command.empty())
1052 if (!dsymForUUID_exe_spec)
1056 const std::string dsymForUUID_exe_path = dsymForUUID_exe_spec.
GetPath();
1057 const std::string uuid_str = uuid_ptr ? uuid_ptr->
GetAsString() :
"";
1059 std::string lookup_arg = uuid_str;
1060 if (lookup_arg.empty())
1061 lookup_arg = file_spec_ptr ? file_spec_ptr->
GetPath() :
"";
1062 if (lookup_arg.empty())
1066 command << dsymForUUID_exe_path <<
" --ignoreNegativeCache ";
1067 if (copy_executable)
1068 command <<
"--copyExecutable ";
1069 command << lookup_arg;
1072 std::string lookup_desc;
1073 if (uuid_ptr && file_spec_ptr)
1074 lookup_desc = llvm::formatv(
"{0} ({1})", file_spec_ptr->
GetFilename(),
1078 else if (file_spec_ptr)
1082 LLDB_LOG(log,
"Calling {0} for {1} to find dSYM: {2}", dsymForUUID_exe_path,
1085 Progress progress(
"Downloading symbol file for", lookup_desc);
1088 int exit_status = -1;
1090 std::string command_output;
1091 std::string error_output;
1099 std::chrono::seconds(
1103 if (
error.Fail() || exit_status != 0 || command_output.empty()) {
1105 "'%s' failed (exit status: %d, error: '%s', stdout: '%s', "
1108 command_output.c_str(), error_output.c_str());
1113 CFDataCreateWithBytesNoCopy(NULL, (
const UInt8 *)command_output.data(),
1114 command_output.size(), kCFAllocatorNull));
1117 (CFDictionaryRef)::CFPropertyListCreateWithData(
1118 NULL, data.
get(), kCFPropertyListImmutable, NULL, NULL));
1121 LLDB_LOGF(log,
"'%s' failed: output is not a valid plist",
1123 LLDB_LOGF(log,
"Response:\n%s\n", command_output.c_str());
1127 if (CFGetTypeID(plist.
get()) != CFDictionaryGetTypeID()) {
1128 LLDB_LOGF(log,
"'%s' failed: output plist is not a valid CFDictionary",
1133 if (!uuid_str.empty()) {
1135 CFDictionaryRef uuid_dict =
1136 (CFDictionaryRef)CFDictionaryGetValue(plist.
get(), uuid_cfstr.
get());
1141 if (
const CFIndex num_values = ::CFDictionaryGetCount(plist.
get())) {
1142 std::vector<CFStringRef> keys(num_values, NULL);
1143 std::vector<CFDictionaryRef> values(num_values, NULL);
1144 ::CFDictionaryGetKeysAndValues(plist.
get(), NULL,
1145 (
const void **)&values[0]);
1146 if (num_values == 1) {
1151 for (CFIndex i = 0; i < num_values; ++i) {
1157 module_spec = curr_module_spec;
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
static llvm::StringRef GetDbgShellCommand()
It's expensive to check for the DBGShellCommands defaults setting.
static const DebugSymbolsDylibFunctions & GetDebugSymbolsDylibFunctions()
static bool LocateDSYMInVincinityOfExecutable(const ModuleSpec &module_spec, FileSpec &dsym_fspec)
static int LocateMacOSXFilesUsingDebugSymbols(const ModuleSpec &module_spec, ModuleSpec &return_module_spec)
static bool FileAtPathContainsArchAndUUID(const FileSpec &file_fspec, const ArchSpec *arch, const lldb_private::UUID *uuid)
static bool LookForDsymNextToExecutablePath(const ModuleSpec &mod_spec, const FileSpec &exec_fspec, FileSpec &dsym_fspec)
static FileSpec GetDsymForUUIDExecutable()
Get the dsymForUUID executable and cache the result so we don't end up stat'ing the binary over and o...
static bool GetModuleSpecInfoFromUUIDDictionary(CFDictionaryRef uuid_dict, ModuleSpec &module_spec, Status &error, const std::string &command)
#define LLDB_SCOPED_TIMERF(...)
CFURLRef CopyExecutableURL() const
static const char * FileSystemRepresentation(CFStringRef cf_str, std::string &str)
An architecture specification class.
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
void AppendPathComponent(llvm::StringRef component)
bool RemoveLastPathComponent()
Removes the last path component by replacing the current path with its parent.
llvm::StringRef GetFilename() const
Filename 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 Clear()
Clears the object state.
llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > GetVirtualFileSystem()
static FileSystem & Instance()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
static Status RunShellCommand(llvm::StringRef command, const FileSpec &working_dir, int *status_ptr, int *signo_ptr, std::string *command_output, std::string *error_output, const Timeout< std::micro > &timeout, bool run_in_shell=true)
Run a shell command.
lldb::SymbolSharedCacheUse GetSharedCacheBinaryLoading() const
static ModuleListProperties & GetGlobalModuleListProperties()
bool GetModuleSpecAtIndex(size_t i, ModuleSpec &module_spec) const
PathMappingList & GetSourceMappingList() const
ArchSpec & GetArchitecture()
FileSpec * GetFileSpecPtr()
FileSpec & GetSymbolFileSpec()
ArchSpec * GetArchitecturePtr()
static ModuleSpecList GetModuleSpecifications(const FileSpec &file, lldb::offset_t file_offset, lldb::offset_t file_size, lldb::DataExtractorSP=lldb::DataExtractorSP())
void Append(llvm::StringRef path, llvm::StringRef replacement, bool notify)
static bool DownloadObjectAndSymbolFile(ModuleSpec &module_spec, Status &error, bool force_lookup=true, bool copy_executable=true)
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
static FileSpec FindSymbolFileInBundle(const FileSpec &dsym_bundle_fspec, const UUID *uuid, const ArchSpec *arch)
A Progress indicator helper class.
const char * GetData() const
llvm::StringRef GetString() const
SymbolLocatorDebugSymbols()
static llvm::StringRef GetPluginNameStatic()
static std::optional< ModuleSpec > LocateExecutableObjectFile(const ModuleSpec &module_spec)
static lldb_private::SymbolLocator * CreateInstance()
static llvm::StringRef GetPluginDescriptionStatic()
static std::optional< FileSpec > LocateExecutableSymbolFile(const ModuleSpec &module_spec, const FileSpecList &default_search_paths)
static bool DownloadObjectAndSymbolFile(ModuleSpec &module_spec, Status &error, bool force_lookup, bool copy_executable)
static std::optional< FileSpec > FindSymbolFileInBundle(const FileSpec &dsym_bundle_fspec, const UUID *uuid, const ArchSpec *arch)
Represents UUID's of various sizes.
llvm::ArrayRef< uint8_t > GetBytes() const
std::string GetAsString(llvm::StringRef separator="-") const
#define UNUSED_IF_ASSERT_DISABLED(x)
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::shared_ptr< lldb_private::Module > ModuleSP
const UUID & GetUUID() const