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_module_writer.h" | 15 #include "minidump/minidump_module_writer.h" |
16 | 16 |
17 #include <windows.h> | 17 #include <windows.h> |
18 #include <dbghelp.h> | 18 #include <dbghelp.h> |
19 #include <stdint.h> | 19 #include <stdint.h> |
20 #include <string.h> | 20 #include <string.h> |
21 #include <sys/types.h> | 21 #include <sys/types.h> |
22 | 22 |
| 23 #include <utility> |
| 24 |
23 #include "base/format_macros.h" | 25 #include "base/format_macros.h" |
24 #include "base/strings/stringprintf.h" | 26 #include "base/strings/stringprintf.h" |
25 #include "base/strings/utf_string_conversions.h" | 27 #include "base/strings/utf_string_conversions.h" |
26 #include "gtest/gtest.h" | 28 #include "gtest/gtest.h" |
27 #include "minidump/minidump_extensions.h" | 29 #include "minidump/minidump_extensions.h" |
28 #include "minidump/minidump_file_writer.h" | 30 #include "minidump/minidump_file_writer.h" |
29 #include "minidump/test/minidump_file_writer_test_util.h" | 31 #include "minidump/test/minidump_file_writer_test_util.h" |
30 #include "minidump/test/minidump_string_writer_test_util.h" | 32 #include "minidump/test/minidump_string_writer_test_util.h" |
31 #include "minidump/test/minidump_writable_test_util.h" | 33 #include "minidump/test/minidump_writable_test_util.h" |
32 #include "snapshot/test/test_module_snapshot.h" | 34 #include "snapshot/test/test_module_snapshot.h" |
33 #include "test/gtest_death_check.h" | 35 #include "test/gtest_death_check.h" |
34 #include "util/file/string_file.h" | 36 #include "util/file/string_file.h" |
35 #include "util/misc/implicit_cast.h" | 37 #include "util/misc/implicit_cast.h" |
36 #include "util/stdlib/move.h" | |
37 #include "util/misc/uuid.h" | 38 #include "util/misc/uuid.h" |
38 #include "util/stdlib/pointer_container.h" | 39 #include "util/stdlib/pointer_container.h" |
39 | 40 |
40 namespace crashpad { | 41 namespace crashpad { |
41 namespace test { | 42 namespace test { |
42 namespace { | 43 namespace { |
43 | 44 |
44 void GetModuleListStream(const std::string& file_contents, | 45 void GetModuleListStream(const std::string& file_contents, |
45 const MINIDUMP_MODULE_LIST** module_list) { | 46 const MINIDUMP_MODULE_LIST** module_list) { |
46 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); | 47 const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); |
(...skipping 15 matching lines...) Expand all Loading... |
62 | 63 |
63 *module_list = MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( | 64 *module_list = MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( |
64 file_contents, directory[0].Location); | 65 file_contents, directory[0].Location); |
65 ASSERT_TRUE(module_list); | 66 ASSERT_TRUE(module_list); |
66 } | 67 } |
67 | 68 |
68 TEST(MinidumpModuleWriter, EmptyModuleList) { | 69 TEST(MinidumpModuleWriter, EmptyModuleList) { |
69 MinidumpFileWriter minidump_file_writer; | 70 MinidumpFileWriter minidump_file_writer; |
70 auto module_list_writer = make_scoped_ptr(new MinidumpModuleListWriter()); | 71 auto module_list_writer = make_scoped_ptr(new MinidumpModuleListWriter()); |
71 | 72 |
72 minidump_file_writer.AddStream(crashpad::move(module_list_writer)); | 73 minidump_file_writer.AddStream(std::move(module_list_writer)); |
73 | 74 |
74 StringFile string_file; | 75 StringFile string_file; |
75 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 76 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
76 | 77 |
77 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + | 78 ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + |
78 sizeof(MINIDUMP_MODULE_LIST), | 79 sizeof(MINIDUMP_MODULE_LIST), |
79 string_file.string().size()); | 80 string_file.string().size()); |
80 | 81 |
81 const MINIDUMP_MODULE_LIST* module_list = nullptr; | 82 const MINIDUMP_MODULE_LIST* module_list = nullptr; |
82 ASSERT_NO_FATAL_FAILURE( | 83 ASSERT_NO_FATAL_FAILURE( |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 | 271 |
271 TEST(MinidumpModuleWriter, EmptyModule) { | 272 TEST(MinidumpModuleWriter, EmptyModule) { |
272 MinidumpFileWriter minidump_file_writer; | 273 MinidumpFileWriter minidump_file_writer; |
273 auto module_list_writer = make_scoped_ptr(new MinidumpModuleListWriter()); | 274 auto module_list_writer = make_scoped_ptr(new MinidumpModuleListWriter()); |
274 | 275 |
275 const char kModuleName[] = "test_executable"; | 276 const char kModuleName[] = "test_executable"; |
276 | 277 |
277 auto module_writer = make_scoped_ptr(new MinidumpModuleWriter()); | 278 auto module_writer = make_scoped_ptr(new MinidumpModuleWriter()); |
278 module_writer->SetName(kModuleName); | 279 module_writer->SetName(kModuleName); |
279 | 280 |
280 module_list_writer->AddModule(crashpad::move(module_writer)); | 281 module_list_writer->AddModule(std::move(module_writer)); |
281 minidump_file_writer.AddStream(crashpad::move(module_list_writer)); | 282 minidump_file_writer.AddStream(std::move(module_list_writer)); |
282 | 283 |
283 StringFile string_file; | 284 StringFile string_file; |
284 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 285 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
285 | 286 |
286 ASSERT_GT(string_file.string().size(), | 287 ASSERT_GT(string_file.string().size(), |
287 sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + | 288 sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + |
288 sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); | 289 sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); |
289 | 290 |
290 const MINIDUMP_MODULE_LIST* module_list = nullptr; | 291 const MINIDUMP_MODULE_LIST* module_list = nullptr; |
291 ASSERT_NO_FATAL_FAILURE( | 292 ASSERT_NO_FATAL_FAILURE( |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 kProductVersionLS >> 16, | 354 kProductVersionLS >> 16, |
354 kProductVersionLS & 0xffff); | 355 kProductVersionLS & 0xffff); |
355 module_writer->SetFileFlagsAndMask(kFileFlags, kFileFlagsMask); | 356 module_writer->SetFileFlagsAndMask(kFileFlags, kFileFlagsMask); |
356 module_writer->SetFileOS(kFileOS); | 357 module_writer->SetFileOS(kFileOS); |
357 module_writer->SetFileTypeAndSubtype(kFileType, kFileSubtype); | 358 module_writer->SetFileTypeAndSubtype(kFileType, kFileSubtype); |
358 | 359 |
359 auto codeview_pdb70_writer = | 360 auto codeview_pdb70_writer = |
360 make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB70Writer()); | 361 make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB70Writer()); |
361 codeview_pdb70_writer->SetPDBName(kPDBName); | 362 codeview_pdb70_writer->SetPDBName(kPDBName); |
362 codeview_pdb70_writer->SetUUIDAndAge(pdb_uuid, kPDBAge); | 363 codeview_pdb70_writer->SetUUIDAndAge(pdb_uuid, kPDBAge); |
363 module_writer->SetCodeViewRecord(crashpad::move(codeview_pdb70_writer)); | 364 module_writer->SetCodeViewRecord(std::move(codeview_pdb70_writer)); |
364 | 365 |
365 auto misc_debug_writer = | 366 auto misc_debug_writer = |
366 make_scoped_ptr(new MinidumpModuleMiscDebugRecordWriter()); | 367 make_scoped_ptr(new MinidumpModuleMiscDebugRecordWriter()); |
367 misc_debug_writer->SetDataType(kDebugType); | 368 misc_debug_writer->SetDataType(kDebugType); |
368 misc_debug_writer->SetData(kDebugName, kDebugUTF16); | 369 misc_debug_writer->SetData(kDebugName, kDebugUTF16); |
369 module_writer->SetMiscDebugRecord(crashpad::move(misc_debug_writer)); | 370 module_writer->SetMiscDebugRecord(std::move(misc_debug_writer)); |
370 | 371 |
371 module_list_writer->AddModule(crashpad::move(module_writer)); | 372 module_list_writer->AddModule(std::move(module_writer)); |
372 minidump_file_writer.AddStream(crashpad::move(module_list_writer)); | 373 minidump_file_writer.AddStream(std::move(module_list_writer)); |
373 | 374 |
374 StringFile string_file; | 375 StringFile string_file; |
375 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 376 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
376 | 377 |
377 ASSERT_GT(string_file.string().size(), | 378 ASSERT_GT(string_file.string().size(), |
378 sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + | 379 sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + |
379 sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); | 380 sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); |
380 | 381 |
381 const MINIDUMP_MODULE_LIST* module_list = nullptr; | 382 const MINIDUMP_MODULE_LIST* module_list = nullptr; |
382 ASSERT_NO_FATAL_FAILURE( | 383 ASSERT_NO_FATAL_FAILURE( |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 const char kDebugName[] = "d1n05.dbg"; | 429 const char kDebugName[] = "d1n05.dbg"; |
429 const bool kDebugUTF16 = true; | 430 const bool kDebugUTF16 = true; |
430 | 431 |
431 auto module_writer = make_scoped_ptr(new MinidumpModuleWriter()); | 432 auto module_writer = make_scoped_ptr(new MinidumpModuleWriter()); |
432 module_writer->SetName(kModuleName); | 433 module_writer->SetName(kModuleName); |
433 | 434 |
434 auto codeview_pdb20_writer = | 435 auto codeview_pdb20_writer = |
435 make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB20Writer()); | 436 make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB20Writer()); |
436 codeview_pdb20_writer->SetPDBName(kPDBName); | 437 codeview_pdb20_writer->SetPDBName(kPDBName); |
437 codeview_pdb20_writer->SetTimestampAndAge(kPDBTimestamp, kPDBAge); | 438 codeview_pdb20_writer->SetTimestampAndAge(kPDBTimestamp, kPDBAge); |
438 module_writer->SetCodeViewRecord(crashpad::move(codeview_pdb20_writer)); | 439 module_writer->SetCodeViewRecord(std::move(codeview_pdb20_writer)); |
439 | 440 |
440 auto misc_debug_writer = | 441 auto misc_debug_writer = |
441 make_scoped_ptr(new MinidumpModuleMiscDebugRecordWriter()); | 442 make_scoped_ptr(new MinidumpModuleMiscDebugRecordWriter()); |
442 misc_debug_writer->SetDataType(kDebugType); | 443 misc_debug_writer->SetDataType(kDebugType); |
443 misc_debug_writer->SetData(kDebugName, kDebugUTF16); | 444 misc_debug_writer->SetData(kDebugName, kDebugUTF16); |
444 module_writer->SetMiscDebugRecord(crashpad::move(misc_debug_writer)); | 445 module_writer->SetMiscDebugRecord(std::move(misc_debug_writer)); |
445 | 446 |
446 module_list_writer->AddModule(crashpad::move(module_writer)); | 447 module_list_writer->AddModule(std::move(module_writer)); |
447 minidump_file_writer.AddStream(crashpad::move(module_list_writer)); | 448 minidump_file_writer.AddStream(std::move(module_list_writer)); |
448 | 449 |
449 StringFile string_file; | 450 StringFile string_file; |
450 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 451 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
451 | 452 |
452 ASSERT_GT(string_file.string().size(), | 453 ASSERT_GT(string_file.string().size(), |
453 sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + | 454 sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + |
454 sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); | 455 sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); |
455 | 456 |
456 const MINIDUMP_MODULE_LIST* module_list = nullptr; | 457 const MINIDUMP_MODULE_LIST* module_list = nullptr; |
457 ASSERT_NO_FATAL_FAILURE( | 458 ASSERT_NO_FATAL_FAILURE( |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 | 506 |
506 auto module_writer_0 = make_scoped_ptr(new MinidumpModuleWriter()); | 507 auto module_writer_0 = make_scoped_ptr(new MinidumpModuleWriter()); |
507 module_writer_0->SetName(kModuleName0); | 508 module_writer_0->SetName(kModuleName0); |
508 module_writer_0->SetImageBaseAddress(kModuleBase0); | 509 module_writer_0->SetImageBaseAddress(kModuleBase0); |
509 module_writer_0->SetImageSize(kModuleSize0); | 510 module_writer_0->SetImageSize(kModuleSize0); |
510 | 511 |
511 auto codeview_pdb70_writer_0 = | 512 auto codeview_pdb70_writer_0 = |
512 make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB70Writer()); | 513 make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB70Writer()); |
513 codeview_pdb70_writer_0->SetPDBName(kPDBName0); | 514 codeview_pdb70_writer_0->SetPDBName(kPDBName0); |
514 codeview_pdb70_writer_0->SetUUIDAndAge(pdb_uuid_0, kPDBAge0); | 515 codeview_pdb70_writer_0->SetUUIDAndAge(pdb_uuid_0, kPDBAge0); |
515 module_writer_0->SetCodeViewRecord(crashpad::move(codeview_pdb70_writer_0)); | 516 module_writer_0->SetCodeViewRecord(std::move(codeview_pdb70_writer_0)); |
516 | 517 |
517 module_list_writer->AddModule(crashpad::move(module_writer_0)); | 518 module_list_writer->AddModule(std::move(module_writer_0)); |
518 | 519 |
519 auto module_writer_1 = make_scoped_ptr(new MinidumpModuleWriter()); | 520 auto module_writer_1 = make_scoped_ptr(new MinidumpModuleWriter()); |
520 module_writer_1->SetName(kModuleName1); | 521 module_writer_1->SetName(kModuleName1); |
521 module_writer_1->SetImageBaseAddress(kModuleBase1); | 522 module_writer_1->SetImageBaseAddress(kModuleBase1); |
522 module_writer_1->SetImageSize(kModuleSize1); | 523 module_writer_1->SetImageSize(kModuleSize1); |
523 | 524 |
524 module_list_writer->AddModule(crashpad::move(module_writer_1)); | 525 module_list_writer->AddModule(std::move(module_writer_1)); |
525 | 526 |
526 auto module_writer_2 = make_scoped_ptr(new MinidumpModuleWriter()); | 527 auto module_writer_2 = make_scoped_ptr(new MinidumpModuleWriter()); |
527 module_writer_2->SetName(kModuleName2); | 528 module_writer_2->SetName(kModuleName2); |
528 module_writer_2->SetImageBaseAddress(kModuleBase2); | 529 module_writer_2->SetImageBaseAddress(kModuleBase2); |
529 module_writer_2->SetImageSize(kModuleSize2); | 530 module_writer_2->SetImageSize(kModuleSize2); |
530 | 531 |
531 auto codeview_pdb70_writer_2 = | 532 auto codeview_pdb70_writer_2 = |
532 make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB20Writer()); | 533 make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB20Writer()); |
533 codeview_pdb70_writer_2->SetPDBName(kPDBName2); | 534 codeview_pdb70_writer_2->SetPDBName(kPDBName2); |
534 codeview_pdb70_writer_2->SetTimestampAndAge(kPDBTimestamp2, kPDBAge2); | 535 codeview_pdb70_writer_2->SetTimestampAndAge(kPDBTimestamp2, kPDBAge2); |
535 module_writer_2->SetCodeViewRecord(crashpad::move(codeview_pdb70_writer_2)); | 536 module_writer_2->SetCodeViewRecord(std::move(codeview_pdb70_writer_2)); |
536 | 537 |
537 module_list_writer->AddModule(crashpad::move(module_writer_2)); | 538 module_list_writer->AddModule(std::move(module_writer_2)); |
538 | 539 |
539 minidump_file_writer.AddStream(crashpad::move(module_list_writer)); | 540 minidump_file_writer.AddStream(std::move(module_list_writer)); |
540 | 541 |
541 StringFile string_file; | 542 StringFile string_file; |
542 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 543 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
543 | 544 |
544 ASSERT_GT(string_file.string().size(), | 545 ASSERT_GT(string_file.string().size(), |
545 sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + | 546 sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + |
546 sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); | 547 sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); |
547 | 548 |
548 const MINIDUMP_MODULE_LIST* module_list = nullptr; | 549 const MINIDUMP_MODULE_LIST* module_list = nullptr; |
549 ASSERT_NO_FATAL_FAILURE( | 550 ASSERT_NO_FATAL_FAILURE( |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 module_pdbs[index], | 723 module_pdbs[index], |
723 uuids[index], | 724 uuids[index], |
724 ages[index]); | 725 ages[index]); |
725 module_snapshots.push_back(module_snapshot); | 726 module_snapshots.push_back(module_snapshot); |
726 } | 727 } |
727 | 728 |
728 auto module_list_writer = make_scoped_ptr(new MinidumpModuleListWriter()); | 729 auto module_list_writer = make_scoped_ptr(new MinidumpModuleListWriter()); |
729 module_list_writer->InitializeFromSnapshot(module_snapshots); | 730 module_list_writer->InitializeFromSnapshot(module_snapshots); |
730 | 731 |
731 MinidumpFileWriter minidump_file_writer; | 732 MinidumpFileWriter minidump_file_writer; |
732 minidump_file_writer.AddStream(crashpad::move(module_list_writer)); | 733 minidump_file_writer.AddStream(std::move(module_list_writer)); |
733 | 734 |
734 StringFile string_file; | 735 StringFile string_file; |
735 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); | 736 ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); |
736 | 737 |
737 const MINIDUMP_MODULE_LIST* module_list = nullptr; | 738 const MINIDUMP_MODULE_LIST* module_list = nullptr; |
738 ASSERT_NO_FATAL_FAILURE( | 739 ASSERT_NO_FATAL_FAILURE( |
739 GetModuleListStream(string_file.string(), &module_list)); | 740 GetModuleListStream(string_file.string(), &module_list)); |
740 | 741 |
741 ASSERT_EQ(3u, module_list->NumberOfModules); | 742 ASSERT_EQ(3u, module_list->NumberOfModules); |
742 | 743 |
(...skipping 10 matching lines...) Expand all Loading... |
753 nullptr, | 754 nullptr, |
754 0, | 755 0, |
755 false)); | 756 false)); |
756 } | 757 } |
757 } | 758 } |
758 | 759 |
759 TEST(MinidumpModuleWriterDeathTest, NoModuleName) { | 760 TEST(MinidumpModuleWriterDeathTest, NoModuleName) { |
760 MinidumpFileWriter minidump_file_writer; | 761 MinidumpFileWriter minidump_file_writer; |
761 auto module_list_writer = make_scoped_ptr(new MinidumpModuleListWriter()); | 762 auto module_list_writer = make_scoped_ptr(new MinidumpModuleListWriter()); |
762 auto module_writer = make_scoped_ptr(new MinidumpModuleWriter()); | 763 auto module_writer = make_scoped_ptr(new MinidumpModuleWriter()); |
763 module_list_writer->AddModule(crashpad::move(module_writer)); | 764 module_list_writer->AddModule(std::move(module_writer)); |
764 minidump_file_writer.AddStream(crashpad::move(module_list_writer)); | 765 minidump_file_writer.AddStream(std::move(module_list_writer)); |
765 | 766 |
766 StringFile string_file; | 767 StringFile string_file; |
767 ASSERT_DEATH_CHECK(minidump_file_writer.WriteEverything(&string_file), | 768 ASSERT_DEATH_CHECK(minidump_file_writer.WriteEverything(&string_file), |
768 "name_"); | 769 "name_"); |
769 } | 770 } |
770 | 771 |
771 } // namespace | 772 } // namespace |
772 } // namespace test | 773 } // namespace test |
773 } // namespace crashpad | 774 } // namespace crashpad |
OLD | NEW |