From 743e439608b8f52c90bac29c6967602bac7f1142 Mon Sep 17 00:00:00 2001 From: Jason Molenda Date: Tue, 2 Oct 2012 22:23:42 +0000 Subject: [PATCH] Change DynamicLoaderDarwinKernel::OSKextLoadedKextSummary to use the Symbols::LocateExecutableObjectFile method to locate kexts and kernels instead of copying them out of the memory of the remote system. This is the fix for . Fix a variable shadowing problem in Symbols::LocateMacOSXFilesUsingDebugSymbols which caused the symbol rich executable binaries to not be found even if they were listed in the dSYM Info.plist. Change Symbols::DownloadObjectAndSymbolFile to ignore dsymForUUID's negative cache - this is typically being called by the user and we should try even if there's a incorrect entry in the negative cache. llvm-svn: 165061 --- lldb/source/Host/macosx/Symbols.cpp | 6 ++--- .../Darwin-Kernel/DynamicLoaderDarwinKernel.cpp | 26 +++++++++++++--------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/lldb/source/Host/macosx/Symbols.cpp b/lldb/source/Host/macosx/Symbols.cpp index a66ecc1..1eb82d1 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 5a96db8..1231e88 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 (); } } -- 2.7.4