Skip to content

Commit 6d40c29

Browse files
committed
Minidump: use ThreadList parsing code from llvm/Object
llvm-svn: 360412
1 parent 4dea137 commit 6d40c29

File tree

9 files changed

+50
-105
lines changed

9 files changed

+50
-105
lines changed

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

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,15 @@ UUID MinidumpParser::GetModuleUUID(const minidump::Module *module) {
8989
return UUID();
9090
}
9191

92-
llvm::ArrayRef<MinidumpThread> MinidumpParser::GetThreads() {
93-
llvm::ArrayRef<uint8_t> data = GetStream(StreamType::ThreadList);
94-
95-
if (data.size() == 0)
96-
return llvm::None;
97-
98-
return MinidumpThread::ParseThreadList(data);
92+
llvm::ArrayRef<minidump::Thread> MinidumpParser::GetThreads() {
93+
auto ExpectedThreads = GetMinidumpFile().getThreadList();
94+
if (ExpectedThreads)
95+
return *ExpectedThreads;
96+
97+
LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_THREAD),
98+
ExpectedThreads.takeError(),
99+
"Failed to read thread list: {0}");
100+
return {};
99101
}
100102

101103
llvm::ArrayRef<uint8_t>
@@ -106,19 +108,19 @@ MinidumpParser::GetThreadContext(const LocationDescriptor &location) {
106108
}
107109

