[Lldb-commits] [lldb] r356992 - Minidump: Use minidump types defined in llvm
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Tue Mar 26 06:23:02 PDT 2019
Author: labath
Date: Tue Mar 26 06:23:01 2019
New Revision: 356992
URL: http://llvm.org/viewvc/llvm-project?rev=356992&view=rev
Log:
Minidump: Use minidump types defined in llvm
This is the next step in moving the minidump parsing into llvm. I remove
the minidump structures already defined in the llvm Object library and
convert our parser to use those. NFC.
Modified:
lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp
lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h
lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp
lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h
lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp
Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp Tue Mar 26 06:23:01 2019
@@ -28,19 +28,34 @@ static llvm::Error stringError(llvm::Str
llvm::inconvertibleErrorCode());
}
+const Header *ParseHeader(llvm::ArrayRef<uint8_t> &data) {
+ const Header *header = nullptr;
+ Status error = consumeObject(data, header);
+
+ uint32_t signature = header->Signature;
+ uint32_t version = header->Version & 0x0000ffff;
+ // the high 16 bits of the version field are implementation specific
+
+ if (error.Fail() || signature != Header::MagicSignature ||
+ version != Header::MagicVersion)
+ return nullptr;
+
+ return header;
+}
+
llvm::Expected<MinidumpParser>
MinidumpParser::Create(const lldb::DataBufferSP &data_sp) {
- if (data_sp->GetByteSize() < sizeof(MinidumpHeader))
+ if (data_sp->GetByteSize() < sizeof(Header))
return stringError("Buffer too small.");
llvm::ArrayRef<uint8_t> header_data(data_sp->GetBytes(),
- sizeof(MinidumpHeader));
- const MinidumpHeader *header = MinidumpHeader::Parse(header_data);
+ sizeof(Header));
+ const Header *header = ParseHeader(header_data);
if (!header)
return stringError("invalid minidump: can't parse the header");
// A minidump without at least one stream is clearly ill-formed
- if (header->streams_count == 0)
+ if (header->NumberOfStreams == 0)
return stringError("invalid minidump: no streams present");
struct FileRange {
@@ -58,42 +73,42 @@ MinidumpParser::Create(const lldb::DataB
// - truncation (streams pointing past the end of file)
std::vector<FileRange> minidump_map;
- minidump_map.emplace_back(0, sizeof(MinidumpHeader));
+ minidump_map.emplace_back(0, sizeof(Header));
// Add the directory entries to the file map
- FileRange directory_range(header->stream_directory_rva,
- header->streams_count * sizeof(MinidumpDirectory));
+ FileRange directory_range(header->StreamDirectoryRVA,
+ header->NumberOfStreams * sizeof(Directory));
if (directory_range.end() > file_size)
return stringError("invalid minidump: truncated streams directory");
minidump_map.push_back(directory_range);
- llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> directory_map;
+ llvm::DenseMap<StreamType, LocationDescriptor> directory_map;
// Parse stream directory entries
llvm::ArrayRef<uint8_t> directory_data(
data_sp->GetBytes() + directory_range.offset, directory_range.size);
- for (uint32_t i = 0; i < header->streams_count; ++i) {
- const MinidumpDirectory *directory_entry = nullptr;
+ for (uint32_t i = 0; i < header->NumberOfStreams; ++i) {
+ const Directory *directory_entry = nullptr;
Status error = consumeObject(directory_data, directory_entry);
if (error.Fail())
return error.ToError();
- if (directory_entry->stream_type == 0) {
+ if (directory_entry->Type == StreamType::Unused) {
// Ignore dummy streams (technically ill-formed, but a number of
// existing minidumps seem to contain such streams)
- if (directory_entry->location.data_size == 0)
+ if (directory_entry->Location.DataSize == 0)
continue;
return stringError("invalid minidump: bad stream type");
}
// Update the streams map, checking for duplicate stream types
if (!directory_map
- .insert({directory_entry->stream_type, directory_entry->location})
+ .insert({directory_entry->Type, directory_entry->Location})
.second)
return stringError("invalid minidump: duplicate stream type");
// Ignore the zero-length streams for layout checks
- if (directory_entry->location.data_size != 0) {
- minidump_map.emplace_back(directory_entry->location.rva,
- directory_entry->location.data_size);
+ if (directory_entry->Location.DataSize != 0) {
+ minidump_map.emplace_back(directory_entry->Location.RVA,
+ directory_entry->Location.DataSize);
}
}
@@ -120,7 +135,7 @@ MinidumpParser::Create(const lldb::DataB
MinidumpParser::MinidumpParser(
lldb::DataBufferSP data_sp,
- llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> directory_map)
+ llvm::DenseMap<StreamType, LocationDescriptor> directory_map)
: m_data_sp(std::move(data_sp)), m_directory_map(std::move(directory_map)) {
}
@@ -131,16 +146,16 @@ llvm::ArrayRef<uint8_t> MinidumpParser::
llvm::ArrayRef<uint8_t>
MinidumpParser::GetStream(StreamType stream_type) {
- auto iter = m_directory_map.find(static_cast<uint32_t>(stream_type));
+ auto iter = m_directory_map.find(stream_type);
if (iter == m_directory_map.end())
return {};
// check if there is enough data
- if (iter->second.rva + iter->second.data_size > m_data_sp->GetByteSize())
+ if (iter->second.RVA + iter->second.DataSize > m_data_sp->GetByteSize())
return {};
- return llvm::ArrayRef<uint8_t>(m_data_sp->GetBytes() + iter->second.rva,
- iter->second.data_size);
+ return llvm::ArrayRef<uint8_t>(m_data_sp->GetBytes() + iter->second.RVA,
+ iter->second.DataSize);
}
llvm::Optional<std::string> MinidumpParser::GetMinidumpString(uint32_t rva) {
@@ -153,7 +168,7 @@ llvm::Optional<std::string> MinidumpPars
UUID MinidumpParser::GetModuleUUID(const MinidumpModule *module) {
auto cv_record =
- GetData().slice(module->CV_record.rva, module->CV_record.data_size);
+ GetData().slice(module->CV_record.RVA, module->CV_record.DataSize);
// Read the CV record signature
const llvm::support::ulittle32_t *signature = nullptr;
@@ -219,10 +234,10 @@ llvm::ArrayRef<MinidumpThread> MinidumpP
}
llvm::ArrayRef<uint8_t>
-MinidumpParser::GetThreadContext(const MinidumpLocationDescriptor &location) {
- if (location.rva + location.data_size > GetData().size())
+MinidumpParser::GetThreadContext(const LocationDescriptor &location) {
+ if (location.RVA + location.DataSize > GetData().size())
return {};
- return GetData().slice(location.rva, location.data_size);
+ return GetData().slice(location.RVA, location.DataSize);
}
llvm::ArrayRef<uint8_t>
@@ -261,13 +276,18 @@ MinidumpParser::GetThreadContextWow64(co
// stored in the first slot of the 64-bit TEB (wow64teb.Reserved1[0]).
}
-const MinidumpSystemInfo *MinidumpParser::GetSystemInfo() {
+const SystemInfo *MinidumpParser::GetSystemInfo() {
llvm::ArrayRef<uint8_t> data = GetStream(StreamType::SystemInfo);
if (data.size() == 0)
return nullptr;
+ const SystemInfo *system_info;
- return MinidumpSystemInfo::Parse(data);
+ Status error = consumeObject(data, system_info);
+ if (error.Fail())
+ return nullptr;
+
+ return system_info;
}
ArchSpec MinidumpParser::GetArchitecture() {
@@ -275,7 +295,7 @@ ArchSpec MinidumpParser::GetArchitecture
return m_arch;
// Set the architecture in m_arch
- const MinidumpSystemInfo *system_info = GetSystemInfo();
+ const SystemInfo *system_info = GetSystemInfo();
if (!system_info)
return m_arch;
@@ -286,10 +306,7 @@ ArchSpec MinidumpParser::GetArchitecture
llvm::Triple triple;
triple.setVendor(llvm::Triple::VendorType::UnknownVendor);
- auto arch = static_cast<ProcessorArchitecture>(
- static_cast<uint32_t>(system_info->processor_arch));
-
- switch (arch) {
+ switch (system_info->ProcessorArch) {
case ProcessorArchitecture::X86:
triple.setArch(llvm::Triple::ArchType::x86);
break;
@@ -307,11 +324,8 @@ ArchSpec MinidumpParser::GetArchitecture
break;
}
- auto os =
- static_cast<OSPlatform>(static_cast<uint32_t>(system_info->platform_id));
-
// TODO add all of the OSes that Minidump/breakpad distinguishes?
- switch (os) {
+ switch (system_info->PlatformId) {
case OSPlatform::Win32S:
case OSPlatform::Win32Windows:
case OSPlatform::Win32NT:
@@ -336,7 +350,7 @@ ArchSpec MinidumpParser::GetArchitecture
default: {
triple.setOS(llvm::Triple::OSType::UnknownOS);
std::string csd_version;
- if (auto s = GetMinidumpString(system_info->csd_version_rva))
+ if (auto s = GetMinidumpString(system_info->CSDVersionRVA))
csd_version = *s;
if (csd_version.find("Linux") != std::string::npos)
triple.setOS(llvm::Triple::OSType::Linux);
@@ -457,16 +471,16 @@ MinidumpParser::FindMemoryRange(lldb::ad
return llvm::None;
for (const auto &memory_desc : memory_list) {
- const MinidumpLocationDescriptor &loc_desc = memory_desc.memory;
+ const LocationDescriptor &loc_desc = memory_desc.memory;
const lldb::addr_t range_start = memory_desc.start_of_memory_range;
- const size_t range_size = loc_desc.data_size;
+ const size_t range_size = loc_desc.DataSize;
- if (loc_desc.rva + loc_desc.data_size > GetData().size())
+ if (loc_desc.RVA + loc_desc.DataSize > GetData().size())
return llvm::None;
if (range_start <= addr && addr < range_start + range_size) {
return minidump::Range(range_start,
- GetData().slice(loc_desc.rva, range_size));
+ GetData().slice(loc_desc.RVA, range_size));
}
}
}
@@ -578,11 +592,11 @@ CreateRegionsCacheFromMemoryList(Minidum
return false;
regions.reserve(memory_list.size());
for (const auto &memory_desc : memory_list) {
- if (memory_desc.memory.data_size == 0)
+ if (memory_desc.memory.DataSize == 0)
continue;
MemoryRegionInfo region;
region.GetRange().SetRangeBase(memory_desc.start_of_memory_range);
- region.GetRange().SetByteSize(memory_desc.memory.data_size);
+ region.GetRange().SetByteSize(memory_desc.memory.DataSize);
region.SetReadable(MemoryRegionInfo::eYes);
region.SetMapped(MemoryRegionInfo::eYes);
regions.push_back(region);
@@ -675,10 +689,12 @@ const MemoryRegionInfos &MinidumpParser:
return m_regions;
}
-#define ENUM_TO_CSTR(ST) case (uint32_t)StreamType::ST: return #ST
+#define ENUM_TO_CSTR(ST) \
+ case StreamType::ST: \
+ return #ST
llvm::StringRef
-MinidumpParser::GetStreamTypeAsString(uint32_t stream_type) {
+MinidumpParser::GetStreamTypeAsString(StreamType stream_type) {
switch (stream_type) {
ENUM_TO_CSTR(Unused);
ENUM_TO_CSTR(ThreadList);
@@ -701,6 +717,7 @@ MinidumpParser::GetStreamTypeAsString(ui
ENUM_TO_CSTR(JavascriptData);
ENUM_TO_CSTR(SystemMemoryInfo);
ENUM_TO_CSTR(ProcessVMCounters);
+ ENUM_TO_CSTR(LastReserved);
ENUM_TO_CSTR(BreakpadInfo);
ENUM_TO_CSTR(AssertionInfo);
ENUM_TO_CSTR(LinuxCPUInfo);
Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h Tue Mar 26 06:23:01 2019
@@ -57,14 +57,13 @@ public:
llvm::ArrayRef<MinidumpThread> GetThreads();
- llvm::ArrayRef<uint8_t>
- GetThreadContext(const MinidumpLocationDescriptor &location);
+ llvm::ArrayRef<uint8_t> GetThreadContext(const LocationDescriptor &location);
llvm::ArrayRef<uint8_t> GetThreadContext(const MinidumpThread &td);
llvm::ArrayRef<uint8_t> GetThreadContextWow64(const MinidumpThread &td);
- const MinidumpSystemInfo *GetSystemInfo();
+ const SystemInfo *GetSystemInfo();
ArchSpec GetArchitecture();
@@ -92,23 +91,22 @@ public:
const MemoryRegionInfos &GetMemoryRegions();
- static llvm::StringRef GetStreamTypeAsString(uint32_t stream_type);
+ static llvm::StringRef GetStreamTypeAsString(StreamType stream_type);
- const llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> &
+ const llvm::DenseMap<StreamType, LocationDescriptor> &
GetDirectoryMap() const {
return m_directory_map;
}
private:
- MinidumpParser(
- lldb::DataBufferSP data_sp,
- llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> directory_map);
+ MinidumpParser(lldb::DataBufferSP data_sp,
+ llvm::DenseMap<StreamType, LocationDescriptor> directory_map);
MemoryRegionInfo FindMemoryRegion(lldb::addr_t load_addr) const;
private:
lldb::DataBufferSP m_data_sp;
- llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> m_directory_map;
+ llvm::DenseMap<StreamType, LocationDescriptor> m_directory_map;
ArchSpec m_arch;
MemoryRegionInfos m_regions;
bool m_parsed_regions = false;
Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp Tue Mar 26 06:23:01 2019
@@ -14,21 +14,6 @@
using namespace lldb_private;
using namespace minidump;
-const MinidumpHeader *MinidumpHeader::Parse(llvm::ArrayRef<uint8_t> &data) {
- const MinidumpHeader *header = nullptr;
- Status error = consumeObject(data, header);
-
- uint32_t signature = header->signature;
- uint32_t version = header->version & 0x0000ffff;
- // the high 16 bits of the version field are implementation specific
-
- if (error.Fail() || signature != Header::MagicSignature ||
- version != Header::MagicVersion)
- return nullptr;
-
- return header;
-}
-
// Minidump string
llvm::Optional<std::string>
lldb_private::minidump::parseMinidumpString(llvm::ArrayRef<uint8_t> &data) {
@@ -93,17 +78,6 @@ MinidumpThread::ParseThreadList(llvm::Ar
reinterpret_cast<const MinidumpThread *>(data.data()), *thread_count);
}
-// MinidumpSystemInfo
-const MinidumpSystemInfo *
-MinidumpSystemInfo::Parse(llvm::ArrayRef<uint8_t> &data) {
- const MinidumpSystemInfo *system_info;
- Status error = consumeObject(data, system_info);
- if (error.Fail())
- return nullptr;
-
- return system_info;
-}
-
// MinidumpMiscInfo
const MinidumpMiscInfo *MinidumpMiscInfo::Parse(llvm::ArrayRef<uint8_t> &data) {
const MinidumpMiscInfo *misc_info;
Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h Tue Mar 26 06:23:01 2019
@@ -76,37 +76,10 @@ Status consumeObject(llvm::ArrayRef<uint
llvm::Optional<std::string> parseMinidumpString(llvm::ArrayRef<uint8_t> &data);
// Reference:
-// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680378(v=vs.85).aspx
-struct MinidumpHeader {
- llvm::support::ulittle32_t signature;
- llvm::support::ulittle32_t
- version; // The high 16 bits of version field are implementation specific
- llvm::support::ulittle32_t streams_count;
- llvm::support::ulittle32_t
- stream_directory_rva; // offset of the stream directory
- llvm::support::ulittle32_t checksum;
- llvm::support::ulittle32_t time_date_stamp; // time_t format
- llvm::support::ulittle64_t flags;
-
- static const MinidumpHeader *Parse(llvm::ArrayRef<uint8_t> &data);
-};
-static_assert(sizeof(MinidumpHeader) == 32,
- "sizeof MinidumpHeader is not correct!");
-
-// Reference:
-// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680383.aspx
-struct MinidumpLocationDescriptor {
- llvm::support::ulittle32_t data_size;
- llvm::support::ulittle32_t rva;
-};
-static_assert(sizeof(MinidumpLocationDescriptor) == 8,
- "sizeof MinidumpLocationDescriptor is not correct!");
-
-// Reference:
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680384(v=vs.85).aspx
struct MinidumpMemoryDescriptor {
llvm::support::ulittle64_t start_of_memory_range;
- MinidumpLocationDescriptor memory;
+ LocationDescriptor memory;
static llvm::ArrayRef<MinidumpMemoryDescriptor>
ParseMemoryList(llvm::ArrayRef<uint8_t> &data);
@@ -125,15 +98,6 @@ static_assert(sizeof(MinidumpMemoryDescr
"sizeof MinidumpMemoryDescriptor64 is not correct!");
// Reference:
-// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680365.aspx
-struct MinidumpDirectory {
- llvm::support::ulittle32_t stream_type;
- MinidumpLocationDescriptor location;
-};
-static_assert(sizeof(MinidumpDirectory) == 12,
- "sizeof MinidumpDirectory is not correct!");
-
-// Reference:
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680385(v=vs.85).aspx
struct MinidumpMemoryInfoListHeader {
llvm::support::ulittle32_t size_of_header;
@@ -226,7 +190,7 @@ struct MinidumpThread {
llvm::support::ulittle32_t priority;
llvm::support::ulittle64_t teb;
MinidumpMemoryDescriptor stack;
- MinidumpLocationDescriptor thread_context;
+ LocationDescriptor thread_context;
static const MinidumpThread *Parse(llvm::ArrayRef<uint8_t> &data);
@@ -236,53 +200,6 @@ struct MinidumpThread {
static_assert(sizeof(MinidumpThread) == 48,
"sizeof MinidumpThread is not correct!");
-// Reference:
-// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
-union MinidumpCPUInfo {
- struct {
- llvm::support::ulittle32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */
- llvm::support::ulittle32_t version_information; /* cpuid 1: eax */
- llvm::support::ulittle32_t feature_information; /* cpuid 1: edx */
- llvm::support::ulittle32_t
- amd_extended_cpu_features; /* cpuid 0x80000001, ebx */
- } x86_cpu_info;
- struct {
- llvm::support::ulittle32_t cpuid;
- llvm::support::ulittle32_t elf_hwcaps; /* linux specific, 0 otherwise */
- } arm_cpu_info;
- struct {
- llvm::support::ulittle64_t processor_features[2];
- } other_cpu_info;
-};
-static_assert(sizeof(MinidumpCPUInfo) == 24,
- "sizeof MinidumpCPUInfo is not correct!");
-
-// Reference:
-// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
-struct MinidumpSystemInfo {
- llvm::support::ulittle16_t processor_arch;
- llvm::support::ulittle16_t processor_level;
- llvm::support::ulittle16_t processor_revision;
-
- uint8_t number_of_processors;
- uint8_t product_type;
-
- llvm::support::ulittle32_t major_version;
- llvm::support::ulittle32_t minor_version;
- llvm::support::ulittle32_t build_number;
- llvm::support::ulittle32_t platform_id;
- llvm::support::ulittle32_t csd_version_rva;
-
- llvm::support::ulittle16_t suit_mask;
- llvm::support::ulittle16_t reserved2;
-
- MinidumpCPUInfo cpu;
-
- static const MinidumpSystemInfo *Parse(llvm::ArrayRef<uint8_t> &data);
-};
-static_assert(sizeof(MinidumpSystemInfo) == 56,
- "sizeof MinidumpSystemInfo is not correct!");
-
// TODO misc2, misc3 ?
// Reference:
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx
@@ -343,8 +260,8 @@ struct MinidumpModule {
llvm::support::ulittle32_t time_date_stamp;
llvm::support::ulittle32_t module_name_rva;
MinidumpVSFixedFileInfo version_info;
- MinidumpLocationDescriptor CV_record;
- MinidumpLocationDescriptor misc_record;
+ LocationDescriptor CV_record;
+ LocationDescriptor misc_record;
llvm::support::ulittle32_t reserved0[2];
llvm::support::ulittle32_t reserved1[2];
@@ -378,7 +295,7 @@ struct MinidumpExceptionStream {
llvm::support::ulittle32_t thread_id;
llvm::support::ulittle32_t alignment;
MinidumpException exception_record;
- MinidumpLocationDescriptor thread_context;
+ LocationDescriptor thread_context;
static const MinidumpExceptionStream *Parse(llvm::ArrayRef<uint8_t> &data);
};
Modified: lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp Tue Mar 26 06:23:01 2019
@@ -29,7 +29,7 @@
#include "lldb/Utility/LLDBAssert.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/State.h"
-
+#include "llvm/BinaryFormat/Magic.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Threading.h"
@@ -104,18 +104,14 @@ lldb::ProcessSP ProcessMinidump::CreateI
lldb::ProcessSP process_sp;
// Read enough data for the Minidump header
- constexpr size_t header_size = sizeof(MinidumpHeader);
+ constexpr size_t header_size = sizeof(Header);
auto DataPtr = FileSystem::Instance().CreateDataBuffer(crash_file->GetPath(),
header_size, 0);
if (!DataPtr)
return nullptr;
lldbassert(DataPtr->GetByteSize() == header_size);
-
- // first, only try to parse the header, beacuse we need to be fast
- llvm::ArrayRef<uint8_t> HeaderBytes = DataPtr->GetData();
- const MinidumpHeader *header = MinidumpHeader::Parse(HeaderBytes);
- if (header == nullptr)
+ if (identify_magic(toStringRef(DataPtr->GetData())) != llvm::file_magic::minidump)
return nullptr;
auto AllData =
@@ -301,7 +297,7 @@ void ProcessMinidump::Clear() { Process:
bool ProcessMinidump::UpdateThreadList(ThreadList &old_thread_list,
ThreadList &new_thread_list) {
for (const MinidumpThread& thread : m_thread_list) {
- MinidumpLocationDescriptor context_location = thread.thread_context;
+ LocationDescriptor context_location = thread.thread_context;
// If the minidump contains an exception context, use it
if (m_active_exception != nullptr &&
@@ -666,8 +662,8 @@ public:
s.Printf("RVA SIZE TYPE StreamType\n");
s.Printf("---------- ---------- ---------- --------------------------\n");
for (const auto &pair: minidump.GetDirectoryMap())
- s.Printf("0x%8.8x 0x%8.8x 0x%8.8x %s\n", (uint32_t)pair.second.rva,
- (uint32_t)pair.second.data_size, pair.first,
+ s.Printf("0x%8.8x 0x%8.8x 0x%8.8x %s\n", (uint32_t)pair.second.RVA,
+ (uint32_t)pair.second.DataSize, (unsigned)pair.first,
MinidumpParser::GetStreamTypeAsString(pair.first).data());
s.Printf("\n");
}
@@ -676,7 +672,7 @@ public:
auto bytes = minidump.GetStream(stream_type);
if (!bytes.empty()) {
if (label.empty())
- label = MinidumpParser::GetStreamTypeAsString((uint32_t)stream_type);
+ label = MinidumpParser::GetStreamTypeAsString(stream_type);
s.Printf("%s:\n%s\n\n", label.data(), bytes.data());
}
};
@@ -685,7 +681,7 @@ public:
auto bytes = minidump.GetStream(stream_type);
if (!bytes.empty()) {
if (label.empty())
- label = MinidumpParser::GetStreamTypeAsString((uint32_t)stream_type);
+ label = MinidumpParser::GetStreamTypeAsString(stream_type);
s.Printf("%s:\n", label.data());
DataExtractor data(bytes.data(), bytes.size(), eByteOrderLittle,
process->GetAddressByteSize());
More information about the lldb-commits
mailing list