diff --git a/lldb/source/Host/macosx/Symbols.cpp b/lldb/source/Host/macosx/Symbols.cpp index a66ecc1f3624..1eb82d11de10 100644 --- a/lldb/source/Host/macosx/Symbols.cpp +++ b/lldb/source/Host/macosx/Symbols.cpp @@ -378,7 +378,7 @@ LocateMacOSXFilesUsingDebugSymbols char uuid_cstr_buf[64]; const char *uuid_cstr = uuid->GetAsCString (uuid_cstr_buf, sizeof(uuid_cstr_buf)); CFCString uuid_cfstr (uuid_cstr); - CFDictionaryRef uuid_dict = static_cast(::CFDictionaryGetValue (dict.get(), uuid_cfstr.get())); + uuid_dict = static_cast(::CFDictionaryGetValue (dict.get(), uuid_cfstr.get())); if (uuid_dict) { @@ -693,9 +693,9 @@ Symbols::DownloadObjectAndSymbolFile (ModuleSpec &module_spec) StreamString command; if (uuid_cstr) - command.Printf("%s --copyExecutable %s", g_dsym_for_uuid_exe_path, uuid_cstr); + command.Printf("%s --ignoreNegativeCache --copyExecutable %s", g_dsym_for_uuid_exe_path, uuid_cstr); else if (file_path && file_path[0]) - command.Printf("%s --copyExecutable %s", g_dsym_for_uuid_exe_path, file_path); + command.Printf("%s --ignoreNegativeCache --copyExecutable %s", g_dsym_for_uuid_exe_path, file_path); if (!command.GetString().empty()) { diff --git a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp index 5a96db844e2f..1231e88a8c2f 100644 --- a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp +++ b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp @@ -289,16 +289,15 @@ DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule ( module_sp.reset(); // UUID mismatch } - // If this is the kernel, see if we can locate a copy of the binary based on the UUID (and maybe even debug info) - // FIXME: Symbols::DownloadObjectAndSymbolFile is forcing the download of the binaries via dsymForUUID regardless - // of the current pref settings; don't want to do this for all the kexts unless the user has enabled it.. - if (!module_sp && memory_module_is_kernel) + // Try to locate the kext/kernel binary on the local filesystem, maybe with additional + // debug info/symbols still present, before we resort to copying it out of memory. + if (!module_sp) { ModuleSpec sym_spec; sym_spec.GetUUID() = memory_module_sp->GetUUID(); - if (Symbols::DownloadObjectAndSymbolFile (sym_spec) - && sym_spec.GetArchitecture().IsValid() - && sym_spec.GetSymbolFileSpec().Exists()) + if (Symbols::LocateExecutableObjectFile (sym_spec) + && sym_spec.GetArchitecture().IsValid() + && sym_spec.GetFileSpec().Exists()) { module_sp = target.GetSharedModule (sym_spec); if (module_sp.get ()) @@ -354,9 +353,16 @@ DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule ( char uuidbuf[64]; s->Printf ("Kernel UUID: %s\n", module_sp->GetUUID().GetAsCString(uuidbuf, sizeof (uuidbuf))); s->Printf ("Load Address: 0x%llx\n", address); - s->Printf ("Loaded kernel file %s/%s\n", - module_sp->GetFileSpec().GetDirectory().AsCString(), - module_sp->GetFileSpec().GetFilename().AsCString()); + if (module_sp->GetFileSpec().GetDirectory().IsEmpty()) + { + s->Printf ("Loaded kernel file %s\n", module_sp->GetFileSpec().GetFilename().AsCString()); + } + else + { + s->Printf ("Loaded kernel file %s/%s\n", + module_sp->GetFileSpec().GetDirectory().AsCString(), + module_sp->GetFileSpec().GetFilename().AsCString()); + } s->Flush (); } }