OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
13 // limitations under the License. | 13 // limitations under the License. |
14 | 14 |
15 #include "minidump/minidump_thread_writer.h" | 15 #include "minidump/minidump_thread_writer.h" |
16 | 16 |
17 #include <windows.h> | 17 #include <windows.h> |
18 #include <dbghelp.h> | 18 #include <dbghelp.h> |
19 #include <sys/types.h> | 19 #include <sys/types.h> |
20 | 20 |
21 #include <string> | 21 #include <string> |
| 22 #include <utility> |
22 | 23 |
23 #include "base/compiler_specific.h" | 24 #include "base/compiler_specific.h" |
24 #include "base/format_macros.h" | 25 #include "base/format_macros.h" |
25 #include "base/strings/stringprintf.h" | 26 #include "base/strings/stringprintf.h" |
26 #include "gtest/gtest.h" | 27 #include "gtest/gtest.h" |
27 #include "minidump/minidump_context_writer.h" | 28 #include "minidump/minidump_context_writer.h" |
28 #include "minidump/minidump_memory_writer.h" | 29 #include "minidump/minidump_memory_writer.h" |
29 #include "minidump/minidump_file_writer.h" | 30 #include "minidump/minidump_file_writer.h" |
30 #include "minidump/minidump_thread_id_map.h" | 31 #include "minidump/minidump_thread_id_map.h" |
31 #include "minidump/test/minidump_context_test_util.h" | 32 #include "minidump/test/minidump_context_test_util.h" |
32 #include "minidump/test/minidump_memory_writer_test_util.h" | 33 #include "minidump/test/minidump_memory_writer_test_util.h" |
33 #include "minidump/test/minidump_file_writer_test_util.h" | 34 #include "minidump/test/minidump_file_writer_test_util.h" |
34 #include "minidump/test/minidump_writable_test_util.h" | 35 #include "minidump/test/minidump_writable_test_util.h" |
35 #include "snapshot/test/test_cpu_context.h" | 36 #include "snapshot/test/test_cpu_context.h" |
36 #include "snapshot/test/test_memory_snapshot.h" | 37 #include "snapshot/test/test_memory_snapshot.h" |
37 #include "snapshot/test/test_thread_snapshot.h" | 38 #include "snapshot/test/test_thread_snapshot.h" |
38 #include "test/gtest_death_check.h" | 39 #include "test/gtest_death_check.h" |
39 #include "util/file/string_file.h" | 40 #include "util/file/string_file.h" |
40 #include "util/stdlib/move.h" | |
41 | 41 |
42 namespace crashpad { | 42 namespace crashpad { |
43 namespace test { | 43 namespace test { |
44 namespace { | 44 namespace { |
45 | 45 |
46 // This returns the MINIDUMP_THREAD_LIST stream in |thread_list|. If | 46 // This returns the MINIDUMP_THREAD_LIST stream in |thread_list|. If |
47 // |memory_list| is not nullptr, a MINIDUMP_MEMORY_LIST stream is also expected | 47 // |memory_list| is not nullptr, a MINIDUMP_MEMORY_LIST stream is also expected |
48 // in |file_contents|, and that stream will be returned in |memory_list|. | 48 // in |file_contents|, and that stream will be returned in |memory_list|. |
49 void GetThreadListStream(const std::string& file_contents, | 49 void GetThreadListStream(const std::string& file_contents, |
50 const MINIDUMP_THREAD_LIST** thread_list, | 50 const MINIDUMP_THREAD_LIST** thread_list, |
(...skipping 26 matching lines...) Expand all Loading... |
77 *memory_list = MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( | 77 *memory_list = MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( |
78 file_contents, directory[1].Location); | 78 file_contents, directory[1].Location); |
79 ASSERT_TRUE(*memory_list); | 79 ASSERT_TRUE(*memory_list); |
80 } | 80 } |
81 } | 81 } |
82 | 82 |
83 TEST(MinidumpThreadWriter, EmptyThreadList) { | 83 TEST(MinidumpThreadWriter, EmptyThreadList) { |
84 MinidumpFileWriter minidump_file_writer; | 84 MinidumpFileWriter minidump_file_writer; |
85 auto thread_list_writer = make_scoped_ptr(new MinidumpThreadListWriter()); | 85 auto thread_list_writer = make_scoped_ptr(new MinidumpThreadListWriter()); |
86 | 86 |
87 minidump_file_writer.AddStream(crashpad::move(thread_list_writer)); | 87 minidump_file_writer.AddStream(std::move(thread_list_writer)); |
88 | 88 |
89 StringFile string_file; | 89 StringFile string_file; |
90 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 90 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
91 | 91 |
92 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + | 92 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + |
93 sizeof(MINIDUMP_THREAD_LIST), | 93 sizeof(MINIDUMP_THREAD_LIST), |
94 string_file.string().size()); | 94 string_file.string().size()); |
95 | 95 |
96 const MINIDUMP_THREAD_LIST* thread_list = nullptr; | 96 const MINIDUMP_THREAD_LIST* thread_list = nullptr; |
97 ASSERT_NO_FATAL_FAILURE( | 97 ASSERT_NO_FATAL_FAILURE( |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 | 154 |
155 auto thread_writer = make_scoped_ptr(new MinidumpThreadWriter()); | 155 auto thread_writer = make_scoped_ptr(new MinidumpThreadWriter()); |
156 thread_writer->SetThreadID(kThreadID); | 156 thread_writer->SetThreadID(kThreadID); |
157 thread_writer->SetSuspendCount(kSuspendCount); | 157 thread_writer->SetSuspendCount(kSuspendCount); |
158 thread_writer->SetPriorityClass(kPriorityClass); | 158 thread_writer->SetPriorityClass(kPriorityClass); |
159 thread_writer->SetPriority(kPriority); | 159 thread_writer->SetPriority(kPriority); |
160 thread_writer->SetTEB(kTEB); | 160 thread_writer->SetTEB(kTEB); |
161 | 161 |
162 auto context_x86_writer = make_scoped_ptr(new MinidumpContextX86Writer()); | 162 auto context_x86_writer = make_scoped_ptr(new MinidumpContextX86Writer()); |
163 InitializeMinidumpContextX86(context_x86_writer->context(), kSeed); | 163 InitializeMinidumpContextX86(context_x86_writer->context(), kSeed); |
164 thread_writer->SetContext(crashpad::move(context_x86_writer)); | 164 thread_writer->SetContext(std::move(context_x86_writer)); |
165 | 165 |
166 thread_list_writer->AddThread(crashpad::move(thread_writer)); | 166 thread_list_writer->AddThread(std::move(thread_writer)); |
167 minidump_file_writer.AddStream(crashpad::move(thread_list_writer)); | 167 minidump_file_writer.AddStream(std::move(thread_list_writer)); |
168 | 168 |
169 StringFile string_file; | 169 StringFile string_file; |
170 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 170 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
171 | 171 |
172 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + | 172 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + |
173 sizeof(MINIDUMP_THREAD_LIST) + 1 * sizeof(MINIDUMP_THREAD) + | 173 sizeof(MINIDUMP_THREAD_LIST) + 1 * sizeof(MINIDUMP_THREAD) + |
174 1 * sizeof(MinidumpContextX86), | 174 1 * sizeof(MinidumpContextX86), |
175 string_file.string().size()); | 175 string_file.string().size()); |
176 | 176 |
177 const MINIDUMP_THREAD_LIST* thread_list = nullptr; | 177 const MINIDUMP_THREAD_LIST* thread_list = nullptr; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 | 216 |
217 auto thread_writer = make_scoped_ptr(new MinidumpThreadWriter()); | 217 auto thread_writer = make_scoped_ptr(new MinidumpThreadWriter()); |
218 thread_writer->SetThreadID(kThreadID); | 218 thread_writer->SetThreadID(kThreadID); |
219 thread_writer->SetSuspendCount(kSuspendCount); | 219 thread_writer->SetSuspendCount(kSuspendCount); |
220 thread_writer->SetPriorityClass(kPriorityClass); | 220 thread_writer->SetPriorityClass(kPriorityClass); |
221 thread_writer->SetPriority(kPriority); | 221 thread_writer->SetPriority(kPriority); |
222 thread_writer->SetTEB(kTEB); | 222 thread_writer->SetTEB(kTEB); |
223 | 223 |
224 auto memory_writer = make_scoped_ptr( | 224 auto memory_writer = make_scoped_ptr( |
225 new TestMinidumpMemoryWriter(kMemoryBase, kMemorySize, kMemoryValue)); | 225 new TestMinidumpMemoryWriter(kMemoryBase, kMemorySize, kMemoryValue)); |
226 thread_writer->SetStack(crashpad::move(memory_writer)); | 226 thread_writer->SetStack(std::move(memory_writer)); |
227 | 227 |
228 MSVC_SUPPRESS_WARNING(4316); // Object allocated on heap may not be aligned. | 228 MSVC_SUPPRESS_WARNING(4316); // Object allocated on heap may not be aligned. |
229 auto context_amd64_writer = make_scoped_ptr(new MinidumpContextAMD64Writer()); | 229 auto context_amd64_writer = make_scoped_ptr(new MinidumpContextAMD64Writer()); |
230 InitializeMinidumpContextAMD64(context_amd64_writer->context(), kSeed); | 230 InitializeMinidumpContextAMD64(context_amd64_writer->context(), kSeed); |
231 thread_writer->SetContext(crashpad::move(context_amd64_writer)); | 231 thread_writer->SetContext(std::move(context_amd64_writer)); |
232 | 232 |
233 thread_list_writer->AddThread(crashpad::move(thread_writer)); | 233 thread_list_writer->AddThread(std::move(thread_writer)); |
234 minidump_file_writer.AddStream(crashpad::move(thread_list_writer)); | 234 minidump_file_writer.AddStream(std::move(thread_list_writer)); |
235 | 235 |
236 StringFile string_file; | 236 StringFile string_file; |
237 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 237 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
238 | 238 |
239 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + | 239 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + |
240 sizeof(MINIDUMP_THREAD_LIST) + 1 * sizeof(MINIDUMP_THREAD) + | 240 sizeof(MINIDUMP_THREAD_LIST) + 1 * sizeof(MINIDUMP_THREAD) + |
241 1 * sizeof(MinidumpContextAMD64) + kMemorySize, | 241 1 * sizeof(MinidumpContextAMD64) + kMemorySize, |
242 string_file.string().size()); | 242 string_file.string().size()); |
243 | 243 |
244 const MINIDUMP_THREAD_LIST* thread_list = nullptr; | 244 const MINIDUMP_THREAD_LIST* thread_list = nullptr; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 | 294 |
295 auto thread_writer_0 = make_scoped_ptr(new MinidumpThreadWriter()); | 295 auto thread_writer_0 = make_scoped_ptr(new MinidumpThreadWriter()); |
296 thread_writer_0->SetThreadID(kThreadID0); | 296 thread_writer_0->SetThreadID(kThreadID0); |
297 thread_writer_0->SetSuspendCount(kSuspendCount0); | 297 thread_writer_0->SetSuspendCount(kSuspendCount0); |
298 thread_writer_0->SetPriorityClass(kPriorityClass0); | 298 thread_writer_0->SetPriorityClass(kPriorityClass0); |
299 thread_writer_0->SetPriority(kPriority0); | 299 thread_writer_0->SetPriority(kPriority0); |
300 thread_writer_0->SetTEB(kTEB0); | 300 thread_writer_0->SetTEB(kTEB0); |
301 | 301 |
302 auto memory_writer_0 = make_scoped_ptr( | 302 auto memory_writer_0 = make_scoped_ptr( |
303 new TestMinidumpMemoryWriter(kMemoryBase0, kMemorySize0, kMemoryValue0)); | 303 new TestMinidumpMemoryWriter(kMemoryBase0, kMemorySize0, kMemoryValue0)); |
304 thread_writer_0->SetStack(crashpad::move(memory_writer_0)); | 304 thread_writer_0->SetStack(std::move(memory_writer_0)); |
305 | 305 |
306 auto context_x86_writer_0 = make_scoped_ptr(new MinidumpContextX86Writer()); | 306 auto context_x86_writer_0 = make_scoped_ptr(new MinidumpContextX86Writer()); |
307 InitializeMinidumpContextX86(context_x86_writer_0->context(), kSeed0); | 307 InitializeMinidumpContextX86(context_x86_writer_0->context(), kSeed0); |
308 thread_writer_0->SetContext(crashpad::move(context_x86_writer_0)); | 308 thread_writer_0->SetContext(std::move(context_x86_writer_0)); |
309 | 309 |
310 thread_list_writer->AddThread(crashpad::move(thread_writer_0)); | 310 thread_list_writer->AddThread(std::move(thread_writer_0)); |
311 | 311 |
312 const uint32_t kThreadID1 = 2222222; | 312 const uint32_t kThreadID1 = 2222222; |
313 const uint32_t kSuspendCount1 = 222222; | 313 const uint32_t kSuspendCount1 = 222222; |
314 const uint32_t kPriorityClass1 = 22222; | 314 const uint32_t kPriorityClass1 = 22222; |
315 const uint32_t kPriority1 = 2222; | 315 const uint32_t kPriority1 = 2222; |
316 const uint64_t kTEB1 = 222; | 316 const uint64_t kTEB1 = 222; |
317 const uint64_t kMemoryBase1 = 0x2220; | 317 const uint64_t kMemoryBase1 = 0x2220; |
318 const size_t kMemorySize1 = 32; | 318 const size_t kMemorySize1 = 32; |
319 const uint8_t kMemoryValue1 = 22; | 319 const uint8_t kMemoryValue1 = 22; |
320 const uint32_t kSeed1 = 2; | 320 const uint32_t kSeed1 = 2; |
321 | 321 |
322 auto thread_writer_1 = make_scoped_ptr(new MinidumpThreadWriter()); | 322 auto thread_writer_1 = make_scoped_ptr(new MinidumpThreadWriter()); |
323 thread_writer_1->SetThreadID(kThreadID1); | 323 thread_writer_1->SetThreadID(kThreadID1); |
324 thread_writer_1->SetSuspendCount(kSuspendCount1); | 324 thread_writer_1->SetSuspendCount(kSuspendCount1); |
325 thread_writer_1->SetPriorityClass(kPriorityClass1); | 325 thread_writer_1->SetPriorityClass(kPriorityClass1); |
326 thread_writer_1->SetPriority(kPriority1); | 326 thread_writer_1->SetPriority(kPriority1); |
327 thread_writer_1->SetTEB(kTEB1); | 327 thread_writer_1->SetTEB(kTEB1); |
328 | 328 |
329 auto memory_writer_1 = make_scoped_ptr( | 329 auto memory_writer_1 = make_scoped_ptr( |
330 new TestMinidumpMemoryWriter(kMemoryBase1, kMemorySize1, kMemoryValue1)); | 330 new TestMinidumpMemoryWriter(kMemoryBase1, kMemorySize1, kMemoryValue1)); |
331 thread_writer_1->SetStack(crashpad::move(memory_writer_1)); | 331 thread_writer_1->SetStack(std::move(memory_writer_1)); |
332 | 332 |
333 auto context_x86_writer_1 = make_scoped_ptr(new MinidumpContextX86Writer()); | 333 auto context_x86_writer_1 = make_scoped_ptr(new MinidumpContextX86Writer()); |
334 InitializeMinidumpContextX86(context_x86_writer_1->context(), kSeed1); | 334 InitializeMinidumpContextX86(context_x86_writer_1->context(), kSeed1); |
335 thread_writer_1->SetContext(crashpad::move(context_x86_writer_1)); | 335 thread_writer_1->SetContext(std::move(context_x86_writer_1)); |
336 | 336 |
337 thread_list_writer->AddThread(crashpad::move(thread_writer_1)); | 337 thread_list_writer->AddThread(std::move(thread_writer_1)); |
338 | 338 |
339 const uint32_t kThreadID2 = 3333333; | 339 const uint32_t kThreadID2 = 3333333; |
340 const uint32_t kSuspendCount2 = 333333; | 340 const uint32_t kSuspendCount2 = 333333; |
341 const uint32_t kPriorityClass2 = 33333; | 341 const uint32_t kPriorityClass2 = 33333; |
342 const uint32_t kPriority2 = 3333; | 342 const uint32_t kPriority2 = 3333; |
343 const uint64_t kTEB2 = 333; | 343 const uint64_t kTEB2 = 333; |
344 const uint64_t kMemoryBase2 = 0x3330; | 344 const uint64_t kMemoryBase2 = 0x3330; |
345 const size_t kMemorySize2 = 48; | 345 const size_t kMemorySize2 = 48; |
346 const uint8_t kMemoryValue2 = 33; | 346 const uint8_t kMemoryValue2 = 33; |
347 const uint32_t kSeed2 = 3; | 347 const uint32_t kSeed2 = 3; |
348 | 348 |
349 auto thread_writer_2 = make_scoped_ptr(new MinidumpThreadWriter()); | 349 auto thread_writer_2 = make_scoped_ptr(new MinidumpThreadWriter()); |
350 thread_writer_2->SetThreadID(kThreadID2); | 350 thread_writer_2->SetThreadID(kThreadID2); |
351 thread_writer_2->SetSuspendCount(kSuspendCount2); | 351 thread_writer_2->SetSuspendCount(kSuspendCount2); |
352 thread_writer_2->SetPriorityClass(kPriorityClass2); | 352 thread_writer_2->SetPriorityClass(kPriorityClass2); |
353 thread_writer_2->SetPriority(kPriority2); | 353 thread_writer_2->SetPriority(kPriority2); |
354 thread_writer_2->SetTEB(kTEB2); | 354 thread_writer_2->SetTEB(kTEB2); |
355 | 355 |
356 auto memory_writer_2 = make_scoped_ptr( | 356 auto memory_writer_2 = make_scoped_ptr( |
357 new TestMinidumpMemoryWriter(kMemoryBase2, kMemorySize2, kMemoryValue2)); | 357 new TestMinidumpMemoryWriter(kMemoryBase2, kMemorySize2, kMemoryValue2)); |
358 thread_writer_2->SetStack(crashpad::move(memory_writer_2)); | 358 thread_writer_2->SetStack(std::move(memory_writer_2)); |
359 | 359 |
360 auto context_x86_writer_2 = make_scoped_ptr(new MinidumpContextX86Writer()); | 360 auto context_x86_writer_2 = make_scoped_ptr(new MinidumpContextX86Writer()); |
361 InitializeMinidumpContextX86(context_x86_writer_2->context(), kSeed2); | 361 InitializeMinidumpContextX86(context_x86_writer_2->context(), kSeed2); |
362 thread_writer_2->SetContext(crashpad::move(context_x86_writer_2)); | 362 thread_writer_2->SetContext(std::move(context_x86_writer_2)); |
363 | 363 |
364 thread_list_writer->AddThread(crashpad::move(thread_writer_2)); | 364 thread_list_writer->AddThread(std::move(thread_writer_2)); |
365 | 365 |
366 minidump_file_writer.AddStream(crashpad::move(thread_list_writer)); | 366 minidump_file_writer.AddStream(std::move(thread_list_writer)); |
367 minidump_file_writer.AddStream(crashpad::move(memory_list_writer)); | 367 minidump_file_writer.AddStream(std::move(memory_list_writer)); |
368 | 368 |
369 StringFile string_file; | 369 StringFile string_file; |
370 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 370 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
371 | 371 |
372 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + 2 * sizeof(MINIDUMP_DIRECTORY) + | 372 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + 2 * sizeof(MINIDUMP_DIRECTORY) + |
373 sizeof(MINIDUMP_THREAD_LIST) + 3 * sizeof(MINIDUMP_THREAD) + | 373 sizeof(MINIDUMP_THREAD_LIST) + 3 * sizeof(MINIDUMP_THREAD) + |
374 sizeof(MINIDUMP_MEMORY_LIST) + | 374 sizeof(MINIDUMP_MEMORY_LIST) + |
375 3 * sizeof(MINIDUMP_MEMORY_DESCRIPTOR) + | 375 3 * sizeof(MINIDUMP_MEMORY_DESCRIPTOR) + |
376 3 * sizeof(MinidumpContextX86) + kMemorySize0 + kMemorySize1 + | 376 3 * sizeof(MinidumpContextX86) + kMemorySize0 + kMemorySize1 + |
377 kMemorySize2 + 12, // 12 for alignment | 377 kMemorySize2 + 12, // 12 for alignment |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 thread_snapshot->SetSuspendCount(expect_threads[index].SuspendCount); | 594 thread_snapshot->SetSuspendCount(expect_threads[index].SuspendCount); |
595 thread_snapshot->SetPriority(expect_threads[index].Priority); | 595 thread_snapshot->SetPriority(expect_threads[index].Priority); |
596 thread_snapshot->SetThreadSpecificDataAddress(expect_threads[index].Teb); | 596 thread_snapshot->SetThreadSpecificDataAddress(expect_threads[index].Teb); |
597 | 597 |
598 if (expect_threads[index].Stack.Memory.DataSize) { | 598 if (expect_threads[index].Stack.Memory.DataSize) { |
599 auto memory_snapshot = make_scoped_ptr(new TestMemorySnapshot()); | 599 auto memory_snapshot = make_scoped_ptr(new TestMemorySnapshot()); |
600 memory_snapshot->SetAddress( | 600 memory_snapshot->SetAddress( |
601 expect_threads[index].Stack.StartOfMemoryRange); | 601 expect_threads[index].Stack.StartOfMemoryRange); |
602 memory_snapshot->SetSize(expect_threads[index].Stack.Memory.DataSize); | 602 memory_snapshot->SetSize(expect_threads[index].Stack.Memory.DataSize); |
603 memory_snapshot->SetValue(memory_values[index]); | 603 memory_snapshot->SetValue(memory_values[index]); |
604 thread_snapshot->SetStack(crashpad::move(memory_snapshot)); | 604 thread_snapshot->SetStack(std::move(memory_snapshot)); |
605 } | 605 } |
606 | 606 |
607 Traits::InitializeCPUContext(thread_snapshot->MutableContext(), | 607 Traits::InitializeCPUContext(thread_snapshot->MutableContext(), |
608 context_seeds[index]); | 608 context_seeds[index]); |
609 | 609 |
610 auto teb_snapshot = make_scoped_ptr(new TestMemorySnapshot()); | 610 auto teb_snapshot = make_scoped_ptr(new TestMemorySnapshot()); |
611 teb_snapshot->SetAddress(expect_threads[index].Teb); | 611 teb_snapshot->SetAddress(expect_threads[index].Teb); |
612 teb_snapshot->SetSize(kTebSize); | 612 teb_snapshot->SetSize(kTebSize); |
613 teb_snapshot->SetValue(static_cast<char>('t' + index)); | 613 teb_snapshot->SetValue(static_cast<char>('t' + index)); |
614 thread_snapshot->AddExtraMemory(crashpad::move(teb_snapshot)); | 614 thread_snapshot->AddExtraMemory(std::move(teb_snapshot)); |
615 | 615 |
616 thread_snapshots.push_back(thread_snapshot); | 616 thread_snapshots.push_back(thread_snapshot); |
617 } | 617 } |
618 | 618 |
619 auto thread_list_writer = make_scoped_ptr(new MinidumpThreadListWriter()); | 619 auto thread_list_writer = make_scoped_ptr(new MinidumpThreadListWriter()); |
620 auto memory_list_writer = make_scoped_ptr(new MinidumpMemoryListWriter()); | 620 auto memory_list_writer = make_scoped_ptr(new MinidumpMemoryListWriter()); |
621 thread_list_writer->SetMemoryListWriter(memory_list_writer.get()); | 621 thread_list_writer->SetMemoryListWriter(memory_list_writer.get()); |
622 MinidumpThreadIDMap thread_id_map; | 622 MinidumpThreadIDMap thread_id_map; |
623 thread_list_writer->InitializeFromSnapshot(thread_snapshots, &thread_id_map); | 623 thread_list_writer->InitializeFromSnapshot(thread_snapshots, &thread_id_map); |
624 | 624 |
625 MinidumpFileWriter minidump_file_writer; | 625 MinidumpFileWriter minidump_file_writer; |
626 minidump_file_writer.AddStream(crashpad::move(thread_list_writer)); | 626 minidump_file_writer.AddStream(std::move(thread_list_writer)); |
627 minidump_file_writer.AddStream(crashpad::move(memory_list_writer)); | 627 minidump_file_writer.AddStream(std::move(memory_list_writer)); |
628 | 628 |
629 StringFile string_file; | 629 StringFile string_file; |
630 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 630 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
631 | 631 |
632 const MINIDUMP_THREAD_LIST* thread_list = nullptr; | 632 const MINIDUMP_THREAD_LIST* thread_list = nullptr; |
633 const MINIDUMP_MEMORY_LIST* memory_list = nullptr; | 633 const MINIDUMP_MEMORY_LIST* memory_list = nullptr; |
634 ASSERT_NO_FATAL_FAILURE( | 634 ASSERT_NO_FATAL_FAILURE( |
635 GetThreadListStream(string_file.string(), &thread_list, &memory_list)); | 635 GetThreadListStream(string_file.string(), &thread_list, &memory_list)); |
636 | 636 |
637 ASSERT_EQ(3u, thread_list->NumberOfThreads); | 637 ASSERT_EQ(3u, thread_list->NumberOfThreads); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 TEST(MinidumpThreadWriter, InitializeFromSnapshot_ThreadIDCollision) { | 694 TEST(MinidumpThreadWriter, InitializeFromSnapshot_ThreadIDCollision) { |
695 RunInitializeFromSnapshotTest<InitializeFromSnapshotX86Traits>(true); | 695 RunInitializeFromSnapshotTest<InitializeFromSnapshotX86Traits>(true); |
696 } | 696 } |
697 | 697 |
698 TEST(MinidumpThreadWriterDeathTest, NoContext) { | 698 TEST(MinidumpThreadWriterDeathTest, NoContext) { |
699 MinidumpFileWriter minidump_file_writer; | 699 MinidumpFileWriter minidump_file_writer; |
700 auto thread_list_writer = make_scoped_ptr(new MinidumpThreadListWriter()); | 700 auto thread_list_writer = make_scoped_ptr(new MinidumpThreadListWriter()); |
701 | 701 |
702 auto thread_writer = make_scoped_ptr(new MinidumpThreadWriter()); | 702 auto thread_writer = make_scoped_ptr(new MinidumpThreadWriter()); |
703 | 703 |
704 thread_list_writer->AddThread(crashpad::move(thread_writer)); | 704 thread_list_writer->AddThread(std::move(thread_writer)); |
705 minidump_file_writer.AddStream(crashpad::move(thread_list_writer)); | 705 minidump_file_writer.AddStream(std::move(thread_list_writer)); |
706 | 706 |
707 StringFile string_file; | 707 StringFile string_file; |
708 ASSERT_DEATH_CHECK(minidump_file_writer.WriteEverything(&string_file), | 708 ASSERT_DEATH_CHECK(minidump_file_writer.WriteEverything(&string_file), |
709 "context_"); | 709 "context_"); |
710 } | 710 } |
711 | 711 |
712 TEST(MinidumpThreadWriterDeathTest, InitializeFromSnapshot_NoContext) { | 712 TEST(MinidumpThreadWriterDeathTest, InitializeFromSnapshot_NoContext) { |
713 ASSERT_DEATH_CHECK( | 713 ASSERT_DEATH_CHECK( |
714 RunInitializeFromSnapshotTest<InitializeFromSnapshotNoContextTraits>( | 714 RunInitializeFromSnapshotTest<InitializeFromSnapshotNoContextTraits>( |
715 false), "context_"); | 715 false), "context_"); |
716 } | 716 } |
717 | 717 |
718 } // namespace | 718 } // namespace |
719 } // namespace test | 719 } // namespace test |
720 } // namespace crashpad | 720 } // namespace crashpad |
OLD | NEW |