Hi,

I have reverted this as it was causing many failures on our remote
android buildbots
<http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-14.04-android/builds/2834>.
I am hoping I will get a chance to investigate and give you a more
accurate error description by EOD (your morning). Given that the local
tests our working just fine, i suspect this has something to do with
paths.

pl


On 1 October 2015 at 07:09, Zachary Turner via lldb-commits
<lldb-commits@lists.llvm.org> wrote:
> Yea.  It's definitely hard to write a normal test case for this.  It's also
> a common problem when dealing with remote debugging scenarios.  It's both
> hard and resource demanding (needing to have just the right Host -> Target
> configuration available) to test that by going through the full debugging
> stack.  But it's often easy to write a test for a specific bug by finding
> the point of failure, and writing a simple unit test that verifies the
> inputs and outputs of a single method.
>
> Many of LLDB's abstractions aren't designed to be able to handle this very
> well (for example, dependency injection is a common technique, but requires
> the functionality to be abstracted correctly to be able to inject mock
> interfaces), but there's no reason they couldn't be changed to be.
>
> On Wed, Sep 30, 2015 at 11:03 PM Jason Molenda <jmole...@apple.com> wrote:
>>
>> Thanks for the idea Zachary, I haven't been following that.  I'll look at
>> this tomorrow.  I was trying to imagine how to write a normal test case for
>> this and it'd involve running a binary, deleting the binary off disk, then
>> lldb attach to the process, letting it find a dSYM via spotlight which
>> points to a copy of the binary in another location and there's another copy
>> of the dSYM next to that binary. And I'd want to check that lldb stuck with
>> the original dSYM that it found, instead of picking up the second dSYM
>> sitting next to the binary.  It might be possible to replicate the behavior
>> entirely self-hosted.  But it definitely only works on a mac because of the
>> DebugSymbols private framework calls lldb makes while doing all of this.
>>
>>
>> > On Sep 30, 2015, at 10:58 PM, Zachary Turner <ztur...@google.com> wrote:
>> >
>> > This is a good example of where unit tests are useful.  There's already
>> > a small suite of unit tests but I'm going to start being proactive about
>> > growing it (in part by evangelizing it in response to people's commits ;-).
>> > It's not integrated into the Xcode build, but it would certainly be easy to
>> > do so.  The nice thing about a unit test is that you can set everything up
>> > exactly the way you need it and just call the one native code method you
>> > want to test, and verify the outputs.  You could make up your own
>> > ModuleSpec, you could make a mock implementation of `Symbols` that 
>> > delegates
>> > to the real `Symbols` implementation for everything except the part where 
>> > it
>> > checks if the file exists, and have that method simply return false so it
>> > goes to the fallback path, etc.
>> >
>> > Anyway, just throwing this out there as an option.  This is MacOSX only
>> > code so it's not a huge priority for me to push it strongly, but if you
>> > think it would be useful I'm happy to help you figure out how to run them
>> > and/or write a new one.
>> >
>> > On Wed, Sep 30, 2015 at 10:39 PM Jason Molenda via lldb-commits
>> > <lldb-commits@lists.llvm.org> wrote:
>> > Author: jmolenda
>> > Date: Thu Oct  1 00:37:22 2015
>> > New Revision: 248985
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=248985&view=rev
>> > Log:
>> > Fixing a subtle issue on Mac OS X systems with dSYMs (possibly
>> > introduced by r235737 but I didn't look into it too closely).
>> >
>> > A dSYM can have a per-UUID plist in it which tells lldb where
>> > to find an executable binary for the dSYM (DBGSymbolRichExecutable)
>> > - other information can be included in this plist, like how to
>> > remap the source file paths from their build pathnames to their
>> > long-term storage pathnames.
>> >
>> > This per-UUID plist is a unusual; it is used probably exclusively
>> > inside apple with our build system.  It is not created by default
>> > in normal dSYMs.
>> >
>> > The problem was like this:
>> >
>> >   1. lldb wants to find an executable, given only a UUID
>> >      (this happens when lldb is doing cross-host debugging
>> >       and doesn't have a copy of the target system's binaries)
>> >
>> >   2. It eventually calls LocateMacOSXFilesUsingDebugSymbols
>> >      which does a spotlight search for the dSYM on the local
>> >      system, and failing that, tries the DBGShellCommands
>> >      command to find the dSYM.
>> >
>> >   3. It gets a dSYM.  It reads the per-UUID plist in the dSYM.
>> >      The dSYM has a DBGSymbolRichExecutable kv pair pointing to
>> >      the binary on a network filesystem.
>> >
>> >   4. Using the binary on the network filesystem, lldb now goes
>> >      to find the dSYM.
>> >
>> >   5. It starts by looking for a dSYM next to the binary it found.
>> >
>> >   6. lldb is now reading the dSYM over a network filesystem,
>> >      ignoring the one it found on its local filesystem earlier.
>> >
>> > Everything still *works* but it's much slower.
>> >
>> > This would be a tricky one to write up in a testsuite case;
>> > you really need the binary to not exist on the local system.
>> > And LocateMacOSXFilesUsingDebugSymbols will only compile on
>> > Mac OS X - even if I found a way to write up a test case, it
>> > would not run anywhere but on a mac.
>> >
>> > One change Greg wanted while I was touching this code was to
>> > have LocateMacOSXFilesUsingDebugSymbols (which could be asked
>> > to find a binary OR find a dSYM) to instead return a ModuleSpec
>> > with the sum total of everything it could find.  This
>> > change of passing around a ModuleSpec instead of a FileSpec
>> > was percolated up into ModuleList::GetSharedModule.
>> >
>> > The changes to LocateMacOSXFilesUsingDebugSymbols look larger
>> > than they really are - there's a lot of simple whitespace changes
>> > in there.
>> >
>> > I ran the testsuites on mac, no new regressions introduced
>> >
>> > <rdar://problem/21993813>
>> >
>> > 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=248985&r1=248984&r2=248985&view=diff
>> >
>> > ==============================================================================
>> > --- lldb/trunk/include/lldb/Host/Symbols.h (original)
>> > +++ lldb/trunk/include/lldb/Host/Symbols.h Thu Oct  1 00:37:22 2015
>> > @@ -29,7 +29,7 @@ public:
>> >      // Locating the file should happen only on the local computer or
>> > using
>> >      // the current computers global settings.
>> >
>> > //----------------------------------------------------------------------
>> > -    static FileSpec
>> > +    static ModuleSpec
>> >      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=248985&r1=248984&r2=248985&view=diff
>> >
>> > ==============================================================================
>> > --- lldb/trunk/source/Core/ModuleList.cpp (original)
>> > +++ lldb/trunk/source/Core/ModuleList.cpp Thu Oct  1 00:37:22 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.
>> > -    FileSpec file_spec = Symbols::LocateExecutableObjectFile
>> > (module_spec);
>> > +    ModuleSpec located_binary_modulespec =
>> > Symbols::LocateExecutableObjectFile (module_spec);
>> >
>> >      // Don't look for the file if it appears to be the same one we
>> > already
>> >      // checked for above...
>> > -    if (file_spec != module_file_spec)
>> > +    if (located_binary_modulespec.GetFileSpec() != module_file_spec)
>> >      {
>> > -        if (!file_spec.Exists())
>> > +        if (!located_binary_modulespec.GetFileSpec().Exists())
>> >          {
>> > -            file_spec.GetPath(path, sizeof(path));
>> > +            located_binary_modulespec.GetFileSpec().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 (file_spec.Exists())
>> > +            if (located_binary_modulespec.GetFileSpec().Exists())
>> >              {
>> >                  std::string uuid_str;
>> >                  if (uuid_ptr && uuid_ptr->IsValid())
>> > @@ -1084,9 +1084,8 @@ 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(module_spec);
>> > -        platform_module_spec.GetFileSpec() = file_spec;
>> > -        platform_module_spec.GetPlatformFileSpec() = file_spec;
>> > +        ModuleSpec platform_module_spec(located_binary_modulespec);
>> > +        platform_module_spec.GetPlatformFileSpec() =
>> > located_binary_modulespec.GetFileSpec();
>> >          ModuleList matching_module_list;
>> >          if (shared_module_list.FindModules (platform_module_spec,
>> > matching_module_list) > 0)
>> >          {
>> > @@ -1096,7 +1095,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(file_spec.GetModificationTime());
>> > +                TimeValue
>> > file_spec_mod_time(located_binary_modulespec.GetFileSpec().GetModificationTime());
>> >                  if (file_spec_mod_time.IsValid())
>> >                  {
>> >                      if (file_spec_mod_time !=
>> > module_sp->GetModificationTime())
>> > @@ -1125,9 +1124,9 @@ ModuleList::GetSharedModule
>> >              }
>> >              else
>> >              {
>> > -                file_spec.GetPath(path, sizeof(path));
>> > +                located_binary_modulespec.GetFileSpec().GetPath(path,
>> > sizeof(path));
>> >
>> > -                if (file_spec)
>> > +                if (located_binary_modulespec.GetFileSpec())
>> >                  {
>> >                      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=248985&r1=248984&r2=248985&view=diff
>> >
>> > ==============================================================================
>> > --- lldb/trunk/source/Host/common/Symbols.cpp (original)
>> > +++ lldb/trunk/source/Host/common/Symbols.cpp Thu Oct  1 00:37:22 2015
>> > @@ -38,8 +38,7 @@ int
>> >  LocateMacOSXFilesUsingDebugSymbols
>> >  (
>> >      const ModuleSpec &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
>> > +    ModuleSpec &return_module_spec
>> >  );
>> >
>> >  #else
>> > @@ -48,8 +47,7 @@ int
>> >  LocateMacOSXFilesUsingDebugSymbols
>> >  (
>> >      const ModuleSpec &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
>> > +    ModuleSpec &return_module_spec
>> >  ) {
>> >      // Cannot find MacOSX files using debug symbols on non MacOSX.
>> >      return 0;
>> > @@ -178,19 +176,25 @@ 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, NULL,
>> > &symbol_fspec);
>> > +        LocateMacOSXFilesUsingDebugSymbols (module_spec,
>> > dsym_module_spec);
>> >      }
>> > -    return symbol_fspec;
>> > +    else
>> > +    {
>> > +        dsym_module_spec.GetSymbolFileSpec() = symbol_fspec;
>> > +    }
>> > +    return dsym_module_spec.GetSymbolFileSpec();
>> >  }
>> >
>> > -FileSpec
>> > +ModuleSpec
>> >  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();
>> > @@ -200,20 +204,19 @@ 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))
>> >      {
>> > -        objfile_fspec = exec_fspec;
>> > +        result.GetFileSpec() = exec_fspec;
>> >      }
>> >      else
>> >      {
>> > -        LocateMacOSXFilesUsingDebugSymbols (module_spec,
>> > &objfile_fspec, NULL);
>> > +        LocateMacOSXFilesUsingDebugSymbols (module_spec, result);
>> >      }
>> > -    return objfile_fspec;
>> > +    return result;
>> >  }
>> >
>> >  FileSpec
>> >
>> > Modified: lldb/trunk/source/Host/macosx/Symbols.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Symbols.cpp?rev=248985&r1=248984&r2=248985&view=diff
>> >
>> > ==============================================================================
>> > --- lldb/trunk/source/Host/macosx/Symbols.cpp (original)
>> > +++ lldb/trunk/source/Host/macosx/Symbols.cpp Thu Oct  1 00:37:22 2015
>> > @@ -55,17 +55,14 @@ int
>> >  LocateMacOSXFilesUsingDebugSymbols
>> >  (
>> >      const ModuleSpec &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
>> > +    ModuleSpec &return_module_spec
>> >  )
>> >  {
>> > -    int items_found = 0;
>> > -
>> > -    if (out_exec_fspec)
>> > -        out_exec_fspec->Clear();
>> > +    return_module_spec = module_spec;
>> > +    return_module_spec.GetFileSpec().Clear();
>> > +    return_module_spec.GetSymbolFileSpec().Clear();
>> >
>> > -    if (out_dsym_fspec)
>> > -        out_dsym_fspec->Clear();
>> > +    int items_found = 0;
>> >
>> >  #if !defined (__arm__) && !defined (__arm64__) && !defined
>> > (__aarch64__) // No DebugSymbols on the iOS devices
>> >
>> > @@ -110,151 +107,132 @@ LocateMacOSXFilesUsingDebugSymbols
>> >
>> > strlen(exec_cf_path),
>> >
>> > FALSE));
>> >                  }
>> > -                if (log)
>> > -                {
>> > -                    std::string searching_for;
>> > -                    if (out_exec_fspec && out_dsym_fspec)
>> > -                    {
>> > -                        searching_for = "executable binary and dSYM";
>> > -                    }
>> > -                    else if (out_exec_fspec)
>> > -                    {
>> > -                        searching_for = "executable binary";
>> > -                    }
>> > -                    else
>> > -                    {
>> > -                        searching_for = "dSYM bundle";
>> > -                    }
>> > -                    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)
>> > +                    if (::CFURLGetFileSystemRepresentation
>> > (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
>> > +                    {
>> > +                        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;
>> > +                    }
>> > +
>> > +                    bool success = false;
>> > +                    if (log)
>> >                      {
>> >                          if (::CFURLGetFileSystemRepresentation
>> > (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
>> >                          {
>> > -                            if (log)
>> > -                            {
>> > -                                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] ==
>> > '~');
>> > +                            log->Printf ("DebugSymbols framework
>> > returned dSYM path of %s for UUID %s -- looking for an exec file", path,
>> > uuid->GetAsString().c_str());
>> > +                        }
>> >
>> > -                            if (out_dsym_fspec->GetFileType () ==
>> > FileSpec::eFileTypeDirectory)
>> > +                    }
>> > +
>> > +                    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)
>> > +                    {
>> > +                        CFStringRef exec_cf_path =
>> > static_cast<CFStringRef>(::CFDictionaryGetValue (uuid_dict,
>> > CFSTR("DBGSymbolRichExecutable")));
>> > +                        if (exec_cf_path &&
>> > ::CFStringGetFileSystemRepresentation (exec_cf_path, path, sizeof(path)))
>> > +                        {
>> > +                            if (log)
>> >                              {
>> > -                                *out_dsym_fspec =
>> > Symbols::FindSymbolFileInBundle (*out_dsym_fspec, uuid, arch);
>> > -                                if (*out_dsym_fspec)
>> > -                                    ++items_found;
>> > +                                log->Printf ("plist bundle has exec
>> > path of %s for UUID %s", path, uuid->GetAsString().c_str());
>> >                              }
>> > -                            else
>> > +                            ++items_found;
>> > +                            FileSpec exec_filespec (path, path[0] ==
>> > '~');
>> > +                            if (exec_filespec.Exists())
>> >                              {
>> > -                                ++items_found;
>> > +                                success = true;
>> > +                                return_module_spec.GetFileSpec() =
>> > exec_filespec;
>> >                              }
>> >                          }
>> >                      }
>> >
>> > -                    if (out_exec_fspec)
>> > +                    if (!success)
>> >                      {
>> > -                        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)
>> > +                        // No dictionary, check near the dSYM bundle
>> > for an executable that matches...
>> > +                        if (::CFURLGetFileSystemRepresentation
>> > (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
>> >                          {
>> > -                            CFStringRef exec_cf_path =
>> > static_cast<CFStringRef>(::CFDictionaryGetValue (uuid_dict,
>> > CFSTR("DBGSymbolRichExecutable")));
>> > -                            if (exec_cf_path &&
>> > ::CFStringGetFileSystemRepresentation (exec_cf_path, path, sizeof(path)))
>> > +                            char *dsym_extension_pos = ::strstr (path,
>> > ".dSYM");
>> > +                            if (dsym_extension_pos)
>> >                              {
>> > +                                *dsym_extension_pos = '\0';
>> >                                  if (log)
>> >                                  {
>> > -                                    log->Printf ("plist bundle has exec
>> > path of %s for UUID %s", path, uuid->GetAsString().c_str());
>> > +                                    log->Printf ("Looking for
>> > executable binary next to dSYM bundle with name with name %s", path);
>> >                                  }
>> > -                                ++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)
>> > +                                FileSpec file_spec (path, true);
>> > +                                ModuleSpecList module_specs;
>> > +                                ModuleSpec matched_module_spec;
>> > +                                switch (file_spec.GetFileType())
>> >                                  {
>> > -                                    *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?
>> > +                                    case FileSpec::eFileTypeDirectory:
>> > // Bundle directory?
>> > +                                        {
>> > +                                            CFCBundle bundle (path);
>> > +                                            CFCReleaser<CFURLRef>
>> > bundle_exe_url (bundle.CopyExecutableURL ());
>> > +                                            if (bundle_exe_url.get())
>> >                                              {
>> > -                                                CFCBundle bundle
>> > (path);
>> > -                                                CFCReleaser<CFURLRef>
>> > bundle_exe_url (bundle.CopyExecutableURL ());
>> > -                                                if
>> > (bundle_exe_url.get())
>> > +                                                if
>> > (::CFURLGetFileSystemRepresentation (bundle_exe_url.get(), true,
>> > (UInt8*)path, sizeof(path)-1))
>> >                                                  {
>> > -                                                    if
>> > (::CFURLGetFileSystemRepresentation (bundle_exe_url.get(), true,
>> > (UInt8*)path, sizeof(path)-1))
>> > -                                                    {
>> > -                                                        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))
>> > +                                                    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))
>> >
>> > +                                                    {
>> > +                                                        ++items_found;
>> > +
>> > return_module_spec.GetFileSpec() = bundle_exe_file_spec;
>> > +                                                        if (log)
>> >                                                          {
>> > -
>> > ++items_found;
>> > -
>> > *out_exec_fspec = bundle_exe_file_spec;
>> > -                                                            if (log)
>> > -                                                            {
>> > -
>> > log->Printf ("Executable binary %s next to dSYM is compatible; using",
>> > path);
>> > -                                                            }
>> > +                                                            log->Printf
>> > ("Executable binary %s next to dSYM is compatible; using", path);
>> >                                                          }
>> >                                                      }
>> >                                                  }
>> >                                              }
>> > -                                            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))
>> > +                                        }
>> > +                                        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))
>> > +
>> > +                                        {
>> > +                                            ++items_found;
>> > +
>> > return_module_spec.GetFileSpec() = file_spec;
>> > +                                            if (log)
>> >                                              {
>> > -                                                ++items_found;
>> > -                                                *out_exec_fspec =
>> > file_spec;
>> > -                                                if (log)
>> > -                                                {
>> > -                                                    log->Printf
>> > ("Executable binary %s next to dSYM is compatible; using", path);
>> > -                                                }
>> > +                                                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=248985&r1=248984&r2=248985&view=diff
>> >
>> > ==============================================================================
>> > --- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
>> > (original)
>> > +++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp Thu
>> > Oct  1 00:37:22 2015
>> > @@ -321,7 +321,13 @@ ProcessKDP::DoConnectRemote (Stream *str
>> >                              // Lookup UUID locally, before attempting
>> > dsymForUUID like action
>> >                              module_spec.GetSymbolFileSpec() =
>> > Symbols::LocateExecutableSymbolFile(module_spec);
>> >                              if (module_spec.GetSymbolFileSpec())
>> > -                                 module_spec.GetFileSpec() =
>> > Symbols::LocateExecutableObjectFile (module_spec);
>> > +                            {
>> > +                                ModuleSpec executable_module_spec =
>> > Symbols::LocateExecutableObjectFile (module_spec);
>> > +                                if
>> > (executable_module_spec.GetFileSpec().Exists())
>> > +                                {
>> > +                                    module_spec.GetFileSpec() =
>> > executable_module_spec.GetFileSpec();
>> > +                                }
>> > +                            }
>> >                              if (!module_spec.GetSymbolFileSpec() ||
>> > !module_spec.GetSymbolFileSpec())
>> >                                   Symbols::DownloadObjectAndSymbolFile
>> > (module_spec, true);
>> >
>> >
>> >
>> > _______________________________________________
>> > lldb-commits mailing list
>> > lldb-commits@lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to