Skip to content

Commit e5edc85

Browse files
committed
Create new API for expected so we can return better error messages that explain why the memory can't be materialized
1 parent e685e4a commit e5edc85

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -480,9 +480,22 @@ void MinidumpParser::PopulateMemoryRanges() {
480480

481481
llvm::ArrayRef<uint8_t> MinidumpParser::GetMemory(lldb::addr_t addr,
482482
size_t size) {
483+
llvm::Expected<llvm::ArrayRef<uint8_t>> expected_memory = GetExpectedMemory(addr, size);
484+
if (!expected_memory) {
485+
llvm::consumeError(expected_memory.takeError());
486+
return {};
487+
}
488+
489+
return *expected_memory;
490+
}
491+
492+
llvm::Expected<llvm::ArrayRef<uint8_t>> MinidumpParser::GetExpectedMemory(lldb::addr_t addr,
493+
size_t size) {
483494
std::optional<minidump::Range> range = FindMemoryRange(addr);
484495
if (!range)
485-
return {};
496+
return llvm::createStringError(llvm::inconvertibleErrorCode(),
497+
"No memory range found for address {0x%" PRIx64 "}",
498+
addr);
486499

487500
// There's at least some overlap between the beginning of the desired range
488501
// (addr) and the current range. Figure out where the overlap begins and
@@ -491,7 +504,8 @@ llvm::ArrayRef<uint8_t> MinidumpParser::GetMemory(lldb::addr_t addr,
491504
const size_t offset = addr - range->start;
492505

493506
if (addr < range->start || offset >= range->range_ref.size())
494-
return {};
507+
return llvm::createStringError(llvm::inconvertibleErrorCode(),
508+
"Address {0x%" PRIx64 "} is not in range [{0x%" PRIx64 " - 0x%" PRIx64 "}]", addr, range->start, range->start + range->range_ref.size());
495509

496510
const size_t overlap = std::min(size, range->range_ref.size() - offset);
497511
return range->range_ref.slice(offset, overlap);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class MinidumpParser {
105105
std::optional<Range> FindMemoryRange(lldb::addr_t addr);
106106

107107
llvm::ArrayRef<uint8_t> GetMemory(lldb::addr_t addr, size_t size);
108+
llvm::Expected<llvm::ArrayRef<uint8_t>> GetExpectedMemory(lldb::addr_t addr, size_t size);
108109

109110
/// Returns a list of memory regions and a flag indicating whether the list is
110111
/// complete (includes all regions mapped into the process memory).

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,12 +322,14 @@ size_t ProcessMinidump::ReadMemory(lldb::addr_t addr, void *buf, size_t size,
322322
size_t ProcessMinidump::DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
323323
Status &error) {
324324

325-
llvm::ArrayRef<uint8_t> mem = m_minidump_parser->GetMemory(addr, size);
326-
if (mem.empty()) {
327-
error = Status::FromErrorString("could not parse memory info");
325+
llvm::Expected<llvm::ArrayRef<uint8_t>> mem_maybe = m_minidump_parser->GetExpectedMemory(addr, size);
326+
if (!mem_maybe) {
327+
error = Status::FromError(mem_maybe.takeError());
328328
return 0;
329329
}
330330

331+
llvm::ArrayRef<uint8_t> mem = *mem_maybe;
332+
331333
std::memcpy(buf, mem.data(), mem.size());
332334
return mem.size();
333335
}

0 commit comments

Comments
 (0)