mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-10 01:55:08 +00:00
Revert minidump changes
This reverts the following two commits: Revert "Extend r356573 (minidump UUID handling) to cover elf build-ids too" Revert "Fix UUID decoding from minidump files" Greg's original commit broke the sanitizer bot which has been red for several days now. http://green.lab.llvm.org/green/view/LLDB/job/lldb-sanitized/ llvm-svn: 356806
This commit is contained in:
parent
5991328c96
commit
f261638c10
@ -1,134 +0,0 @@
|
||||
"""
|
||||
Test basics of Minidump debugging.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
from six import iteritems
|
||||
|
||||
import shutil
|
||||
|
||||
import lldb
|
||||
from lldbsuite.test.decorators import *
|
||||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test import lldbutil
|
||||
|
||||
|
||||
class MiniDumpUUIDTestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
NO_DEBUG_INFO_TESTCASE = True
|
||||
|
||||
def setUp(self):
|
||||
super(MiniDumpUUIDTestCase, self).setUp()
|
||||
self._initial_platform = lldb.DBG.GetSelectedPlatform()
|
||||
|
||||
def tearDown(self):
|
||||
lldb.DBG.SetSelectedPlatform(self._initial_platform)
|
||||
super(MiniDumpUUIDTestCase, self).tearDown()
|
||||
|
||||
def verify_module(self, module, verify_path, verify_uuid):
|
||||
uuid = module.GetUUIDString()
|
||||
self.assertEqual(verify_path, module.GetFileSpec().fullpath)
|
||||
self.assertEqual(verify_uuid, uuid)
|
||||
|
||||
def test_zero_uuid_modules(self):
|
||||
"""
|
||||
Test multiple modules having a MINIDUMP_MODULE.CvRecord that is valid,
|
||||
but contains a PDB70 value whose age is zero and whose UUID values are
|
||||
all zero. Prior to a fix all such modules would be duplicated to the
|
||||
first one since the UUIDs claimed to be valid and all zeroes. Now we
|
||||
ensure that the UUID is not valid for each module and that we have
|
||||
each of the modules in the target after loading the core
|
||||
"""
|
||||
self.dbg.CreateTarget(None)
|
||||
self.target = self.dbg.GetSelectedTarget()
|
||||
self.process = self.target.LoadCore("linux-arm-zero-uuids.dmp")
|
||||
modules = self.target.modules
|
||||
self.assertEqual(2, len(modules))
|
||||
self.verify_module(modules[0], "/file/does/not/exist/a", None)
|
||||
self.verify_module(modules[1], "/file/does/not/exist/b", None)
|
||||
|
||||
def test_uuid_modules_no_age(self):
|
||||
"""
|
||||
Test multiple modules having a MINIDUMP_MODULE.CvRecord that is valid,
|
||||
and contains a PDB70 value whose age is zero and whose UUID values are
|
||||
valid. Ensure we decode the UUID and don't include the age field in the UUID.
|
||||
"""
|
||||
self.dbg.CreateTarget(None)
|
||||
self.target = self.dbg.GetSelectedTarget()
|
||||
self.process = self.target.LoadCore("linux-arm-uuids-no-age.dmp")
|
||||
modules = self.target.modules
|
||||
self.assertEqual(2, len(modules))
|
||||
self.verify_module(modules[0], "/tmp/a", "01020304-0506-0708-090A-0B0C0D0E0F10")
|
||||
self.verify_module(modules[1], "/tmp/b", "0A141E28-323C-4650-5A64-6E78828C96A0")
|
||||
|
||||
def test_uuid_modules_no_age_apple(self):
|
||||
"""
|
||||
Test multiple modules having a MINIDUMP_MODULE.CvRecord that is valid,
|
||||
and contains a PDB70 value whose age is zero and whose UUID values are
|
||||
valid. Ensure we decode the UUID and don't include the age field in the UUID.
|
||||
Also ensure that the first uint32_t is byte swapped, along with the next
|
||||
two uint16_t values. Breakpad incorrectly byte swaps these values when it
|
||||
saves Darwin minidump files.
|
||||
"""
|
||||
self.dbg.CreateTarget(None)
|
||||
self.target = self.dbg.GetSelectedTarget()
|
||||
self.process = self.target.LoadCore("macos-arm-uuids-no-age.dmp")
|
||||
modules = self.target.modules
|
||||
self.assertEqual(2, len(modules))
|
||||
self.verify_module(modules[0], "/tmp/a", "04030201-0605-0807-090A-0B0C0D0E0F10")
|
||||
self.verify_module(modules[1], "/tmp/b", "281E140A-3C32-5046-5A64-6E78828C96A0")
|
||||
|
||||
def test_uuid_modules_with_age(self):
|
||||
"""
|
||||
Test multiple modules having a MINIDUMP_MODULE.CvRecord that is valid,
|
||||
and contains a PDB70 value whose age is valid and whose UUID values are
|
||||
valid. Ensure we decode the UUID and include the age field in the UUID.
|
||||
"""
|
||||
self.dbg.CreateTarget(None)
|
||||
self.target = self.dbg.GetSelectedTarget()
|
||||
self.process = self.target.LoadCore("linux-arm-uuids-with-age.dmp")
|
||||
modules = self.target.modules
|
||||
self.assertEqual(2, len(modules))
|
||||
self.verify_module(modules[0], "/tmp/a", "01020304-0506-0708-090A-0B0C0D0E0F10-10101010")
|
||||
self.verify_module(modules[1], "/tmp/b", "0A141E28-323C-4650-5A64-6E78828C96A0-20202020")
|
||||
|
||||
def test_uuid_modules_elf_build_id_16(self):
|
||||
"""
|
||||
Test multiple modules having a MINIDUMP_MODULE.CvRecord that is valid,
|
||||
and contains a ELF build ID whose value is valid and is 16 bytes long.
|
||||
"""
|
||||
self.dbg.CreateTarget(None)
|
||||
self.target = self.dbg.GetSelectedTarget()
|
||||
self.process = self.target.LoadCore("linux-arm-uuids-elf-build-id-16.dmp")
|
||||
modules = self.target.modules
|
||||
self.assertEqual(2, len(modules))
|
||||
self.verify_module(modules[0], "/tmp/a", "01020304-0506-0708-090A-0B0C0D0E0F10")
|
||||
self.verify_module(modules[1], "/tmp/b", "0A141E28-323C-4650-5A64-6E78828C96A0")
|
||||
|
||||
def test_uuid_modules_elf_build_id_20(self):
|
||||
"""
|
||||
Test multiple modules having a MINIDUMP_MODULE.CvRecord that is valid,
|
||||
and contains a ELF build ID whose value is valid and is 20 bytes long.
|
||||
"""
|
||||
self.dbg.CreateTarget(None)
|
||||
self.target = self.dbg.GetSelectedTarget()
|
||||
self.process = self.target.LoadCore("linux-arm-uuids-elf-build-id-20.dmp")
|
||||
modules = self.target.modules
|
||||
self.assertEqual(2, len(modules))
|
||||
self.verify_module(modules[0], "/tmp/a", "01020304-0506-0708-090A-0B0C0D0E0F10-11121314")
|
||||
self.verify_module(modules[1], "/tmp/b", "0A141E28-323C-4650-5A64-6E78828C96A0-AAB4BEC8")
|
||||
|
||||
def test_uuid_modules_elf_build_id_zero(self):
|
||||
"""
|
||||
Test multiple modules having a MINIDUMP_MODULE.CvRecord that is valid,
|
||||
and contains a ELF build ID whose value is all zero.
|
||||
"""
|
||||
self.dbg.CreateTarget(None)
|
||||
self.target = self.dbg.GetSelectedTarget()
|
||||
self.process = self.target.LoadCore("linux-arm-uuids-elf-build-id-zero.dmp")
|
||||
modules = self.target.modules
|
||||
self.assertEqual(2, len(modules))
|
||||
self.verify_module(modules[0], "/not/exist/a", None)
|
||||
self.verify_module(modules[1], "/not/exist/b", None)
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -165,46 +165,23 @@ UUID MinidumpParser::GetModuleUUID(const MinidumpModule *module) {
|
||||
static_cast<CvSignature>(static_cast<uint32_t>(*signature));
|
||||
|
||||
if (cv_signature == CvSignature::Pdb70) {
|
||||
// PDB70 record
|
||||
const CvRecordPdb70 *pdb70_uuid = nullptr;
|
||||
Status error = consumeObject(cv_record, pdb70_uuid);
|
||||
if (error.Fail())
|
||||
return UUID();
|
||||
// If the age field is not zero, then include the entire pdb70_uuid struct
|
||||
if (pdb70_uuid->Age != 0)
|
||||
return UUID::fromData(pdb70_uuid, sizeof(*pdb70_uuid));
|
||||
|
||||
// Many times UUIDs are all zeroes. This can cause more than one module
|
||||
// to claim it has a valid UUID of all zeroes and causes the files to all
|
||||
// merge into the first module that claims this valid zero UUID.
|
||||
bool all_zeroes = true;
|
||||
for (size_t i = 0; all_zeroes && i < sizeof(pdb70_uuid->Uuid); ++i)
|
||||
all_zeroes = pdb70_uuid->Uuid[i] == 0;
|
||||
if (all_zeroes)
|
||||
return UUID();
|
||||
|
||||
if (GetArchitecture().GetTriple().getVendor() == llvm::Triple::Apple) {
|
||||
// Breakpad incorrectly byte swaps the first 32 bit and next 2 16 bit
|
||||
// values in the UUID field. Undo this so we can match things up
|
||||
// with our symbol files
|
||||
uint8_t apple_uuid[16];
|
||||
// Byte swap the first 32 bits
|
||||
apple_uuid[0] = pdb70_uuid->Uuid[3];
|
||||
apple_uuid[1] = pdb70_uuid->Uuid[2];
|
||||
apple_uuid[2] = pdb70_uuid->Uuid[1];
|
||||
apple_uuid[3] = pdb70_uuid->Uuid[0];
|
||||
// Byte swap the next 16 bit value
|
||||
apple_uuid[4] = pdb70_uuid->Uuid[5];
|
||||
apple_uuid[5] = pdb70_uuid->Uuid[4];
|
||||
// Byte swap the next 16 bit value
|
||||
apple_uuid[6] = pdb70_uuid->Uuid[7];
|
||||
apple_uuid[7] = pdb70_uuid->Uuid[6];
|
||||
for (size_t i = 8; i < sizeof(pdb70_uuid->Uuid); ++i)
|
||||
apple_uuid[i] = pdb70_uuid->Uuid[i];
|
||||
return UUID::fromData(apple_uuid, sizeof(apple_uuid));
|
||||
if (!error.Fail()) {
|
||||
auto arch = GetArchitecture();
|
||||
// For Apple targets we only need a 16 byte UUID so that we can match
|
||||
// the UUID in the Module to actual UUIDs from the built binaries. The
|
||||
// "Age" field is zero in breakpad minidump files for Apple targets, so
|
||||
// we restrict the UUID to the "Uuid" field so we have a UUID we can use
|
||||
// to match.
|
||||
if (arch.GetTriple().getVendor() == llvm::Triple::Apple)
|
||||
return UUID::fromData(pdb70_uuid->Uuid, sizeof(pdb70_uuid->Uuid));
|
||||
else
|
||||
return UUID::fromData(pdb70_uuid, sizeof(*pdb70_uuid));
|
||||
}
|
||||
return UUID::fromData(pdb70_uuid->Uuid, sizeof(pdb70_uuid->Uuid));
|
||||
} else if (cv_signature == CvSignature::ElfBuildId)
|
||||
return UUID::fromOptionalData(cv_record);
|
||||
return UUID::fromData(cv_record);
|
||||
|
||||
return UUID();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user