108110
llvm::ArrayRef<uint8_t>
109-
MinidumpParser::GetThreadContext(const MinidumpThread &td) {
110-
return GetThreadContext(td.thread_context);
111+
MinidumpParser::GetThreadContext(const minidump::Thread &td) {
112+
return GetThreadContext(td.Context);
111113
}
112114

113115
llvm::ArrayRef<uint8_t>
114-
MinidumpParser::GetThreadContextWow64(const MinidumpThread &td) {
116+
MinidumpParser::GetThreadContextWow64(const minidump::Thread &td) {
115117
// On Windows, a 32-bit process can run on a 64-bit machine under WOW64. If
116118
// the minidump was captured with a 64-bit debugger, then the CONTEXT we just
117119
// grabbed from the mini_dump_thread is the one for the 64-bit "native"
118120
// process rather than the 32-bit "guest" process we care about. In this
119121
// case, we can get the 32-bit CONTEXT from the TEB (Thread Environment
120122
// Block) of the 64-bit process.
121-
auto teb_mem = GetMemory(td.teb, sizeof(TEB64));
123+
auto teb_mem = GetMemory(td.EnvironmentBlock, sizeof(TEB64));
122124
if (teb_mem.empty())
123125
return {};
124126

@@ -329,15 +331,14 @@ MinidumpParser::FindMemoryRange(lldb::addr_t addr) {
329331
return llvm::None;
330332

331333
if (!data.empty()) {
332-
llvm::ArrayRef<MinidumpMemoryDescriptor> memory_list =
333-
MinidumpMemoryDescriptor::ParseMemoryList(data);
334+
llvm::ArrayRef<MemoryDescriptor> memory_list = ParseMemoryList(data);
334335

335336
if (memory_list.empty())
336337
return llvm::None;
337338

338339
for (const auto &memory_desc : memory_list) {
339-
const LocationDescriptor &loc_desc = memory_desc.memory;
340-
const lldb::addr_t range_start = memory_desc.start_of_memory_range;
340+
const LocationDescriptor &loc_desc = memory_desc.Memory;
341+
const lldb::addr_t range_start = memory_desc.StartOfMemoryRange;
341342
const size_t range_size = loc_desc.DataSize;
342343

343344
if (loc_desc.RVA + loc_desc.DataSize > GetData().size())
@@ -452,16 +453,16 @@ CreateRegionsCacheFromMemoryList(MinidumpParser &parser,
452453
auto data = parser.GetStream(StreamType::MemoryList);
453454
if (data.empty())
454455
return false;
455-
auto memory_list = MinidumpMemoryDescriptor::ParseMemoryList(data);
456+
auto memory_list = ParseMemoryList(data);
456457
if (memory_list.empty())
457458
return false;
458459
regions.reserve(memory_list.size());
459460
for (const auto &memory_desc : memory_list) {
460-
if (memory_desc.memory.DataSize == 0)
461+
if (memory_desc.Memory.DataSize == 0)
461462
continue;
462463
MemoryRegionInfo region;
463-
region.GetRange().SetRangeBase(memory_desc.start_of_memory_range);
464-
region.GetRange().SetByteSize(memory_desc.memory.DataSize);
464+
region.GetRange().SetRangeBase(memory_desc.StartOfMemoryRange);
465+
region.GetRange().SetByteSize(memory_desc.Memory.DataSize);
465466
region.SetReadable(MemoryRegionInfo::eYes);
466467
region.SetMapped(MemoryRegionInfo::eYes);
467468
regions.push_back(region);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ class MinidumpParser {
5454

5555
UUID GetModuleUUID(const minidump::Module *module);
5656

57-
llvm::ArrayRef<MinidumpThread> GetThreads();
57+
llvm::ArrayRef<minidump::Thread> GetThreads();
5858

5959
llvm::ArrayRef<uint8_t> GetThreadContext(const LocationDescriptor &location);
6060

61-
llvm::ArrayRef<uint8_t> GetThreadContext(const MinidumpThread &td);
61+
llvm::ArrayRef<uint8_t> GetThreadContext(const minidump::Thread &td);
6262

63-
llvm::ArrayRef<uint8_t> GetThreadContextWow64(const MinidumpThread &td);
63+
llvm::ArrayRef<uint8_t> GetThreadContextWow64(const minidump::Thread &td);
6464

6565
ArchSpec GetArchitecture();
6666

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

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,33 +14,6 @@
1414
using namespace lldb_private;
1515
using namespace minidump;
1616

17-
// MinidumpThread
18-
const MinidumpThread *MinidumpThread::Parse(llvm::ArrayRef<uint8_t> &data) {
19-
const MinidumpThread *thread = nullptr;
20-
Status error = consumeObject(data, thread);
21-
if (error.Fail())
22-
return nullptr;
23-
24-
return thread;
25-
}
26-
27-
llvm::ArrayRef<MinidumpThread>
28-
MinidumpThread::ParseThreadList(llvm::ArrayRef<uint8_t> &data) {
29-
const auto orig_size = data.size();
30-
const llvm::support::ulittle32_t *thread_count;
31-
Status error = consumeObject(data, thread_count);
32-
if (error.Fail() || *thread_count * sizeof(MinidumpThread) > data.size())
33-
return {};
34-
35-
// Compilers might end up padding an extra 4 bytes depending on how the
36-
// structure is padded by the compiler and the #pragma pack settings.
37-
if (4 + *thread_count * sizeof(MinidumpThread) < orig_size)
38-
data = data.drop_front(4);
39-
40-
return llvm::ArrayRef<MinidumpThread>(
41-
reinterpret_cast<const MinidumpThread *>(data.data()), *thread_count);
42-
}
43-
4417
// MinidumpMiscInfo
4518
const MinidumpMiscInfo *MinidumpMiscInfo::Parse(llvm::ArrayRef<uint8_t> &data) {
4619
const MinidumpMiscInfo *misc_info;
@@ -95,22 +68,22 @@ MinidumpExceptionStream::Parse(llvm::ArrayRef<uint8_t> &data) {
9568
return exception_stream;
9669
}
9770

98-
llvm::ArrayRef<MinidumpMemoryDescriptor>
99-
MinidumpMemoryDescriptor::ParseMemoryList(llvm::ArrayRef<uint8_t> &data) {
71+
llvm::ArrayRef<MemoryDescriptor>
72+
minidump::ParseMemoryList(llvm::ArrayRef<uint8_t> &data) {
10073
const auto orig_size = data.size();
10174
const llvm::support::ulittle32_t *mem_ranges_count;
10275
Status error = consumeObject(data, mem_ranges_count);
10376
if (error.Fail() ||
104-
*mem_ranges_count * sizeof(MinidumpMemoryDescriptor) > data.size())
77+
*mem_ranges_count * sizeof(MemoryDescriptor) > data.size())
10578
return {};
10679

10780
// Compilers might end up padding an extra 4 bytes depending on how the
10881
// structure is padded by the compiler and the #pragma pack settings.
109-
if (4 + *mem_ranges_count * sizeof(MinidumpMemoryDescriptor) < orig_size)
82+
if (4 + *mem_ranges_count * sizeof(MemoryDescriptor) < orig_size)
11083
data = data.drop_front(4);
11184

11285
return llvm::makeArrayRef(
113-
reinterpret_cast<const MinidumpMemoryDescriptor *>(data.data()),
86+
reinterpret_cast<const MemoryDescriptor *>(data.data()),
11487
*mem_ranges_count);
11588
}
11689

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

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,7 @@ Status consumeObject(llvm::ArrayRef<uint8_t> &Buffer, const T *&Object) {
7575
return error;
7676
}
7777

78-
// Reference:
79-
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680384(v=vs.85).aspx
80-
struct MinidumpMemoryDescriptor {
81-
llvm::support::ulittle64_t start_of_memory_range;
82-
LocationDescriptor memory;
83-
84-
static llvm::ArrayRef<MinidumpMemoryDescriptor>
85-
ParseMemoryList(llvm::ArrayRef<uint8_t> &data);
86-
};
87-
static_assert(sizeof(MinidumpMemoryDescriptor) == 16,
88-
"sizeof MinidumpMemoryDescriptor is not correct!");
78+
llvm::ArrayRef<MemoryDescriptor> ParseMemoryList(llvm::ArrayRef<uint8_t> &data);
8979

9080
struct MinidumpMemoryDescriptor64 {
9181
llvm::support::ulittle64_t start_of_memory_range;
@@ -181,25 +171,6 @@ struct MinidumpMemoryInfo {
181171
static_assert(sizeof(MinidumpMemoryInfo) == 48,
182172
"sizeof MinidumpMemoryInfo is not correct!");
183173

184-
// Reference:
185-
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680517(v=vs.85).aspx
186-
struct MinidumpThread {
187-
llvm::support::ulittle32_t thread_id;
188-
llvm::support::ulittle32_t suspend_count;
189-
llvm::support::ulittle32_t priority_class;
190-
llvm::support::ulittle32_t priority;
191-
llvm::support::ulittle64_t teb;
192-
MinidumpMemoryDescriptor stack;
193-
LocationDescriptor thread_context;
194-
195-
static const MinidumpThread *Parse(llvm::ArrayRef<uint8_t> &data);
196-
197-
static llvm::ArrayRef<MinidumpThread>
198-
ParseThreadList(llvm::ArrayRef<uint8_t> &data);
199-
};
200-
static_assert(sizeof(MinidumpThread) == 48,
201-
"sizeof MinidumpThread is not correct!");
202-
203174
// TODO misc2, misc3 ?
204175
// Reference:
205176
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -326,12 +326,12 @@ void ProcessMinidump::Clear() { Process::m_thread_list.Clear(); }
326326

327327
bool ProcessMinidump::UpdateThreadList(ThreadList &old_thread_list,
328328
ThreadList &new_thread_list) {
329-
for (const MinidumpThread& thread : m_thread_list) {
330-
LocationDescriptor context_location = thread.thread_context;
329+
for (const minidump::Thread &thread : m_thread_list) {
330+
LocationDescriptor context_location = thread.Context;
331331

332332
// If the minidump contains an exception context, use it
333333
if (m_active_exception != nullptr &&
334-
m_active_exception->thread_id == thread.thread_id) {
334+
m_active_exception->thread_id == thread.ThreadId) {
335335
context_location = m_active_exception->thread_context;
336336
}
337337

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class ProcessMinidump : public Process {
107107
private:
108108
FileSpec m_core_file;
109109
lldb::DataBufferSP m_core_data;
110-
llvm::ArrayRef<MinidumpThread> m_thread_list;
110+
llvm::ArrayRef<minidump::Thread> m_thread_list;
111111
const MinidumpExceptionStream *m_active_exception;
112112
lldb::CommandObjectSP m_command_sp;
113113
bool m_is_wow64;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ using namespace lldb;
3333
using namespace lldb_private;
3434
using namespace minidump;
3535

36-
ThreadMinidump::ThreadMinidump(Process &process, const MinidumpThread &td,
36+
ThreadMinidump::ThreadMinidump(Process &process, const minidump::Thread &td,
3737
llvm::ArrayRef<uint8_t> gpregset_data)
38-
: Thread(process, td.thread_id), m_thread_reg_ctx_sp(),
38+
: Thread(process, td.ThreadId), m_thread_reg_ctx_sp(),
3939
m_gpregset_data(gpregset_data) {}
4040

4141
ThreadMinidump::~ThreadMinidump() {}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace minidump {
2020

2121
class ThreadMinidump : public Thread {
2222
public:
23-
ThreadMinidump(Process &process, const MinidumpThread &td,
23+
ThreadMinidump(Process &process, const minidump::Thread &td,
2424
llvm::ArrayRef<uint8_t> gpregset_data);
2525

2626
~ThreadMinidump() override;

lldb/unittests/Process/minidump/MinidumpParserTest.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@ TEST_F(MinidumpParserTest, InvalidMinidump) {
9191

9292
TEST_F(MinidumpParserTest, GetThreadsAndGetThreadContext) {
9393
SetUpData("linux-x86_64.dmp");
94-
llvm::ArrayRef<MinidumpThread> thread_list;
94+
llvm::ArrayRef<minidump::Thread> thread_list;
9595

9696
thread_list = parser->GetThreads();
9797
ASSERT_EQ(1UL, thread_list.size());
9898

99-
const MinidumpThread thread = thread_list[0];
99+
const minidump::Thread &thread = thread_list[0];
100100

101-
EXPECT_EQ(16001UL, thread.thread_id);
101+
EXPECT_EQ(16001UL, thread.ThreadId);
102102

103103
llvm::ArrayRef<uint8_t> context = parser->GetThreadContext(thread);
104104
EXPECT_EQ(1232UL, context.size());
@@ -108,12 +108,12 @@ TEST_F(MinidumpParserTest, GetThreadListNotPadded) {
108108
// Verify that we can load a thread list that doesn't have 4 bytes of padding
109109
// after the thread count.
110110
SetUpData("thread-list-not-padded.dmp");
111-
llvm::ArrayRef<MinidumpThread> thread_list;
111+
llvm::ArrayRef<minidump::Thread> thread_list;
112112

113113
thread_list = parser->GetThreads();
114114
ASSERT_EQ(2UL, thread_list.size());
115-
EXPECT_EQ(0x11223344UL, thread_list[0].thread_id);
116-
EXPECT_EQ(0x55667788UL, thread_list[1].thread_id);
115+
EXPECT_EQ(0x11223344UL, thread_list[0].ThreadId);
116+
EXPECT_EQ(0x55667788UL, thread_list[1].ThreadId);
117117
}
118118

119119
TEST_F(MinidumpParserTest, GetThreadListPadded) {
@@ -122,8 +122,8 @@ TEST_F(MinidumpParserTest, GetThreadListPadded) {
122122
SetUpData("thread-list-padded.dmp");
123123
auto thread_list = parser->GetThreads();
124124
ASSERT_EQ(2UL, thread_list.size());
125-
EXPECT_EQ(0x11223344UL, thread_list[0].thread_id);
126-
EXPECT_EQ(0x55667788UL, thread_list[1].thread_id);
125+
EXPECT_EQ(0x11223344UL, thread_list[0].ThreadId);
126+
EXPECT_EQ(0x55667788UL, thread_list[1].ThreadId);
127127
}
128128

129129
TEST_F(MinidumpParserTest, GetMemoryListNotPadded) {
@@ -460,8 +460,8 @@ TEST_F(MinidumpParserTest, GetPidWow64) {
460460

461461
TEST_F(MinidumpParserTest, GetThreadContext_x86_32) {
462462
SetUpData("linux-i386.dmp");
463-
llvm::ArrayRef<MinidumpThread> thread_list = parser->GetThreads();
464-
const MinidumpThread thread = thread_list[0];
463+
llvm::ArrayRef<minidump::Thread> thread_list = parser->GetThreads();
464+
const minidump::Thread &thread = thread_list[0];
465465
llvm::ArrayRef<uint8_t> registers(parser->GetThreadContext(thread));
466466
const MinidumpContext_x86_32 *context;
467467
EXPECT_TRUE(consumeObject(registers, context).Success());
@@ -491,8 +491,8 @@ TEST_F(MinidumpParserTest, GetThreadContext_x86_32) {
491491

492492
TEST_F(MinidumpParserTest, GetThreadContext_x86_64) {
493493
SetUpData("linux-x86_64.dmp");
494-
llvm::ArrayRef<MinidumpThread> thread_list = parser->GetThreads();
495-
const MinidumpThread thread = thread_list[0];
494+
llvm::ArrayRef<minidump::Thread> thread_list = parser->GetThreads();
495+
const minidump::Thread &thread = thread_list[0];
496496
llvm::ArrayRef<uint8_t> registers(parser->GetThreadContext(thread));
497497
const MinidumpContext_x86_64 *context;
498498
EXPECT_TRUE(consumeObject(registers, context).Success());
@@ -526,8 +526,8 @@ TEST_F(MinidumpParserTest, GetThreadContext_x86_64) {
526526

527527
TEST_F(MinidumpParserTest, GetThreadContext_x86_32_wow64) {
528528
SetUpData("fizzbuzz_wow64.dmp");
529-
llvm::ArrayRef<MinidumpThread> thread_list = parser->GetThreads();
530-
const MinidumpThread thread = thread_list[0];
529+
llvm::ArrayRef<minidump::Thread> thread_list = parser->GetThreads();
530+
const minidump::Thread &thread = thread_list[0];
531531
llvm::ArrayRef<uint8_t> registers(parser->GetThreadContextWow64(thread));
532532
const MinidumpContext_x86_32 *context;
533533
EXPECT_TRUE(consumeObject(registers, context).Success());

0 commit comments

Comments
 (0)