| 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, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include <string> | 25 #include <string> |
| 26 #include <vector> | 26 #include <vector> |
| 27 | 27 |
| 28 #include "base/logging.h" | 28 #include "base/logging.h" |
| 29 #include "base/mac/scoped_mach_port.h" | 29 #include "base/mac/scoped_mach_port.h" |
| 30 #include "base/posix/eintr_wrapper.h" | 30 #include "base/posix/eintr_wrapper.h" |
| 31 #include "base/strings/stringprintf.h" | 31 #include "base/strings/stringprintf.h" |
| 32 #include "build/build_config.h" | 32 #include "build/build_config.h" |
| 33 #include "gtest/gtest.h" | 33 #include "gtest/gtest.h" |
| 34 #include "util/file/fd_io.h" | 34 #include "util/file/fd_io.h" |
| 35 #include "util/mac/mach_o_image_reader.h" |
| 35 #include "util/mach/mach_extensions.h" | 36 #include "util/mach/mach_extensions.h" |
| 36 #include "util/stdlib/pointer_container.h" | 37 #include "util/stdlib/pointer_container.h" |
| 37 #include "util/test/errors.h" | 38 #include "util/test/errors.h" |
| 38 #include "util/test/mac/dyld.h" | 39 #include "util/test/mac/dyld.h" |
| 39 #include "util/test/mac/mach_errors.h" | 40 #include "util/test/mac/mach_errors.h" |
| 40 #include "util/test/mac/mach_multiprocess.h" | 41 #include "util/test/mac/mach_multiprocess.h" |
| 41 | 42 |
| 42 namespace { | 43 namespace { |
| 43 | 44 |
| 44 using namespace crashpad; | 45 using namespace crashpad; |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 ASSERT_EQ(dyld_image_count + 1, modules.size()); | 547 ASSERT_EQ(dyld_image_count + 1, modules.size()); |
| 547 | 548 |
| 548 for (uint32_t index = 0; index < dyld_image_count; ++index) { | 549 for (uint32_t index = 0; index < dyld_image_count; ++index) { |
| 549 SCOPED_TRACE(base::StringPrintf( | 550 SCOPED_TRACE(base::StringPrintf( |
| 550 "index %u, name %s", index, modules[index].name.c_str())); | 551 "index %u, name %s", index, modules[index].name.c_str())); |
| 551 | 552 |
| 552 const char* dyld_image_name = _dyld_get_image_name(index); | 553 const char* dyld_image_name = _dyld_get_image_name(index); |
| 553 EXPECT_EQ(dyld_image_name, modules[index].name); | 554 EXPECT_EQ(dyld_image_name, modules[index].name); |
| 554 EXPECT_EQ( | 555 EXPECT_EQ( |
| 555 reinterpret_cast<mach_vm_address_t>(_dyld_get_image_header(index)), | 556 reinterpret_cast<mach_vm_address_t>(_dyld_get_image_header(index)), |
| 556 modules[index].address); | 557 modules[index].reader->Address()); |
| 557 | 558 |
| 558 if (index == 0) { | 559 if (index == 0) { |
| 559 // dyld didn’t load the main executable, so it couldn’t record its | 560 // dyld didn’t load the main executable, so it couldn’t record its |
| 560 // timestamp, and it is reported as 0. | 561 // timestamp, and it is reported as 0. |
| 561 EXPECT_EQ(0, modules[index].timestamp); | 562 EXPECT_EQ(0, modules[index].timestamp); |
| 562 } else { | 563 } else { |
| 563 // Hope that the module didn’t change on disk. | 564 // Hope that the module didn’t change on disk. |
| 564 struct stat stat_buf; | 565 struct stat stat_buf; |
| 565 int rv = stat(dyld_image_name, &stat_buf); | 566 int rv = stat(dyld_image_name, &stat_buf); |
| 566 EXPECT_EQ(0, rv) << ErrnoMessage("stat"); | 567 EXPECT_EQ(0, rv) << ErrnoMessage("stat"); |
| 567 if (rv == 0) { | 568 if (rv == 0) { |
| 568 EXPECT_EQ(stat_buf.st_mtime, modules[index].timestamp); | 569 EXPECT_EQ(stat_buf.st_mtime, modules[index].timestamp); |
| 569 } | 570 } |
| 570 } | 571 } |
| 571 } | 572 } |
| 572 | 573 |
| 573 size_t index = modules.size() - 1; | 574 size_t index = modules.size() - 1; |
| 574 EXPECT_EQ("/usr/lib/dyld", modules[index].name); | 575 EXPECT_EQ("/usr/lib/dyld", modules[index].name); |
| 575 | 576 |
| 576 // dyld didn’t load itself either, so it couldn’t record its timestamp, and it | 577 // dyld didn’t load itself either, so it couldn’t record its timestamp, and it |
| 577 // is also reported as 0. | 578 // is also reported as 0. |
| 578 EXPECT_EQ(0, modules[index].timestamp); | 579 EXPECT_EQ(0, modules[index].timestamp); |
| 579 | 580 |
| 580 const struct dyld_all_image_infos* dyld_image_infos = | 581 const struct dyld_all_image_infos* dyld_image_infos = |
| 581 _dyld_get_all_image_infos(); | 582 _dyld_get_all_image_infos(); |
| 582 if (dyld_image_infos->version >= 2) { | 583 if (dyld_image_infos->version >= 2) { |
| 583 EXPECT_EQ(reinterpret_cast<mach_vm_address_t>( | 584 EXPECT_EQ( |
| 584 dyld_image_infos->dyldImageLoadAddress), modules[index].address); | 585 reinterpret_cast<mach_vm_address_t>( |
| 586 dyld_image_infos->dyldImageLoadAddress), |
| 587 modules[index].reader->Address()); |
| 585 } | 588 } |
| 586 } | 589 } |
| 587 | 590 |
| 588 class ProcessReaderModulesChild final : public MachMultiprocess { | 591 class ProcessReaderModulesChild final : public MachMultiprocess { |
| 589 public: | 592 public: |
| 590 ProcessReaderModulesChild() : MachMultiprocess() {} | 593 ProcessReaderModulesChild() : MachMultiprocess() {} |
| 591 | 594 |
| 592 ~ProcessReaderModulesChild() {} | 595 ~ProcessReaderModulesChild() {} |
| 593 | 596 |
| 594 private: | 597 private: |
| (...skipping 23 matching lines...) Expand all Loading... |
| 618 CheckedReadFD( | 621 CheckedReadFD( |
| 619 read_fd, &expect_name_length, sizeof(expect_name_length)); | 622 read_fd, &expect_name_length, sizeof(expect_name_length)); |
| 620 | 623 |
| 621 // The NUL terminator is not read. | 624 // The NUL terminator is not read. |
| 622 std::string expect_name(expect_name_length, '\0'); | 625 std::string expect_name(expect_name_length, '\0'); |
| 623 CheckedReadFD(read_fd, &expect_name[0], expect_name_length); | 626 CheckedReadFD(read_fd, &expect_name[0], expect_name_length); |
| 624 EXPECT_EQ(expect_name, modules[index].name); | 627 EXPECT_EQ(expect_name, modules[index].name); |
| 625 | 628 |
| 626 mach_vm_address_t expect_address; | 629 mach_vm_address_t expect_address; |
| 627 CheckedReadFD(read_fd, &expect_address, sizeof(expect_address)); | 630 CheckedReadFD(read_fd, &expect_address, sizeof(expect_address)); |
| 628 EXPECT_EQ(expect_address, modules[index].address); | 631 EXPECT_EQ(expect_address, modules[index].reader->Address()); |
| 629 | 632 |
| 630 if (index == 0 || index == modules.size() - 1) { | 633 if (index == 0 || index == modules.size() - 1) { |
| 631 // dyld didn’t load the main executable or itself, so it couldn’t record | 634 // dyld didn’t load the main executable or itself, so it couldn’t record |
| 632 // these timestamps, and they are reported as 0. | 635 // these timestamps, and they are reported as 0. |
| 633 EXPECT_EQ(0, modules[index].timestamp); | 636 EXPECT_EQ(0, modules[index].timestamp); |
| 634 } else { | 637 } else { |
| 635 // Hope that the module didn’t change on disk. | 638 // Hope that the module didn’t change on disk. |
| 636 struct stat stat_buf; | 639 struct stat stat_buf; |
| 637 int rv = stat(expect_name.c_str(), &stat_buf); | 640 int rv = stat(expect_name.c_str(), &stat_buf); |
| 638 EXPECT_EQ(0, rv) << ErrnoMessage("stat"); | 641 EXPECT_EQ(0, rv) << ErrnoMessage("stat"); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 | 693 |
| 691 DISALLOW_COPY_AND_ASSIGN(ProcessReaderModulesChild); | 694 DISALLOW_COPY_AND_ASSIGN(ProcessReaderModulesChild); |
| 692 }; | 695 }; |
| 693 | 696 |
| 694 TEST(ProcessReader, ChildModules) { | 697 TEST(ProcessReader, ChildModules) { |
| 695 ProcessReaderModulesChild process_reader_modules_child; | 698 ProcessReaderModulesChild process_reader_modules_child; |
| 696 process_reader_modules_child.Run(); | 699 process_reader_modules_child.Run(); |
| 697 } | 700 } |
| 698 | 701 |
| 699 } // namespace | 702 } // namespace |
| OLD | NEW |