[Lldb-commits] [lldb] r248985 - Fixing a subtle issue on Mac OS X systems with dSYMs (possibly

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


>From one of the failing tests:
===================
runCmd: expr release_child_flag = 1
output: (volatile int) $0 = 1


Expecting sub string: = 1
Matched

runCmd: print (int)getpgid(0)
runCmd failed!
error: use of undeclared identifier 'getpgid'
error: 1 errors parsing expression
===============

here, release_child_flag is in the inferior (and has debug info), and
evaluating an expression with it works.
getpgid is in libc (for which we only have .symtab), and lldb cannot
find it for some reason.

hope that helps,
pl


On 1 October 2015 at 10:09, Pavel Labath <labath at google.com> wrote:
> 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 at 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 <jmolenda at 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 <zturner at 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 at 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 at lists.llvm.org
>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>>>
>>
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>>


More information about the lldb-commits mailing list