Skip to content

Commit 49bc821

Browse files
committed
Reset and go with Pavel's plan of a stream section instead of a flag
1 parent d5dfb15 commit 49bc821

File tree

7 files changed

+157
-125
lines changed

7 files changed

+157
-125
lines changed

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

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ Status MinidumpFileBuilder::AddHeaderAndCalculateDirectories() {
5858
// First set the offset on the file, and on the bytes saved
5959
m_saved_data_size = HEADER_SIZE;
6060
// We know we will have at least Misc, SystemInfo, Modules, and ThreadList
61-
// (corresponding memory list for stacks) And an additional memory list for
62-
// non-stacks.
61+
// (corresponding memory list for stacks), an additional memory list for
62+
// non-stacks, and a stream to mark this minidump was generated by LLDB.
6363
lldb_private::Target &target = m_process_sp->GetTarget();
6464
m_expected_directories = 6;
6565
// Check if OS is linux and reserve directory space for all linux specific
@@ -89,8 +89,11 @@ Status MinidumpFileBuilder::AddHeaderAndCalculateDirectories() {
8989
"Failed to fill in header and directory "
9090
"sections. Written / Expected (%" PRIx64 " / %" PRIx64 ")",
9191
new_offset, m_saved_data_size);
92-
9392
return error;
93+
if (error.Fail())
94+
return error;
95+
96+
return AddLLDBGeneratedStream();
9497
}
9598

