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()); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits