This broke the green dragon cmake bot ====================================================================== FAIL: test_partial_uuid_match (TestMiniDumpUUID.MiniDumpUUIDTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/buildslave/jenkins/workspace/lldb-cmake/llvm/tools/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpUUID.py", line 161, in test_partial_uuid_match "7295E17C-6668-9E05-CBB5-DEE5003865D5-5267C116") File "/Users/buildslave/jenkins/workspace/lldb-cmake/llvm/tools/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpUUID.py", line 33, in verify_module self.assertEqual(verify_path, module.GetFileSpec().fullpath) AssertionError: 'libuuidmatch.so' != '/Users/buildslave/jenkins/workspace/lldb-cmake/lldb-build/lldb-test-build.noindex/functionalities/postmortem/minidump-new/TestMiniDumpUUID.test_partial_uuid_match/libuuidmatch.so' Config=x86_64-/Users/buildslave/jenkins/workspace/lldb-cmake/lldb-build/bin/clang-9
Seems relatively straightforward to fix, can you take a look? http://lab.llvm.org:8080/green/view/LLDB/job/lldb-cmake/22921/console (Also, change your reply to, it's still using your @apple address, you can just mail Chris Lattner). -- Davide On Tue, Apr 2, 2019 at 8:39 AM Greg Clayton via lldb-commits <lldb-commits@lists.llvm.org> wrote: > > Author: gclayton > Date: Tue Apr 2 08:40:54 2019 > New Revision: 357482 > > URL: http://llvm.org/viewvc/llvm-project?rev=357482&view=rev > Log: > Allow partial UUID matching in Minidump core file plug-in > > Breakpad had bugs in earlier versions where it would take a 20 byte ELF build > ID and put it into the minidump file as a 16 byte PDB70 UUID with an age of > zero. This would make it impossible to do postmortem debugging with one of > these older minidump files. > > This fix allows partial matching of UUIDs. To do this we first try and match > with the full UUID value, and then fall back to removing the original > directory path from the module specification and we remove the UUID > requirement, and then manually do the matching ourselves. This allows scripts > to find symbols files using a symbol server, place them all in a directory, > use the "setting set target.exec-search-paths" setting to specify the > directory, and then load the core file. The Target::GetSharedModule() can > then find the correct file without doing any other matching and load it. > > Tests were added to cover a partial UUID match where the breakpad file has a > 16 byte UUID and the actual file on disk has a 20 byte UUID, both where the > first 16 bytes match, and don't match. > > Differential Revision: https://reviews.llvm.org/D60001 > > > Added: > > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmatch.yaml > > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmismatch.yaml > > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-arm-partial-uuids-match.dmp > (with props) > > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-arm-partial-uuids-mismatch.dmp > (with props) > Modified: > > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpUUID.py > lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp > > Modified: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpUUID.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpUUID.py?rev=357482&r1=357481&r2=357482&view=diff > ============================================================================== > --- > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpUUID.py > (original) > +++ > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpUUID.py > Tue Apr 2 08:40:54 2019 > @@ -8,6 +8,7 @@ from six import iteritems > import shutil > > import lldb > +import os > from lldbsuite.test.decorators import * > from lldbsuite.test.lldbtest import * > from lldbsuite.test import lldbutil > @@ -132,3 +133,54 @@ class MiniDumpUUIDTestCase(TestBase): > self.assertEqual(2, len(modules)) > self.verify_module(modules[0], "/not/exist/a", None) > self.verify_module(modules[1], "/not/exist/b", None) > + > + def test_partial_uuid_match(self): > + """ > + Breakpad has been known to create minidump files using CvRecord > in each > + module whose signature is set to PDB70 where the UUID only > contains the > + first 16 bytes of a 20 byte ELF build ID. Code was added to > + ProcessMinidump.cpp to deal with this and allows partial UUID > matching. > + > + This test verifies that if we have a minidump with a 16 byte > UUID, that > + we are able to associate a symbol file with a 20 byte UUID only > if the > + first 16 bytes match. In this case we will see the path from the > file > + we found in the test directory and the 20 byte UUID from the > actual > + file, not the 16 byte shortened UUID from the minidump. > + """ > + so_path = self.getBuildArtifact("libuuidmatch.so") > + self.yaml2obj("libuuidmatch.yaml", so_path) > + self.dbg.CreateTarget(None) > + self.target = self.dbg.GetSelectedTarget() > + cmd = 'settings set target.exec-search-paths "%s"' % > (os.path.dirname(so_path)) > + self.dbg.HandleCommand(cmd) > + self.process = > self.target.LoadCore("linux-arm-partial-uuids-match.dmp") > + modules = self.target.modules > + self.assertEqual(1, len(modules)) > + self.verify_module(modules[0], > + "libuuidmatch.so", > + "7295E17C-6668-9E05-CBB5-DEE5003865D5-5267C116") > + > + def test_partial_uuid_mismatch(self): > + """ > + Breakpad has been known to create minidump files using CvRecord > in each > + module whose signature is set to PDB70 where the UUID only > contains the > + first 16 bytes of a 20 byte ELF build ID. Code was added to > + ProcessMinidump.cpp to deal with this and allows partial UUID > matching. > + > + This test verifies that if we have a minidump with a 16 byte > UUID, that > + we are not able to associate a symbol file with a 20 byte UUID > only if > + any of the first 16 bytes do not match. In this case we will see > the UUID > + from the minidump file and the path from the minidump file. > + """ > + so_path = self.getBuildArtifact("libuuidmismatch.so") > + self.yaml2obj("libuuidmatch.yaml", so_path) > + self.dbg.CreateTarget(None) > + self.target = self.dbg.GetSelectedTarget() > + cmd = 'settings set target.exec-search-paths "%s"' % > (os.path.dirname(so_path)) > + self.dbg.HandleCommand(cmd) > + self.process = > self.target.LoadCore("linux-arm-partial-uuids-mismatch.dmp") > + modules = self.target.modules > + self.assertEqual(1, len(modules)) > + self.verify_module(modules[0], > + > "/invalid/path/on/current/system/libuuidmismatch.so", > + "7295E17C-6668-9E05-CBB5-DEE5003865D5") > > Added: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmatch.yaml > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmatch.yaml?rev=357482&view=auto > ============================================================================== > --- > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmatch.yaml > (added) > +++ > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmatch.yaml > Tue Apr 2 08:40:54 2019 > @@ -0,0 +1,14 @@ > +--- !ELF > +FileHeader: > + Class: ELFCLASS32 > + Data: ELFDATA2LSB > + Type: ET_DYN > + Machine: EM_ARM > + Flags: [ EF_ARM_SOFT_FLOAT, EF_ARM_EABI_VER5 ] > +Sections: > + - Name: .note.gnu.build-id > + Type: SHT_NOTE > + Flags: [ SHF_ALLOC ] > + Address: 0x0000000000000114 > + AddressAlign: 0x0000000000000004 > + Content: > 040000001400000003000000474E55007295E17C66689E05CBB5DEE5003865D55267C116 > > Added: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmismatch.yaml > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmismatch.yaml?rev=357482&view=auto > ============================================================================== > --- > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmismatch.yaml > (added) > +++ > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/libuuidmismatch.yaml > Tue Apr 2 08:40:54 2019 > @@ -0,0 +1,14 @@ > +--- !ELF > +FileHeader: > + Class: ELFCLASS32 > + Data: ELFDATA2LSB > + Type: ET_DYN > + Machine: EM_ARM > + Flags: [ EF_ARM_SOFT_FLOAT, EF_ARM_EABI_VER5 ] > +Sections: > + - Name: .note.gnu.build-id > + Type: SHT_NOTE > + Flags: [ SHF_ALLOC ] > + Address: 0x0000000000000114 > + AddressAlign: 0x0000000000000004 > + Content: > 040000001400000003000000474E55008295E17C66689E05CBB5DEE5003865D55267C116 > > Added: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-arm-partial-uuids-match.dmp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-arm-partial-uuids-match.dmp?rev=357482&view=auto > ============================================================================== > Binary file - no diff available. > > Propchange: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-arm-partial-uuids-match.dmp > ------------------------------------------------------------------------------ > svn:mime-type = application/octet-stream > > Added: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-arm-partial-uuids-mismatch.dmp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-arm-partial-uuids-mismatch.dmp?rev=357482&view=auto > ============================================================================== > Binary file - no diff available. > > Propchange: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-arm-partial-uuids-mismatch.dmp > ------------------------------------------------------------------------------ > svn:mime-type = application/octet-stream > > Modified: lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp?rev=357482&r1=357481&r2=357482&view=diff > ============================================================================== > --- lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp (original) > +++ lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp Tue Apr 2 > 08:40:54 2019 > @@ -351,6 +351,8 @@ void ProcessMinidump::ReadModuleList() { > std::vector<const MinidumpModule *> filtered_modules = > m_minidump_parser->GetFilteredModuleList(); > > + Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES)); > + > for (auto module : filtered_modules) { > llvm::Optional<std::string> name = > m_minidump_parser->GetMinidumpString(module->module_name_rva); > @@ -358,7 +360,6 @@ void ProcessMinidump::ReadModuleList() { > if (!name) > continue; > > - Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES)); > if (log) { > log->Printf("ProcessMinidump::%s found module: name: %s %#010" PRIx64 > "-%#010" PRIx64 " size: %" PRIu32, > @@ -374,14 +375,46 @@ void ProcessMinidump::ReadModuleList() { > m_is_wow64 = true; > } > > + if (log) { > + log->Printf("ProcessMinidump::%s load module: name: %s", __FUNCTION__, > + name.getValue().c_str()); > + } > + > const auto uuid = m_minidump_parser->GetModuleUUID(module); > auto file_spec = FileSpec(name.getValue(), > GetArchitecture().GetTriple()); > FileSystem::Instance().Resolve(file_spec); > ModuleSpec module_spec(file_spec, uuid); > module_spec.GetArchitecture() = GetArchitecture(); > Status error; > + // Try and find a module with a full UUID that matches. This function > will > + // add the module to the target if it finds one. > lldb::ModuleSP module_sp = GetTarget().GetSharedModule(module_spec, > &error); > - if (!module_sp || error.Fail()) { > + if (!module_sp) { > + // Try and find a module without specifying the UUID and only looking > for > + // the file given a basename. We then will look for a partial UUID > match > + // if we find any matches. This function will add the module to the > + // target if it finds one, so we need to remove the module from the > target > + // if the UUID doesn't match during our manual UUID verification. This > + // allows the "target.exec-search-paths" setting to specify one or more > + // directories that contain executables that can be searched for > matches. > + ModuleSpec basename_module_spec(module_spec); > + basename_module_spec.GetUUID().Clear(); > + basename_module_spec.GetFileSpec().GetDirectory().Clear(); > + module_sp = GetTarget().GetSharedModule(basename_module_spec, &error); > + if (module_sp) { > + // We consider the module to be a match if the minidump UUID is a > + // prefix of the actual UUID, or if either of the UUIDs are empty. > + const auto dmp_bytes = uuid.GetBytes(); > + const auto mod_bytes = module_sp->GetUUID().GetBytes(); > + const bool match = dmp_bytes.empty() || mod_bytes.empty() || > + mod_bytes.take_front(dmp_bytes.size()) == dmp_bytes; > + if (!match) { > + GetTarget().GetImages().Remove(module_sp); > + module_sp.reset(); > + } > + } > + } > + if (!module_sp) { > // We failed to locate a matching local object file. Fortunately, the > // minidump format encodes enough information about each module's > memory > // range to allow us to create placeholder modules. > @@ -400,11 +433,6 @@ void ProcessMinidump::ReadModuleList() { > GetTarget().GetImages().Append(module_sp); > } > > - if (log) { > - log->Printf("ProcessMinidump::%s load module: name: %s", __FUNCTION__, > - name.getValue().c_str()); > - } > - > bool load_addr_changed = false; > module_sp->SetLoadAddress(GetTarget(), module->base_of_image, false, > load_addr_changed); > > > _______________________________________________ > lldb-commits mailing list > lldb-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits