Skip to content

Commit 2860a75

Browse files
committed
Remove 64b specific method and create Cache from both memory 32 and memory 64.
Add Mem64List to Obj2Yaml and Yaml2Minidump Fix yaml2obj minidump emission where I was passing a stack variable by reference. Change CreateRegionsCache to not double evaluate Expected<T> as it was causing unchecked to flip back to true instead slotting into an optional. Uncomment python tests" Run C++ and Python formatters. Revert unchanged files. Modify test yaml to show support for multiple mem64 entries Remove llvm related components because they were changed in a different patch
1 parent 4e078e3 commit 2860a75

File tree

5 files changed

+96
-34
lines changed

5 files changed

+96
-34
lines changed

lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,15 +1020,17 @@ MinidumpFileBuilder::AddMemoryList_32(Process::CoreFileMemoryRanges &ranges) {
10201020
// With a size of the number of ranges as a 32 bit num
10211021
// And then the size of all the ranges
10221022
error = AddDirectory(StreamType::MemoryList,
1023-
sizeof(llvm::support::ulittle32_t) +
1023+
sizeof(llvm::minidump::MemoryListHeader) +
10241024
descriptors.size() *
10251025
sizeof(llvm::minidump::MemoryDescriptor));
10261026
if (error.Fail())
10271027
return error;
10281028

1029+
llvm::minidump::MemoryListHeader list_header;
10291030
llvm::support::ulittle32_t memory_ranges_num =
10301031
static_cast<llvm::support::ulittle32_t>(descriptors.size());
1031-
m_data.AppendData(&memory_ranges_num, sizeof(llvm::support::ulittle32_t));
1032+
list_header.NumberOfMemoryRanges = memory_ranges_num;
1033+
m_data.AppendData(&list_header, sizeof(llvm::minidump::MemoryListHeader));
10321034
// For 32b we can get away with writing off the descriptors after the data.
10331035
// This means no cleanup loop needed.
10341036
m_data.AppendData(descriptors.data(),
@@ -1050,9 +1052,10 @@ MinidumpFileBuilder::AddMemoryList_64(Process::CoreFileMemoryRanges &ranges) {
10501052
if (error.Fail())
10511053
return error;
10521054

1055+
llvm::minidump::Memory64ListHeader list_header;
10531056
llvm::support::ulittle64_t memory_ranges_num =
10541057
static_cast<llvm::support::ulittle64_t>(ranges.size());
1055-
m_data.AppendData(&memory_ranges_num, sizeof(llvm::support::ulittle64_t));
1058+
list_header.NumberOfMemoryRanges = memory_ranges_num;
10561059
// Capture the starting offset for all the descriptors so we can clean them up
10571060
// if needed.
10581061
offset_t starting_offset =
@@ -1064,8 +1067,8 @@ MinidumpFileBuilder::AddMemoryList_64(Process::CoreFileMemoryRanges &ranges) {
10641067
(ranges.size() * sizeof(llvm::minidump::MemoryDescriptor_64));
10651068
llvm::support::ulittle64_t memory_ranges_base_rva =
10661069
static_cast<llvm::support::ulittle64_t>(base_rva);
1067-
m_data.AppendData(&memory_ranges_base_rva,
1068-
sizeof(llvm::support::ulittle64_t));
1070+
list_header.BaseRVA = memory_ranges_base_rva;
1071+
m_data.AppendData(&list_header, sizeof(llvm::minidump::Memory64ListHeader));
10691072

10701073
bool cleanup_required = false;
10711074
std::vector<MemoryDescriptor_64> descriptors;

lldb/source/Plugins/Process/minidump/MinidumpParser.cpp

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -553,43 +553,45 @@ static bool
553553
CreateRegionsCacheFromMemoryList(MinidumpParser &parser,
554554
std::vector<MemoryRegionInfo> &regions) {
555555
Log *log = GetLog(LLDBLog::Modules);
556+
// Cache the expected memory32 into an optional
557+
// because double checking the expected triggers the unchecked warning.
558+
std::optional<llvm::ArrayRef<MemoryDescriptor>> memory32_list;
556559
auto ExpectedMemory = parser.GetMinidumpFile().getMemoryList();
557560
if (!ExpectedMemory) {
558561
LLDB_LOG_ERROR(log, ExpectedMemory.takeError(),
559562
"Failed to read memory list: {0}");
560-
return false;
561-
}
562-
regions.reserve(ExpectedMemory->size());
563-
for (const MemoryDescriptor &memory_desc : *ExpectedMemory) {
564-
if (memory_desc.Memory.DataSize == 0)
565-
continue;
566-
MemoryRegionInfo region;
567-
region.GetRange().SetRangeBase(memory_desc.StartOfMemoryRange);
568-
region.GetRange().SetByteSize(memory_desc.Memory.DataSize);
569-
region.SetReadable(MemoryRegionInfo::eYes);
570-
region.SetMapped(MemoryRegionInfo::eYes);
571-
regions.push_back(region);
563+
} else {
564+
memory32_list = *ExpectedMemory;
572565
}
573-
regions.shrink_to_fit();
574-
return !regions.empty();
575-
}
576566

577-
static bool
578-
CreateRegionsCacheFromMemory64List(MinidumpParser &parser,
579-
std::vector<MemoryRegionInfo> &regions) {
567+
size_t num_regions = memory32_list ? memory32_list->size() : 0;
568+
580569
llvm::ArrayRef<uint8_t> data =
581570
parser.GetStream(StreamType::Memory64List);
582-
if (data.empty())
583-
return false;
571+
584572
llvm::ArrayRef<MinidumpMemoryDescriptor64> memory64_list;
585-
uint64_t base_rva;
586-
std::tie(memory64_list, base_rva) =
587-
MinidumpMemoryDescriptor64::ParseMemory64List(data);
573+
if (!data.empty()) {
574+
uint64_t base_rva;
575+
std::tie(memory64_list, base_rva) =
576+
MinidumpMemoryDescriptor64::ParseMemory64List(data);
588577

589-
if (memory64_list.empty())
590-
return false;
578+
num_regions += memory64_list.size();
579+
}
580+
581+
regions.reserve(num_regions);
582+
if (memory32_list) {
583+
for (const MemoryDescriptor &memory_desc : *memory32_list) {
584+
if (memory_desc.Memory.DataSize == 0)
585+
continue;
586+
MemoryRegionInfo region;
587+
region.GetRange().SetRangeBase(memory_desc.StartOfMemoryRange);
588+
region.GetRange().SetByteSize(memory_desc.Memory.DataSize);
589+
region.SetReadable(MemoryRegionInfo::eYes);
590+
region.SetMapped(MemoryRegionInfo::eYes);
591+
regions.push_back(region);
592+
}
593+
}
591594

592-
regions.reserve(memory64_list.size());
593595
for (const auto &memory_desc : memory64_list) {
594596
if (memory_desc.data_size == 0)
595597
continue;
@@ -620,9 +622,7 @@ std::pair<MemoryRegionInfos, bool> MinidumpParser::BuildMemoryRegions() {
620622
return return_sorted(true);
621623
if (CreateRegionsCacheFromMemoryInfoList(*this, result))
622624
return return_sorted(true);
623-
if (CreateRegionsCacheFromMemoryList(*this, result))
624-
return return_sorted(false);
625-
CreateRegionsCacheFromMemory64List(*this, result);
625+
CreateRegionsCacheFromMemoryList(*this, result);
626626
return return_sorted(false);
627627
}
628628

lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,3 +491,22 @@ def test_minidump_sysroot(self):
491491
spec_dir_norm = os.path.normcase(module.GetFileSpec().GetDirectory())
492492
exe_dir_norm = os.path.normcase(exe_dir)
493493
self.assertEqual(spec_dir_norm, exe_dir_norm)
494+
495+
def test_minidump_memory64list(self):
496+
"""Test that lldb can read from the memory64list in a minidump."""
497+
self.process_from_yaml("linux-x86_64_mem64.yaml")
498+
499+
region_count = 3
500+
region_info_list = self.process.GetMemoryRegions()
501+
self.assertEqual(region_info_list.GetSize(), region_count)
502+
503+
region = lldb.SBMemoryRegionInfo()
504+
self.assertTrue(region_info_list.GetMemoryRegionAtIndex(0, region))
505+
self.assertEqual(region.GetRegionBase(), 0x7FFF12A84030)
506+
self.assertTrue(region.GetRegionEnd(), 0x7FFF12A84030 + 0x2FD0)
507+
self.assertTrue(region_info_list.GetMemoryRegionAtIndex(1, region))
508+
self.assertEqual(region.GetRegionBase(), 0x00007fff12a87000)
509+
self.assertTrue(region.GetRegionEnd(), 0x00007fff12a87000 + 0x00000018)
510+
self.assertTrue(region_info_list.GetMemoryRegionAtIndex(2, region))
511+
self.assertEqual(region.GetRegionBase(), 0x00007fff12a87018)
512+
self.assertTrue(region.GetRegionEnd(), 0x00007fff12a87018 + 0x00000400)
Binary file not shown.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
--- !minidump
2+
Streams:
3+
- Type: SystemInfo
4+
Processor Arch: AMD64
5+
Processor Level: 6
6+
Processor Revision: 15876
7+
Number of Processors: 40
8+
Platform ID: Linux
9+
CSD Version: 'Linux 3.13.0-91-generic'
10+
CPU:
11+
Vendor ID: GenuineIntel
12+
Version Info: 0x00000000
13+
Feature Info: 0x00000000
14+
- Type: LinuxProcStatus
15+
Text: |
16+
Name: linux-x86_64
17+
State: t (tracing stop)
18+
Tgid: 29917
19+
Ngid: 0
20+
Pid: 29917
21+
PPid: 29370
22+
TracerPid: 29918
23+
Uid: 1001 1001 1001 1001
24+
Gid: 1001 1001 1001 1001
25+
- Type: ThreadList
26+
Threads:
27+
- Thread Id: 0x2896BB
28+
Context: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700100000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B040A812FF7F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050D0A75BBA7F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
29+
Stack:
30+
Start of Memory Range: 0x0
31+
Content: ''
32+
- Type: Memory64List
33+
Memory Ranges:
34+
- Start of memory range: 0x7FFF12A84030
35+
Data Size: 0x2FD0
36+
- Start of memory range: 0x00007fff12a87000
37+
Data Size: 0x00000018
38+
- Start of memory range: 0x00007fff12a87018
39+
Data Size: 0x00000400
40+
...

0 commit comments

Comments
 (0)