diff options
Diffstat (limited to 'lldb/source/Plugins/Process/minidump/MinidumpParser.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/minidump/MinidumpParser.cpp | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp index 2ccea6839cb..6661e0bba1d 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp @@ -1,11 +1,11 @@ -//===-- MinidumpParser.cpp ---------------------------------------*- C++ -*-===// +//===-- MinidumpParser.cpp -------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // -//===----------------------------------------------------------------------===// +//===--------------------------------------------------------------------===// // Project includes #include "MinidumpParser.h" @@ -65,8 +65,7 @@ MinidumpParser::MinidumpParser( } llvm::ArrayRef<uint8_t> MinidumpParser::GetData() { - return llvm::ArrayRef<uint8_t>(m_data_sp->GetBytes(), - m_data_sp->GetByteSize()); + return m_data_sp->GetData(); } llvm::ArrayRef<uint8_t> @@ -76,15 +75,14 @@ MinidumpParser::GetStream(MinidumpStreamType stream_type) { 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.data_size > GetData().size()) return {}; - return llvm::ArrayRef<uint8_t>(m_data_sp->GetBytes() + iter->second.rva, - iter->second.data_size); + return GetData().slice(iter->second.rva, iter->second.data_size); } llvm::Optional<std::string> MinidumpParser::GetMinidumpString(uint32_t rva) { - auto arr_ref = m_data_sp->GetData(); + auto arr_ref = GetData(); if (rva > arr_ref.size()) return llvm::None; arr_ref = arr_ref.drop_front(rva); @@ -100,6 +98,14 @@ llvm::ArrayRef<MinidumpThread> MinidumpParser::GetThreads() { return MinidumpThread::ParseThreadList(data); } +llvm::ArrayRef<uint8_t> +MinidumpParser::GetThreadContext(const MinidumpThread &td) { + if (td.thread_context.rva + td.thread_context.data_size > GetData().size()) + return llvm::None; + + return GetData().slice(td.thread_context.rva, td.thread_context.data_size); +} + const MinidumpSystemInfo *MinidumpParser::GetSystemInfo() { llvm::ArrayRef<uint8_t> data = GetStream(MinidumpStreamType::SystemInfo); @@ -224,3 +230,33 @@ const MinidumpExceptionStream *MinidumpParser::GetExceptionStream() { return MinidumpExceptionStream::Parse(data); } + +llvm::Optional<Range> MinidumpParser::FindMemoryRange(lldb::addr_t addr) { + llvm::ArrayRef<uint8_t> data = GetStream(MinidumpStreamType::MemoryList); + + if (data.size() == 0) + return llvm::None; + + llvm::ArrayRef<MinidumpMemoryDescriptor> memory_list = + MinidumpMemoryDescriptor::ParseMemoryList(data); + + if (memory_list.size() == 0) + return llvm::None; + + for (auto memory_desc : memory_list) { + const MinidumpLocationDescriptor &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; + + if (loc_desc.rva + loc_desc.data_size > GetData().size()) + return llvm::None; + + if (range_start <= addr && addr < range_start + range_size) { + return Range(range_start, GetData().slice(loc_desc.rva, range_size)); + } + } + + // TODO parse Memory64List which is present in full-memory Minidumps + + return llvm::None; +} |