Author: labath Date: Fri May 10 02:36:11 2019 New Revision: 360412 URL: http://llvm.org/viewvc/llvm-project?rev=360412&view=rev Log: Minidump: use ThreadList parsing code from llvm/Object
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 lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.h lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.cpp lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.h lldb/trunk/unittests/Process/minidump/MinidumpParserTest.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=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp (original) +++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp Fri May 10 02:36:11 2019 @@ -89,13 +89,15 @@ UUID MinidumpParser::GetModuleUUID(const return UUID(); } -llvm::ArrayRef<MinidumpThread> MinidumpParser::GetThreads() { - llvm::ArrayRef<uint8_t> data = GetStream(StreamType::ThreadList); - - if (data.size() == 0) - return llvm::None; - - return MinidumpThread::ParseThreadList(data); +llvm::ArrayRef<minidump::Thread> MinidumpParser::GetThreads() { + auto ExpectedThreads = GetMinidumpFile().getThreadList(); + if (ExpectedThreads) + return *ExpectedThreads; + + LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_THREAD), + ExpectedThreads.takeError(), + "Failed to read thread list: {0}"); + return {}; } llvm::ArrayRef<uint8_t> @@ -106,19 +108,19 @@ MinidumpParser::GetThreadContext(const L } llvm::ArrayRef<uint8_t> -MinidumpParser::GetThreadContext(const MinidumpThread &td) { - return GetThreadContext(td.thread_context); +MinidumpParser::GetThreadContext(const minidump::Thread &td) { + return GetThreadContext(td.Context); } llvm::ArrayRef<uint8_t> -MinidumpParser::GetThreadContextWow64(const MinidumpThread &td) { +MinidumpParser::GetThreadContextWow64(const minidump::Thread &td) { // On Windows, a 32-bit process can run on a 64-bit machine under WOW64. If // the minidump was captured with a 64-bit debugger, then the CONTEXT we just // grabbed from the mini_dump_thread is the one for the 64-bit "native" // process rather than the 32-bit "guest" process we care about. In this // case, we can get the 32-bit CONTEXT from the TEB (Thread Environment // Block) of the 64-bit process. - auto teb_mem = GetMemory(td.teb, sizeof(TEB64)); + auto teb_mem = GetMemory(td.EnvironmentBlock, sizeof(TEB64)); if (teb_mem.empty()) return {}; @@ -329,15 +331,14 @@ MinidumpParser::FindMemoryRange(lldb::ad return llvm::None; if (!data.empty()) { - llvm::ArrayRef<MinidumpMemoryDescriptor> memory_list = - MinidumpMemoryDescriptor::ParseMemoryList(data); + llvm::ArrayRef<MemoryDescriptor> memory_list = ParseMemoryList(data); if (memory_list.empty()) return llvm::None; for (const auto &memory_desc : memory_list) { - const LocationDescriptor &loc_desc = memory_desc.memory; - const lldb::addr_t range_start = memory_desc.start_of_memory_range; + const LocationDescriptor &loc_desc = memory_desc.Memory; + const lldb::addr_t range_start = memory_desc.StartOfMemoryRange; const size_t range_size = loc_desc.DataSize; if (loc_desc.RVA + loc_desc.DataSize > GetData().size()) @@ -452,16 +453,16 @@ CreateRegionsCacheFromMemoryList(Minidum auto data = parser.GetStream(StreamType::MemoryList); if (data.empty()) return false; - auto memory_list = MinidumpMemoryDescriptor::ParseMemoryList(data); + auto memory_list = ParseMemoryList(data); if (memory_list.empty()) return false; regions.reserve(memory_list.size()); for (const auto &memory_desc : memory_list) { - if (memory_desc.memory.DataSize == 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.DataSize); + region.GetRange().SetRangeBase(memory_desc.StartOfMemoryRange); + region.GetRange().SetByteSize(memory_desc.Memory.DataSize); region.SetReadable(MemoryRegionInfo::eYes); region.SetMapped(MemoryRegionInfo::eYes); regions.push_back(region); 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=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h (original) +++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h Fri May 10 02:36:11 2019 @@ -54,13 +54,13 @@ public: UUID GetModuleUUID(const minidump::Module *module); - llvm::ArrayRef<MinidumpThread> GetThreads(); + llvm::ArrayRef<minidump::Thread> GetThreads(); llvm::ArrayRef<uint8_t> GetThreadContext(const LocationDescriptor &location); - llvm::ArrayRef<uint8_t> GetThreadContext(const MinidumpThread &td); + llvm::ArrayRef<uint8_t> GetThreadContext(const minidump::Thread &td); - llvm::ArrayRef<uint8_t> GetThreadContextWow64(const MinidumpThread &td); + llvm::ArrayRef<uint8_t> GetThreadContextWow64(const minidump::Thread &td); ArchSpec GetArchitecture(); 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=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp (original) +++ lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp Fri May 10 02:36:11 2019 @@ -14,33 +14,6 @@ using namespace lldb_private; using namespace minidump; -// MinidumpThread -const MinidumpThread *MinidumpThread::Parse(llvm::ArrayRef<uint8_t> &data) { - const MinidumpThread *thread = nullptr; - Status error = consumeObject(data, thread); - if (error.Fail()) - return nullptr; - - return thread; -} - -llvm::ArrayRef<MinidumpThread> -MinidumpThread::ParseThreadList(llvm::ArrayRef<uint8_t> &data) { - const auto orig_size = data.size(); - const llvm::support::ulittle32_t *thread_count; - Status error = consumeObject(data, thread_count); - if (error.Fail() || *thread_count * sizeof(MinidumpThread) > data.size()) - return {}; - - // Compilers might end up padding an extra 4 bytes depending on how the - // structure is padded by the compiler and the #pragma pack settings. - if (4 + *thread_count * sizeof(MinidumpThread) < orig_size) - data = data.drop_front(4); - - return llvm::ArrayRef<MinidumpThread>( - reinterpret_cast<const MinidumpThread *>(data.data()), *thread_count); -} - // MinidumpMiscInfo const MinidumpMiscInfo *MinidumpMiscInfo::Parse(llvm::ArrayRef<uint8_t> &data) { const MinidumpMiscInfo *misc_info; @@ -95,22 +68,22 @@ MinidumpExceptionStream::Parse(llvm::Arr return exception_stream; } -llvm::ArrayRef<MinidumpMemoryDescriptor> -MinidumpMemoryDescriptor::ParseMemoryList(llvm::ArrayRef<uint8_t> &data) { +llvm::ArrayRef<MemoryDescriptor> +minidump::ParseMemoryList(llvm::ArrayRef<uint8_t> &data) { const auto orig_size = data.size(); const llvm::support::ulittle32_t *mem_ranges_count; Status error = consumeObject(data, mem_ranges_count); if (error.Fail() || - *mem_ranges_count * sizeof(MinidumpMemoryDescriptor) > data.size()) + *mem_ranges_count * sizeof(MemoryDescriptor) > data.size()) return {}; // Compilers might end up padding an extra 4 bytes depending on how the // structure is padded by the compiler and the #pragma pack settings. - if (4 + *mem_ranges_count * sizeof(MinidumpMemoryDescriptor) < orig_size) + if (4 + *mem_ranges_count * sizeof(MemoryDescriptor) < orig_size) data = data.drop_front(4); return llvm::makeArrayRef( - reinterpret_cast<const MinidumpMemoryDescriptor *>(data.data()), + reinterpret_cast<const MemoryDescriptor *>(data.data()), *mem_ranges_count); } 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=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h (original) +++ lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h Fri May 10 02:36:11 2019 @@ -75,17 +75,7 @@ Status consumeObject(llvm::ArrayRef<uint return error; } -// 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; - LocationDescriptor memory; - - static llvm::ArrayRef<MinidumpMemoryDescriptor> - ParseMemoryList(llvm::ArrayRef<uint8_t> &data); -}; -static_assert(sizeof(MinidumpMemoryDescriptor) == 16, - "sizeof MinidumpMemoryDescriptor is not correct!"); +llvm::ArrayRef<MemoryDescriptor> ParseMemoryList(llvm::ArrayRef<uint8_t> &data); struct MinidumpMemoryDescriptor64 { llvm::support::ulittle64_t start_of_memory_range; @@ -181,25 +171,6 @@ struct MinidumpMemoryInfo { static_assert(sizeof(MinidumpMemoryInfo) == 48, "sizeof MinidumpMemoryInfo is not correct!"); -// Reference: -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680517(v=vs.85).aspx -struct MinidumpThread { - llvm::support::ulittle32_t thread_id; - llvm::support::ulittle32_t suspend_count; - llvm::support::ulittle32_t priority_class; - llvm::support::ulittle32_t priority; - llvm::support::ulittle64_t teb; - MinidumpMemoryDescriptor stack; - LocationDescriptor thread_context; - - static const MinidumpThread *Parse(llvm::ArrayRef<uint8_t> &data); - - static llvm::ArrayRef<MinidumpThread> - ParseThreadList(llvm::ArrayRef<uint8_t> &data); -}; -static_assert(sizeof(MinidumpThread) == 48, - "sizeof MinidumpThread is not correct!"); - // TODO misc2, misc3 ? // Reference: // https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx 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=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp (original) +++ lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp Fri May 10 02:36:11 2019 @@ -326,12 +326,12 @@ void ProcessMinidump::Clear() { Process: bool ProcessMinidump::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list) { - for (const MinidumpThread& thread : m_thread_list) { - LocationDescriptor context_location = thread.thread_context; + for (const minidump::Thread &thread : m_thread_list) { + LocationDescriptor context_location = thread.Context; // If the minidump contains an exception context, use it if (m_active_exception != nullptr && - m_active_exception->thread_id == thread.thread_id) { + m_active_exception->thread_id == thread.ThreadId) { context_location = m_active_exception->thread_context; } Modified: lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.h?rev=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.h (original) +++ lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.h Fri May 10 02:36:11 2019 @@ -107,7 +107,7 @@ protected: private: FileSpec m_core_file; lldb::DataBufferSP m_core_data; - llvm::ArrayRef<MinidumpThread> m_thread_list; + llvm::ArrayRef<minidump::Thread> m_thread_list; const MinidumpExceptionStream *m_active_exception; lldb::CommandObjectSP m_command_sp; bool m_is_wow64; Modified: lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.cpp?rev=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.cpp (original) +++ lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.cpp Fri May 10 02:36:11 2019 @@ -33,9 +33,9 @@ using namespace lldb; using namespace lldb_private; using namespace minidump; -ThreadMinidump::ThreadMinidump(Process &process, const MinidumpThread &td, +ThreadMinidump::ThreadMinidump(Process &process, const minidump::Thread &td, llvm::ArrayRef<uint8_t> gpregset_data) - : Thread(process, td.thread_id), m_thread_reg_ctx_sp(), + : Thread(process, td.ThreadId), m_thread_reg_ctx_sp(), m_gpregset_data(gpregset_data) {} ThreadMinidump::~ThreadMinidump() {} Modified: lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.h?rev=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.h (original) +++ lldb/trunk/source/Plugins/Process/minidump/ThreadMinidump.h Fri May 10 02:36:11 2019 @@ -20,7 +20,7 @@ namespace minidump { class ThreadMinidump : public Thread { public: - ThreadMinidump(Process &process, const MinidumpThread &td, + ThreadMinidump(Process &process, const minidump::Thread &td, llvm::ArrayRef<uint8_t> gpregset_data); ~ThreadMinidump() override; Modified: lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp?rev=360412&r1=360411&r2=360412&view=diff ============================================================================== --- lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp (original) +++ lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp Fri May 10 02:36:11 2019 @@ -91,14 +91,14 @@ Streams: TEST_F(MinidumpParserTest, GetThreadsAndGetThreadContext) { SetUpData("linux-x86_64.dmp"); - llvm::ArrayRef<MinidumpThread> thread_list; + llvm::ArrayRef<minidump::Thread> thread_list; thread_list = parser->GetThreads(); ASSERT_EQ(1UL, thread_list.size()); - const MinidumpThread thread = thread_list[0]; + const minidump::Thread &thread = thread_list[0]; - EXPECT_EQ(16001UL, thread.thread_id); + EXPECT_EQ(16001UL, thread.ThreadId); llvm::ArrayRef<uint8_t> context = parser->GetThreadContext(thread); EXPECT_EQ(1232UL, context.size()); @@ -108,12 +108,12 @@ TEST_F(MinidumpParserTest, GetThreadList // Verify that we can load a thread list that doesn't have 4 bytes of padding // after the thread count. SetUpData("thread-list-not-padded.dmp"); - llvm::ArrayRef<MinidumpThread> thread_list; + llvm::ArrayRef<minidump::Thread> thread_list; thread_list = parser->GetThreads(); ASSERT_EQ(2UL, thread_list.size()); - EXPECT_EQ(0x11223344UL, thread_list[0].thread_id); - EXPECT_EQ(0x55667788UL, thread_list[1].thread_id); + EXPECT_EQ(0x11223344UL, thread_list[0].ThreadId); + EXPECT_EQ(0x55667788UL, thread_list[1].ThreadId); } TEST_F(MinidumpParserTest, GetThreadListPadded) { @@ -122,8 +122,8 @@ TEST_F(MinidumpParserTest, GetThreadList SetUpData("thread-list-padded.dmp"); auto thread_list = parser->GetThreads(); ASSERT_EQ(2UL, thread_list.size()); - EXPECT_EQ(0x11223344UL, thread_list[0].thread_id); - EXPECT_EQ(0x55667788UL, thread_list[1].thread_id); + EXPECT_EQ(0x11223344UL, thread_list[0].ThreadId); + EXPECT_EQ(0x55667788UL, thread_list[1].ThreadId); } TEST_F(MinidumpParserTest, GetMemoryListNotPadded) { @@ -460,8 +460,8 @@ TEST_F(MinidumpParserTest, GetPidWow64) TEST_F(MinidumpParserTest, GetThreadContext_x86_32) { SetUpData("linux-i386.dmp"); - llvm::ArrayRef<MinidumpThread> thread_list = parser->GetThreads(); - const MinidumpThread thread = thread_list[0]; + llvm::ArrayRef<minidump::Thread> thread_list = parser->GetThreads(); + const minidump::Thread &thread = thread_list[0]; llvm::ArrayRef<uint8_t> registers(parser->GetThreadContext(thread)); const MinidumpContext_x86_32 *context; EXPECT_TRUE(consumeObject(registers, context).Success()); @@ -491,8 +491,8 @@ TEST_F(MinidumpParserTest, GetThreadCont TEST_F(MinidumpParserTest, GetThreadContext_x86_64) { SetUpData("linux-x86_64.dmp"); - llvm::ArrayRef<MinidumpThread> thread_list = parser->GetThreads(); - const MinidumpThread thread = thread_list[0]; + llvm::ArrayRef<minidump::Thread> thread_list = parser->GetThreads(); + const minidump::Thread &thread = thread_list[0]; llvm::ArrayRef<uint8_t> registers(parser->GetThreadContext(thread)); const MinidumpContext_x86_64 *context; EXPECT_TRUE(consumeObject(registers, context).Success()); @@ -526,8 +526,8 @@ TEST_F(MinidumpParserTest, GetThreadCont TEST_F(MinidumpParserTest, GetThreadContext_x86_32_wow64) { SetUpData("fizzbuzz_wow64.dmp"); - llvm::ArrayRef<MinidumpThread> thread_list = parser->GetThreads(); - const MinidumpThread thread = thread_list[0]; + llvm::ArrayRef<minidump::Thread> thread_list = parser->GetThreads(); + const minidump::Thread &thread = thread_list[0]; llvm::ArrayRef<uint8_t> registers(parser->GetThreadContextWow64(thread)); const MinidumpContext_x86_32 *context; EXPECT_TRUE(consumeObject(registers, context).Success()); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits