[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 02:09:36 PDT 2015
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