[Lldb-commits] [lldb] r248985 - Fixing a subtle issue on Mac OS X systems with dSYMs (possibly
Jason Molenda via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 1 12:58:04 PDT 2015
Thanks Pavel. I'll read through the code and try to figure out what's happening here.
J
> On Oct 1, 2015, at 3:15 AM, Pavel Labath <labath at google.com> wrote:
>
> 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