[Lldb-commits] [lldb] r248995 - Revert "Fixing a subtle issue on Mac OS X systems with dSYMs..."

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Thu Oct 1 02:03:33 PDT 2015


Author: labath
Date: Thu Oct  1 04:03:33 2015
New Revision: 248995

URL: http://llvm.org/viewvc/llvm-project?rev=248995&view=rev
Log:
Revert "Fixing a subtle issue on Mac OS X systems with dSYMs..."

This reverts commit r248985, as it was breaking all remote
expression-evaluating tests (on android at least).

Modified:
    lldb/trunk/include/lldb/Host/Symbols.h
    lldb/trunk/source/Core/ModuleList.cpp
    lldb/trunk/source/Host/common/Symbols.cpp
    lldb/trunk/source/Host/macosx/Symbols.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp

Modified: lldb/trunk/include/lldb/Host/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Symbols.h?rev=248995&r1=248994&r2=248995&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Host/Symbols.h (original)
+++ lldb/trunk/include/lldb/Host/Symbols.h Thu Oct  1 04:03:33 2015
@@ -29,7 +29,7 @@ public:
     // Locating the file should happen only on the local computer or using
     // the current computers global settings.
     //----------------------------------------------------------------------
-    static ModuleSpec
+    static FileSpec
     LocateExecutableObjectFile (const ModuleSpec &module_spec);
 
     //----------------------------------------------------------------------

Modified: lldb/trunk/source/Core/ModuleList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ModuleList.cpp?rev=248995&r1=248994&r2=248995&view=diff
==============================================================================
--- lldb/trunk/source/Core/ModuleList.cpp (original)
+++ lldb/trunk/source/Core/ModuleList.cpp Thu Oct  1 04:03:33 2015
@@ -1045,19 +1045,19 @@ ModuleList::GetSharedModule
 
     // Fixup the incoming path in case the path points to a valid file, yet
     // the arch or UUID (if one was passed in) don't match.
-    ModuleSpec located_binary_modulespec = Symbols::LocateExecutableObjectFile (module_spec);
+    FileSpec file_spec = Symbols::LocateExecutableObjectFile (module_spec);
 
     // Don't look for the file if it appears to be the same one we already
     // checked for above...
