@@ -429,7 +429,6 @@ const minidump::ExceptionStream *MinidumpParser::GetExceptionStream() {
429
429
430
430
std::optional<minidump::Range>
431
431
MinidumpParser::FindMemoryRange (lldb::addr_t addr) {
432
- llvm::ArrayRef<uint8_t > data64 = GetStream (StreamType::Memory64List);
433
432
Log *log = GetLog (LLDBLog::Modules);
434
433
435
434
auto ExpectedMemory = GetMinidumpFile ().getMemoryList ();
@@ -457,33 +456,17 @@ MinidumpParser::FindMemoryRange(lldb::addr_t addr) {
457
456
}
458
457
}
459
458
460
- // Some Minidumps have a Memory64ListStream that captures all the heap memory
461
- // (full-memory Minidumps). We can't exactly use the same loop as above,
462
- // because the Minidump uses slightly different data structures to describe
463
- // those
464
-
465
- if (!data64.empty ()) {
466
- llvm::ArrayRef<MinidumpMemoryDescriptor64> memory64_list;
467
- uint64_t base_rva;
468
- std::tie (memory64_list, base_rva) =
469
- MinidumpMemoryDescriptor64::ParseMemory64List (data64);
470
-
471
- if (memory64_list.empty ())
472
- return std::nullopt;
473
-
474
- for (const auto &memory_desc64 : memory64_list) {
475
- const lldb::addr_t range_start = memory_desc64.start_of_memory_range ;
476
- const size_t range_size = memory_desc64.data_size ;
477
-
478
- if (base_rva + range_size > GetData ().size ())
479
- return std::nullopt;
480
-
481
- if (range_start <= addr && addr < range_start + range_size) {
482
- return minidump::Range (range_start,
483
- GetData ().slice (base_rva, range_size));
459
+ if (!GetStream (StreamType::Memory64List).empty ()) {
460
+ llvm::Error err = llvm::Error::success ();
461
+ for (const auto &memory_desc : GetMinidumpFile ().getMemory64List (err)) {
462
+ if (memory_desc.first .StartOfMemoryRange <= addr
463
+ && addr < memory_desc.first .StartOfMemoryRange + memory_desc.first .DataSize ) {
464
+ return minidump::Range (memory_desc.first .StartOfMemoryRange , memory_desc.second );
484
465
}
485
- base_rva += range_size;
486
466
}
467
+
468
+ if (err)
469
+ LLDB_LOG_ERROR (log, std::move (err), " Failed to read memory64 list: {0}" );
487
470
}
488
471
489
472
return std::nullopt;
@@ -512,6 +495,11 @@ llvm::ArrayRef<uint8_t> MinidumpParser::GetMemory(lldb::addr_t addr,
512
495
return range->range_ref .slice (offset, overlap);
513
496
}
514
497
498
+ llvm::iterator_range<FallibleMemory64Iterator> MinidumpParser::GetMemory64Iterator (llvm::Error &err) {
499
+ llvm::ErrorAsOutParameter ErrAsOutParam (&err);
500
+ return m_file->getMemory64List (err);
501
+ }
502
+
515
503
static bool
516
504
CreateRegionsCacheFromMemoryInfoList (MinidumpParser &parser,
517
505
std::vector<MemoryRegionInfo> ®ions) {
@@ -553,53 +541,44 @@ static bool
553
541
CreateRegionsCacheFromMemoryList (MinidumpParser &parser,
554
542
std::vector<MemoryRegionInfo> ®ions) {
555
543
Log *log = GetLog (LLDBLog::Modules);
544
+ // Cache the expected memory32 into an optional
545
+ // because it is possible to just have a memory64 list
556
546
auto ExpectedMemory = parser.GetMinidumpFile ().getMemoryList ();
557
547
if (!ExpectedMemory) {
558
548
LLDB_LOG_ERROR (log, ExpectedMemory.takeError (),
559
549
" 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);
550
+ } else {
551
+ for (const MemoryDescriptor &memory_desc : *ExpectedMemory) {
552
+ if (memory_desc.Memory .DataSize == 0 )
553
+ continue ;
554
+ MemoryRegionInfo region;
555
+ region.GetRange ().SetRangeBase (memory_desc.StartOfMemoryRange );
556
+ region.GetRange ().SetByteSize (memory_desc.Memory .DataSize );
557
+ region.SetReadable (MemoryRegionInfo::eYes);
558
+ region.SetMapped (MemoryRegionInfo::eYes);
559
+ regions.push_back (region);
560
+ }
572
561
}
573
- regions.shrink_to_fit ();
574
- return !regions.empty ();
575
- }
576
-
577
- static bool
578
- CreateRegionsCacheFromMemory64List (MinidumpParser &parser,
579
- std::vector<MemoryRegionInfo> ®ions) {
580
- llvm::ArrayRef<uint8_t > data =
581
- parser.GetStream (StreamType::Memory64List);
582
- if (data.empty ())
583
- return false ;
584
- llvm::ArrayRef<MinidumpMemoryDescriptor64> memory64_list;
585
- uint64_t base_rva;
586
- std::tie (memory64_list, base_rva) =
587
- MinidumpMemoryDescriptor64::ParseMemory64List (data);
588
562
589
- if (memory64_list.empty ())
590
- return false ;
563
+ if (!parser.GetStream (StreamType::Memory64List).empty ()) {
564
+ llvm::Error err = llvm::Error::success ();
565
+ for (const auto &memory_desc : parser.GetMemory64Iterator (err)) {
566
+ if (memory_desc.first .DataSize == 0 )
567
+ continue ;
568
+ MemoryRegionInfo region;
569
+ region.GetRange ().SetRangeBase (memory_desc.first .StartOfMemoryRange );
570
+ region.GetRange ().SetByteSize (memory_desc.first .DataSize );
571
+ region.SetReadable (MemoryRegionInfo::eYes);
572
+ region.SetMapped (MemoryRegionInfo::eYes);
573
+ regions.push_back (region);
574
+ }
591
575
592
- regions.reserve (memory64_list.size ());
593
- for (const auto &memory_desc : memory64_list) {
594
- if (memory_desc.data_size == 0 )
595
- continue ;
596
- MemoryRegionInfo region;
597
- region.GetRange ().SetRangeBase (memory_desc.start_of_memory_range );
598
- region.GetRange ().SetByteSize (memory_desc.data_size );
599
- region.SetReadable (MemoryRegionInfo::eYes);
600
- region.SetMapped (MemoryRegionInfo::eYes);
601
- regions.push_back (region);
576
+ if (err) {
577
+ LLDB_LOG_ERROR (log, std::move (err), " Failed to read memory64 list: {0}" );
578
+ return false ;
579
+ }
602
580
}
581
+
603
582
regions.shrink_to_fit ();
604
583
return !regions.empty ();
605
584
}
@@ -620,9 +599,7 @@ std::pair<MemoryRegionInfos, bool> MinidumpParser::BuildMemoryRegions() {
620
599
return return_sorted (true );
621
600
if (CreateRegionsCacheFromMemoryInfoList (*this , result))
622
601
return return_sorted (true );
623
- if (CreateRegionsCacheFromMemoryList (*this , result))
624
- return return_sorted (false );
625
- CreateRegionsCacheFromMemory64List (*this , result);
602
+ CreateRegionsCacheFromMemoryList (*this , result);
626
603
return return_sorted (false );
627
604
}
628
605
0 commit comments