9699
Status MinidumpFileBuilder::AddDirectory(StreamType type,
@@ -126,6 +129,17 @@ Status MinidumpFileBuilder::AddDirectory(StreamType type,
126129
return error;
127130
}
128131

132+
Status MinidumpFileBuilder::AddLLDBGeneratedStream() {
133+
Status error;
134+
StreamType type = StreamType::LLDBGenerated;
135+
error = AddDirectory(type, sizeof(StreamType));
136+
if (error.Fail())
137+
return error;
138+
139+
error = AddData(&type, sizeof(StreamType));
140+
return error;
141+
}
142+
129143
Status MinidumpFileBuilder::AddSystemInfo() {
130144
Status error;
131145
const llvm::Triple &target_triple =
@@ -918,8 +932,8 @@ Status MinidumpFileBuilder::DumpHeader() const {
918932
0u), // not used in most of the writers
919933
header.TimeDateStamp =
920934
static_cast<llvm::support::ulittle32_t>(std::time(nullptr));
921-
header.Flags = static_cast<llvm::support::ulittle64_t>(
922-
llvm::minidump::Header::LLDB_HEADER_FLAG);
935+
header.Flags =
936+
static_cast<llvm::support::ulittle64_t>(0u); // minidump normal flag
923937

924938
Status error;
925939
size_t bytes_written;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class MinidumpFileBuilder {
120120
void DeleteFile() noexcept;
121121

122122
private:
123+
lldb_private::Status AddLLDBGeneratedStream();
123124
// Add data to the end of the buffer, if the buffer exceeds the flush level,
124125
// trigger a flush.
125126
lldb_private::Status AddData(const void *data, uint64_t size);

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

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
#include <algorithm>
2121
#include <map>
2222
#include <optional>
23-
#include <utility>
2423
#include <vector>
24+
#include <utility>
2525

2626
using namespace lldb_private;
2727
using namespace minidump;
@@ -45,10 +45,6 @@ llvm::ArrayRef<uint8_t> MinidumpParser::GetData() {
4545
m_data_sp->GetByteSize());
4646
}
4747

48-
const llvm::minidump::Header *MinidumpParser::GetHeader() const {
49-
return reinterpret_cast<llvm::minidump::Header *>(m_file.get());
50-
}
51-
5248
llvm::ArrayRef<uint8_t> MinidumpParser::GetStream(StreamType stream_type) {
5349
return m_file->getRawStream(stream_type).value_or(llvm::ArrayRef<uint8_t>());
5450
}
@@ -74,7 +70,8 @@ UUID MinidumpParser::GetModuleUUID(const minidump::Module *module) {
7470
if (GetArchitecture().GetTriple().isOSBinFormatELF()) {
7571
if (pdb70_uuid->Age != 0)
7672
return UUID(pdb70_uuid, sizeof(*pdb70_uuid));
77-
return UUID(&pdb70_uuid->Uuid, sizeof(pdb70_uuid->Uuid));
73+
return UUID(&pdb70_uuid->Uuid,
74+
sizeof(pdb70_uuid->Uuid));
7875
}
7976
return UUID(*pdb70_uuid);
8077
} else if (cv_signature == CvSignature::ElfBuildId)
@@ -456,12 +453,10 @@ MinidumpParser::FindMemoryRange(lldb::addr_t addr) {
456453

457454
if (!GetStream(StreamType::Memory64List).empty()) {
458455
llvm::Error err = llvm::Error::success();
459-
for (const auto &memory_desc : GetMinidumpFile().getMemory64List(err)) {
460-
if (memory_desc.first.StartOfMemoryRange <= addr &&
461-
addr < memory_desc.first.StartOfMemoryRange +
462-
memory_desc.first.DataSize) {
463-
return minidump::Range(memory_desc.first.StartOfMemoryRange,
464-
memory_desc.second);
456+
for (const auto &memory_desc : GetMinidumpFile().getMemory64List(err)) {
457+
if (memory_desc.first.StartOfMemoryRange <= addr
458+
&& addr < memory_desc.first.StartOfMemoryRange + memory_desc.first.DataSize) {
459+
return minidump::Range(memory_desc.first.StartOfMemoryRange, memory_desc.second);
465460
}
466461
}
467462

@@ -495,8 +490,7 @@ llvm::ArrayRef<uint8_t> MinidumpParser::GetMemory(lldb::addr_t addr,
495490
return range->range_ref.slice(offset, overlap);
496491
}
497492

498-
llvm::iterator_range<FallibleMemory64Iterator>
499-
MinidumpParser::GetMemory64Iterator(llvm::Error &err) {
493+
llvm::iterator_range<FallibleMemory64Iterator> MinidumpParser::GetMemory64Iterator(llvm::Error &err) {
500494
llvm::ErrorAsOutParameter ErrAsOutParam(&err);
501495
return m_file->getMemory64List(err);
502496
}
@@ -608,7 +602,8 @@ std::pair<MemoryRegionInfos, bool> MinidumpParser::BuildMemoryRegions() {
608602
case StreamType::ST: \
609603
return #ST
610604

611-
llvm::StringRef MinidumpParser::GetStreamTypeAsString(StreamType stream_type) {
605+
llvm::StringRef
606+
MinidumpParser::GetStreamTypeAsString(StreamType stream_type) {
612607
switch (stream_type) {
613608
ENUM_TO_CSTR(Unused);
614609
ENUM_TO_CSTR(ThreadList);

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ struct Range {
4747
}
4848
};
4949

50-
using FallibleMemory64Iterator =
51-
llvm::object::MinidumpFile::FallibleMemory64Iterator;
50+
using FallibleMemory64Iterator = llvm::object::MinidumpFile::FallibleMemory64Iterator;
5251
using ExceptionStreamsIterator =
5352
llvm::object::MinidumpFile::ExceptionStreamsIterator;
5453

@@ -57,8 +56,6 @@ class MinidumpParser {
5756
static llvm::Expected<MinidumpParser>
5857
Create(const lldb::DataBufferSP &data_buf_sp);
5958

60-
const llvm::minidump::Header *GetHeader() const;
61-
6259
llvm::ArrayRef<uint8_t> GetData();
6360

6461
llvm::ArrayRef<uint8_t> GetStream(StreamType stream_type);
@@ -99,8 +96,7 @@ class MinidumpParser {
9996
/// complete (includes all regions mapped into the process memory).
10097
std::pair<MemoryRegionInfos, bool> BuildMemoryRegions();
10198

102-
llvm::iterator_range<FallibleMemory64Iterator>
103-
GetMemory64Iterator(llvm::Error &err);
99+
llvm::iterator_range<FallibleMemory64Iterator> GetMemory64Iterator(llvm::Error &err);
104100

105101
static llvm::StringRef GetStreamTypeAsString(StreamType stream_type);
106102

0 commit comments

Comments
 (0)