-    if (located_binary_modulespec.GetFileSpec() != module_file_spec)
+    if (file_spec != module_file_spec)
     {
-        if (!located_binary_modulespec.GetFileSpec().Exists())
+        if (!file_spec.Exists())
         {
-            located_binary_modulespec.GetFileSpec().GetPath(path, sizeof(path));
+            file_spec.GetPath(path, sizeof(path));
             if (path[0] == '\0')
                 module_file_spec.GetPath(path, sizeof(path));
             // How can this check ever be true? This branch it is false, and we haven't modified file_spec.
-            if (located_binary_modulespec.GetFileSpec().Exists())
+            if (file_spec.Exists())
             {
                 std::string uuid_str;
                 if (uuid_ptr && uuid_ptr->IsValid())
@@ -1084,8 +1084,9 @@ ModuleList::GetSharedModule
         // Make sure no one else can try and get or create a module while this
         // function is actively working on it by doing an extra lock on the
         // global mutex list.
-        ModuleSpec platform_module_spec(located_binary_modulespec);
-        platform_module_spec.GetPlatformFileSpec() = located_binary_modulespec.GetFileSpec();
+        ModuleSpec platform_module_spec(module_spec);
+        platform_module_spec.GetFileSpec() = file_spec;
+        platform_module_spec.GetPlatformFileSpec() = file_spec;
         ModuleList matching_module_list;
         if (shared_module_list.FindModules (platform_module_spec, matching_module_list) > 0)
         {
@@ -1095,7 +1096,7 @@ ModuleList::GetSharedModule
             // then we should make sure the modification time hasn't changed!
             if (platform_module_spec.GetUUIDPtr() == NULL)
             {
-                TimeValue file_spec_mod_time(located_binary_modulespec.GetFileSpec().GetModificationTime());
+                TimeValue file_spec_mod_time(file_spec.GetModificationTime());
                 if (file_spec_mod_time.IsValid())
                 {
                     if (file_spec_mod_time != module_sp->GetModificationTime())
@@ -1124,9 +1125,9 @@ ModuleList::GetSharedModule
             }
             else
             {
-                located_binary_modulespec.GetFileSpec().GetPath(path, sizeof(path));
+                file_spec.GetPath(path, sizeof(path));
 
-                if (located_binary_modulespec.GetFileSpec())
+                if (file_spec)
                 {
                     if (arch.IsValid())
                         error.SetErrorStringWithFormat("unable to open %s architecture in '%s'", arch.GetArchitectureName(), path);

Modified: lldb/trunk/source/Host/common/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Symbols.cpp?rev=248995&r1=248994&r2=248995&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/Symbols.cpp (original)
+++ lldb/trunk/source/Host/common/Symbols.cpp Thu Oct  1 04:03:33 2015
@@ -38,7 +38,8 @@ int
 LocateMacOSXFilesUsingDebugSymbols
 (
     const ModuleSpec &module_spec,
-    ModuleSpec &return_module_spec
+    FileSpec *out_exec_fspec,   // If non-NULL, try and find the executable
+    FileSpec *out_dsym_fspec    // If non-NULL try and find the debug symbol file
 );
 
 #else
@@ -47,7 +48,8 @@ int
 LocateMacOSXFilesUsingDebugSymbols
 (
     const ModuleSpec &module_spec,
-    ModuleSpec &return_module_spec
+    FileSpec *out_exec_fspec,   // If non-NULL, try and find the executable
+    FileSpec *out_dsym_fspec    // If non-NULL try and find the debug symbol file
 ) {
     // Cannot find MacOSX files using debug symbols on non MacOSX.
     return 0;
@@ -176,25 +178,19 @@ LocateExecutableSymbolFileDsym (const Mo
                         (const void*)uuid);
 
     FileSpec symbol_fspec;
-    ModuleSpec dsym_module_spec;
     // First try and find the dSYM in the same directory as the executable or in
     // an appropriate parent directory
     if (LocateDSYMInVincinityOfExecutable (module_spec, symbol_fspec) == false)
     {
         // We failed to easily find the dSYM above, so use DebugSymbols
-        LocateMacOSXFilesUsingDebugSymbols (module_spec, dsym_module_spec);
+        LocateMacOSXFilesUsingDebugSymbols (module_spec, NULL, &symbol_fspec);
     }
-    else
-    {
-        dsym_module_spec.GetSymbolFileSpec() = symbol_fspec;
-    }
-    return dsym_module_spec.GetSymbolFileSpec();
+    return symbol_fspec;
 }
 
-ModuleSpec
+FileSpec
 Symbols::LocateExecutableObjectFile (const ModuleSpec &module_spec)
 {
-    ModuleSpec result = module_spec;
     const FileSpec *exec_fspec = module_spec.GetFileSpecPtr();
     const ArchSpec *arch = module_spec.GetArchitecturePtr();
     const UUID *uuid = module_spec.GetUUIDPtr();
@@ -204,19 +200,20 @@ Symbols::LocateExecutableObjectFile (con
                         arch ? arch->GetArchitectureName() : "<NULL>",
                         (const void*)uuid);
 
+    FileSpec objfile_fspec;
     ModuleSpecList module_specs;
     ModuleSpec matched_module_spec;
     if (exec_fspec &&
         ObjectFile::GetModuleSpecifications(*exec_fspec, 0, 0, module_specs) &&
         module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec))
     {
-        result.GetFileSpec() = exec_fspec;
+        objfile_fspec = exec_fspec;
     }
     else
     {
-        LocateMacOSXFilesUsingDebugSymbols (module_spec, result);
+        LocateMacOSXFilesUsingDebugSymbols (module_spec, &objfile_fspec, NULL);
     }
-    return result;
+    return objfile_fspec;
 }
 
 FileSpec

Modified: lldb/trunk/source/Host/macosx/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Symbols.cpp?rev=248995&r1=248994&r2=248995&view=diff
==============================================================================
--- lldb/trunk/source/Host/macosx/Symbols.cpp (original)
+++ lldb/trunk/source/Host/macosx/Symbols.cpp Thu Oct  1 04:03:33 2015
@@ -55,15 +55,18 @@ int
 LocateMacOSXFilesUsingDebugSymbols
 (
     const ModuleSpec &module_spec,
-    ModuleSpec &return_module_spec
+    FileSpec *out_exec_fspec,   // If non-NULL, try and find the executable
+    FileSpec *out_dsym_fspec    // If non-NULL try and find the debug symbol file
 )
 {
-    return_module_spec = module_spec;
-    return_module_spec.GetFileSpec().Clear();
-    return_module_spec.GetSymbolFileSpec().Clear();
-
     int items_found = 0;
 
+    if (out_exec_fspec)
+        out_exec_fspec->Clear();
+
+    if (out_dsym_fspec)
+        out_dsym_fspec->Clear();
+
 #if !defined (__arm__) && !defined (__arm64__) && !defined (__aarch64__) // No DebugSymbols on the iOS devices
 
     const UUID *uuid = module_spec.GetUUIDPtr();
@@ -107,132 +110,151 @@ LocateMacOSXFilesUsingDebugSymbols
                                                                                   strlen(exec_cf_path),
                                                                                   FALSE));
                 }
-
-                CFCReleaser<CFURLRef> dsym_url (::DBGCopyFullDSYMURLForUUID(module_uuid_ref.get(), exec_url.get()));
-                char path[PATH_MAX];
-
-                if (dsym_url.get())
+                if (log)
                 {
-                    if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
+                    std::string searching_for;
+                    if (out_exec_fspec && out_dsym_fspec)
                     {
-                        if (log)
-                        {
-                            log->Printf ("DebugSymbols framework returned dSYM path of %s for UUID %s -- looking for the dSYM", path, uuid->GetAsString().c_str());
-                        }
-                        FileSpec dsym_filespec(path, path[0] == '~');
-
-                        if (dsym_filespec.GetFileType () == FileSpec::eFileTypeDirectory)
-                        {
-                            dsym_filespec = Symbols::FindSymbolFileInBundle (dsym_filespec, uuid, arch);
-                            ++items_found;
-                        }
-                        else
-                        {
-                            ++items_found;
-                        }
-                        return_module_spec.GetSymbolFileSpec() = dsym_filespec;
+                        searching_for = "executable binary and dSYM";
                     }
-
-                    bool success = false;
-                    if (log)
+                    else if (out_exec_fspec)
                     {
-                        if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
-                        {
-                            log->Printf ("DebugSymbols framework returned dSYM path of %s for UUID %s -- looking for an exec file", path, uuid->GetAsString().c_str());
-                        }
-
+                        searching_for = "executable binary";
                     }
-
-                    CFCReleaser<CFDictionaryRef> dict(::DBGCopyDSYMPropertyLists (dsym_url.get()));
-                    CFDictionaryRef uuid_dict = NULL;
-                    if (dict.get())
+                    else 
                     {
-                        CFCString uuid_cfstr (uuid->GetAsString().c_str());
-                        uuid_dict = static_cast<CFDictionaryRef>(::CFDictionaryGetValue (dict.get(), uuid_cfstr.get()));
+                        searching_for = "dSYM bundle";
                     }
-                    if (uuid_dict)
+                    log->Printf ("Calling DebugSymbols framework to locate dSYM bundle for UUID %s, searching for %s", uuid->GetAsString().c_str(), searching_for.c_str());
+                }
+
+                CFCReleaser<CFURLRef> dsym_url (::DBGCopyFullDSYMURLForUUID(module_uuid_ref.get(), exec_url.get()));
+                char path[PATH_MAX];
+
+                if (dsym_url.get())
+                {
+                    if (out_dsym_fspec)
                     {
-                        CFStringRef exec_cf_path = static_cast<CFStringRef>(::CFDictionaryGetValue (uuid_dict, CFSTR("DBGSymbolRichExecutable")));
-                        if (exec_cf_path && ::CFStringGetFileSystemRepresentation (exec_cf_path, path, sizeof(path)))
+                        if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
                         {
                             if (log)
                             {
-                                log->Printf ("plist bundle has exec path of %s for UUID %s", path, uuid->GetAsString().c_str());
+                                log->Printf ("DebugSymbols framework returned dSYM path of %s for UUID %s -- looking for the dSYM", path, uuid->GetAsString().c_str());
+                            }
+                            out_dsym_fspec->SetFile(path, path[0] == '~');
+
+                            if (out_dsym_fspec->GetFileType () == FileSpec::eFileTypeDirectory)
+                            {
+                                *out_dsym_fspec = Symbols::FindSymbolFileInBundle (*out_dsym_fspec, uuid, arch);
+                                if (*out_dsym_fspec)
+                                    ++items_found;
                             }
-                            ++items_found;
-                            FileSpec exec_filespec (path, path[0] == '~');
-                            if (exec_filespec.Exists())
+                            else
                             {
-                                success = true;
-                                return_module_spec.GetFileSpec() = exec_filespec;
+                                ++items_found;
                             }
                         }
                     }
 
-                    if (!success)
+                    if (out_exec_fspec)
                     {
-                        // No dictionary, check near the dSYM bundle for an executable that matches...
-                        if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
+                        bool success = false;
+                        if (log)
+                        {
+                            if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
+                            {
+                                log->Printf ("DebugSymbols framework returned dSYM path of %s for UUID %s -- looking for an exec file", path, uuid->GetAsString().c_str());
+                            }
+
+                        }
+                        CFCReleaser<CFDictionaryRef> dict(::DBGCopyDSYMPropertyLists (dsym_url.get()));
+                        CFDictionaryRef uuid_dict = NULL;
+                        if (dict.get())
+                        {
+                            CFCString uuid_cfstr (uuid->GetAsString().c_str());
+                            uuid_dict = static_cast<CFDictionaryRef>(::CFDictionaryGetValue (dict.get(), uuid_cfstr.get()));
+                        }
+                        if (uuid_dict)
                         {
-                            char *dsym_extension_pos = ::strstr (path, ".dSYM");
-                            if (dsym_extension_pos)
+                            CFStringRef exec_cf_path = static_cast<CFStringRef>(::CFDictionaryGetValue (uuid_dict, CFSTR("DBGSymbolRichExecutable")));
+                            if (exec_cf_path && ::CFStringGetFileSystemRepresentation (exec_cf_path, path, sizeof(path)))
                             {
-                                *dsym_extension_pos = '\0';
                                 if (log)
                                 {
-                                    log->Printf ("Looking for executable binary next to dSYM bundle with name with name %s", path);
+                                    log->Printf ("plist bundle has exec path of %s for UUID %s", path, uuid->GetAsString().c_str());
                                 }
-                                FileSpec file_spec (path, true);
-                                ModuleSpecList module_specs;
-                                ModuleSpec matched_module_spec;
-                                switch (file_spec.GetFileType())
+                                ++items_found;
+                                out_exec_fspec->SetFile(path, path[0] == '~');
+                                if (out_exec_fspec->Exists())
+                                    success = true;
+                            }
+                        }
+
+                        if (!success)
+                        {
+                            // No dictionary, check near the dSYM bundle for an executable that matches...
+                            if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
+                            {
+                                char *dsym_extension_pos = ::strstr (path, ".dSYM");
+                                if (dsym_extension_pos)
                                 {
-                                    case FileSpec::eFileTypeDirectory:  // Bundle directory?
-                                        {
-                                            CFCBundle bundle (path);
-                                            CFCReleaser<CFURLRef> bundle_exe_url (bundle.CopyExecutableURL ());
-                                            if (bundle_exe_url.get())
+                                    *dsym_extension_pos = '\0';
+                                    if (log)
+                                    {
+                                        log->Printf ("Looking for executable binary next to dSYM bundle with name with name %s", path);
+                                    }
+                                    FileSpec file_spec (path, true);
+                                    ModuleSpecList module_specs;
+                                    ModuleSpec matched_module_spec;
+                                    switch (file_spec.GetFileType())
+                                    {
+                                        case FileSpec::eFileTypeDirectory:  // Bundle directory?
                                             {
-                                                if (::CFURLGetFileSystemRepresentation (bundle_exe_url.get(), true, (UInt8*)path, sizeof(path)-1))
+                                                CFCBundle bundle (path);
+                                                CFCReleaser<CFURLRef> bundle_exe_url (bundle.CopyExecutableURL ());
+                                                if (bundle_exe_url.get())
                                                 {
-                                                    FileSpec bundle_exe_file_spec (path, true);
-                                                    if (ObjectFile::GetModuleSpecifications(bundle_exe_file_spec, 0, 0, module_specs) &&
-                                                        module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec))
-
+                                                    if (::CFURLGetFileSystemRepresentation (bundle_exe_url.get(), true, (UInt8*)path, sizeof(path)-1))
                                                     {
-                                                        ++items_found;
-                                                        return_module_spec.GetFileSpec() = bundle_exe_file_spec;
-                                                        if (log)
+                                                        FileSpec bundle_exe_file_spec (path, true);
+                                                        if (ObjectFile::GetModuleSpecifications(bundle_exe_file_spec, 0, 0, module_specs) &&
+                                                            module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec))
+
                                                         {
-                                                            log->Printf ("Executable binary %s next to dSYM is compatible; using", path);
+                                                            ++items_found;
+                                                            *out_exec_fspec = bundle_exe_file_spec;
+                                                            if (log)
+                                                            {
+                                                                log->Printf ("Executable binary %s next to dSYM is compatible; using", path);
+                                                            }
                                                         }
                                                     }
                                                 }
                                             }
-                                        }
-                                        break;
+                                            break;
+
+                                        case FileSpec::eFileTypePipe:       // Forget pipes
+                                        case FileSpec::eFileTypeSocket:     // We can't process socket files
+                                        case FileSpec::eFileTypeInvalid:    // File doesn't exist...
+                                            break;
+
+                                        case FileSpec::eFileTypeUnknown:
+                                        case FileSpec::eFileTypeRegular:
+                                        case FileSpec::eFileTypeSymbolicLink:
+                                        case FileSpec::eFileTypeOther:
+                                            if (ObjectFile::GetModuleSpecifications(file_spec, 0, 0, module_specs) &&
+                                                module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec))
 
-                                    case FileSpec::eFileTypePipe:       // Forget pipes
-                                    case FileSpec::eFileTypeSocket:     // We can't process socket files
-                                    case FileSpec::eFileTypeInvalid:    // File doesn't exist...
-                                        break;
-
-                                    case FileSpec::eFileTypeUnknown:
-                                    case FileSpec::eFileTypeRegular:
-                                    case FileSpec::eFileTypeSymbolicLink:
-                                    case FileSpec::eFileTypeOther:
-                                        if (ObjectFile::GetModuleSpecifications(file_spec, 0, 0, module_specs) &&
-                                            module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec))
-
-                                        {
-                                            ++items_found;
-                                            return_module_spec.GetFileSpec() = file_spec;
-                                            if (log)
                                             {
-                                                log->Printf ("Executable binary %s next to dSYM is compatible; using", path);
+                                                ++items_found;
+                                                *out_exec_fspec = file_spec;
+                                                if (log)
+                                                {
+                                                    log->Printf ("Executable binary %s next to dSYM is compatible; using", path);
+                                                }
                                             }
-                                        }
-                                        break;
+                                            break;
+                                    }
                                 }
                             }
                         }

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp?rev=248995&r1=248994&r2=248995&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp Thu Oct  1 04:03:33 2015
@@ -321,13 +321,7 @@ ProcessKDP::DoConnectRemote (Stream *str
                             // Lookup UUID locally, before attempting dsymForUUID like action
                             module_spec.GetSymbolFileSpec() = Symbols::LocateExecutableSymbolFile(module_spec);
                             if (module_spec.GetSymbolFileSpec())
-                            {
-                                ModuleSpec executable_module_spec = Symbols::LocateExecutableObjectFile (module_spec);
-                                if (executable_module_spec.GetFileSpec().Exists())
-                                {
-                                    module_spec.GetFileSpec() = executable_module_spec.GetFileSpec();
-                                }
-                            }
+                                 module_spec.GetFileSpec() = Symbols::LocateExecutableObjectFile (module_spec);
                             if (!module_spec.GetSymbolFileSpec() || !module_spec.GetSymbolFileSpec())
                                  Symbols::DownloadObjectAndSymbolFile (module_spec, true);
 




More information about the lldb-commits mailing list