| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <cstdlib> | 8 #include <cstdlib> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 #if defined(_WIN64) || (defined(OS_MACOSX) && !defined(OS_IOS)) | 44 #if defined(_WIN64) || (defined(OS_MACOSX) && !defined(OS_IOS)) |
| 45 #define STACK_SAMPLING_PROFILER_SUPPORTED 1 | 45 #define STACK_SAMPLING_PROFILER_SUPPORTED 1 |
| 46 #endif | 46 #endif |
| 47 | 47 |
| 48 #if defined(OS_WIN) | 48 #if defined(OS_WIN) |
| 49 #pragma intrinsic(_ReturnAddress) | 49 #pragma intrinsic(_ReturnAddress) |
| 50 #endif | 50 #endif |
| 51 | 51 |
| 52 namespace base { | 52 namespace base { |
| 53 | 53 |
| 54 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) |
| 55 #define PROFILER_TEST_F(TestClass, TestName) TEST_F(TestClass, TestName) |
| 56 #else |
| 57 #define PROFILER_TEST_F(TestClass, TestName) \ |
| 58 TEST_F(TestClass, DISABLED_##TestName) |
| 59 #endif |
| 60 |
| 54 using SamplingParams = StackSamplingProfiler::SamplingParams; | 61 using SamplingParams = StackSamplingProfiler::SamplingParams; |
| 55 using Frame = StackSamplingProfiler::Frame; | 62 using Frame = StackSamplingProfiler::Frame; |
| 56 using Frames = std::vector<StackSamplingProfiler::Frame>; | 63 using Frames = std::vector<StackSamplingProfiler::Frame>; |
| 57 using Module = StackSamplingProfiler::Module; | 64 using Module = StackSamplingProfiler::Module; |
| 58 using Sample = StackSamplingProfiler::Sample; | 65 using Sample = StackSamplingProfiler::Sample; |
| 59 using CallStackProfile = StackSamplingProfiler::CallStackProfile; | 66 using CallStackProfile = StackSamplingProfiler::CallStackProfile; |
| 60 using CallStackProfiles = StackSamplingProfiler::CallStackProfiles; | 67 using CallStackProfiles = StackSamplingProfiler::CallStackProfiles; |
| 61 | 68 |
| 62 namespace { | 69 namespace { |
| 63 | 70 |
| (...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 // idle-shutdown behavior. | 651 // idle-shutdown behavior. |
| 645 StackSamplingProfiler::TestAPI::Reset(); | 652 StackSamplingProfiler::TestAPI::Reset(); |
| 646 } | 653 } |
| 647 }; | 654 }; |
| 648 | 655 |
| 649 } // namespace | 656 } // namespace |
| 650 | 657 |
| 651 // Checks that the basic expected information is present in a sampled call stack | 658 // Checks that the basic expected information is present in a sampled call stack |
| 652 // profile. | 659 // profile. |
| 653 // macOS ASAN is not yet supported - crbug.com/718628. | 660 // macOS ASAN is not yet supported - crbug.com/718628. |
| 654 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) && \ | 661 #if !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)) |
| 655 !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)) | |
| 656 #define MAYBE_Basic Basic | 662 #define MAYBE_Basic Basic |
| 657 #else | 663 #else |
| 658 #define MAYBE_Basic DISABLED_Basic | 664 #define MAYBE_Basic DISABLED_Basic |
| 659 #endif | 665 #endif |
| 660 TEST_F(StackSamplingProfilerTest, MAYBE_Basic) { | 666 PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_Basic) { |
| 661 SamplingParams params; | 667 SamplingParams params; |
| 662 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 668 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 663 params.samples_per_burst = 1; | 669 params.samples_per_burst = 1; |
| 664 | 670 |
| 665 std::vector<CallStackProfile> profiles; | 671 std::vector<CallStackProfile> profiles; |
| 666 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); | 672 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); |
| 667 | 673 |
| 668 // Check that the profile and samples sizes are correct, and the module | 674 // Check that the profile and samples sizes are correct, and the module |
| 669 // indices are in range. | 675 // indices are in range. |
| 670 ASSERT_EQ(1u, profiles.size()); | 676 ASSERT_EQ(1u, profiles.size()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 689 &TargetThread::SignalAndWaitUntilSignaled)) | 695 &TargetThread::SignalAndWaitUntilSignaled)) |
| 690 << " was not found in stack:\n" | 696 << " was not found in stack:\n" |
| 691 << FormatSampleForDiagnosticOutput(sample, profile.modules); | 697 << FormatSampleForDiagnosticOutput(sample, profile.modules); |
| 692 FilePath executable_path; | 698 FilePath executable_path; |
| 693 EXPECT_TRUE(PathService::Get(FILE_EXE, &executable_path)); | 699 EXPECT_TRUE(PathService::Get(FILE_EXE, &executable_path)); |
| 694 EXPECT_EQ(executable_path, | 700 EXPECT_EQ(executable_path, |
| 695 MakeAbsoluteFilePath(profile.modules[loc->module_index].filename)); | 701 MakeAbsoluteFilePath(profile.modules[loc->module_index].filename)); |
| 696 } | 702 } |
| 697 | 703 |
| 698 // Checks that annotations are recorded in samples. | 704 // Checks that annotations are recorded in samples. |
| 699 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 705 PROFILER_TEST_F(StackSamplingProfilerTest, Annotations) { |
| 700 #define MAYBE_Annotations Annotations | |
| 701 #else | |
| 702 #define MAYBE_Annotations DISABLED_Annotations | |
| 703 #endif | |
| 704 TEST_F(StackSamplingProfilerTest, MAYBE_Annotations) { | |
| 705 SamplingParams params; | 706 SamplingParams params; |
| 706 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 707 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 707 params.samples_per_burst = 1; | 708 params.samples_per_burst = 1; |
| 708 | 709 |
| 709 // Check that a run picks up annotations. | 710 // Check that a run picks up annotations. |
| 710 StackSamplingProfiler::SetProcessMilestone(1); | 711 StackSamplingProfiler::SetProcessMilestone(1); |
| 711 std::vector<CallStackProfile> profiles1; | 712 std::vector<CallStackProfile> profiles1; |
| 712 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles1); | 713 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles1); |
| 713 ASSERT_EQ(1u, profiles1.size()); | 714 ASSERT_EQ(1u, profiles1.size()); |
| 714 const CallStackProfile& profile1 = profiles1[0]; | 715 const CallStackProfile& profile1 = profiles1[0]; |
| 715 ASSERT_EQ(1u, profile1.samples.size()); | 716 ASSERT_EQ(1u, profile1.samples.size()); |
| 716 const Sample& sample1 = profile1.samples[0]; | 717 const Sample& sample1 = profile1.samples[0]; |
| 717 EXPECT_EQ(1u << 1, sample1.process_milestones); | 718 EXPECT_EQ(1u << 1, sample1.process_milestones); |
| 718 | 719 |
| 719 // Run it a second time but with changed annotations. These annotations | 720 // Run it a second time but with changed annotations. These annotations |
| 720 // should appear in the first acquired sample. | 721 // should appear in the first acquired sample. |
| 721 StackSamplingProfiler::SetProcessMilestone(2); | 722 StackSamplingProfiler::SetProcessMilestone(2); |
| 722 std::vector<CallStackProfile> profiles2; | 723 std::vector<CallStackProfile> profiles2; |
| 723 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles2); | 724 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles2); |
| 724 ASSERT_EQ(1u, profiles2.size()); | 725 ASSERT_EQ(1u, profiles2.size()); |
| 725 const CallStackProfile& profile2 = profiles2[0]; | 726 const CallStackProfile& profile2 = profiles2[0]; |
| 726 ASSERT_EQ(1u, profile2.samples.size()); | 727 ASSERT_EQ(1u, profile2.samples.size()); |
| 727 const Sample& sample2 = profile2.samples[0]; | 728 const Sample& sample2 = profile2.samples[0]; |
| 728 EXPECT_EQ(sample1.process_milestones | (1u << 2), sample2.process_milestones); | 729 EXPECT_EQ(sample1.process_milestones | (1u << 2), sample2.process_milestones); |
| 729 } | 730 } |
| 730 | 731 |
| 731 // Checks that the profiler handles stacks containing dynamically-allocated | 732 // Checks that the profiler handles stacks containing dynamically-allocated |
| 732 // stack memory. | 733 // stack memory. |
| 733 // macOS ASAN is not yet supported - crbug.com/718628. | 734 // macOS ASAN is not yet supported - crbug.com/718628. |
| 734 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) && \ | 735 #if !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)) |
| 735 !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)) | |
| 736 #define MAYBE_Alloca Alloca | 736 #define MAYBE_Alloca Alloca |
| 737 #else | 737 #else |
| 738 #define MAYBE_Alloca DISABLED_Alloca | 738 #define MAYBE_Alloca DISABLED_Alloca |
| 739 #endif | 739 #endif |
| 740 TEST_F(StackSamplingProfilerTest, MAYBE_Alloca) { | 740 PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_Alloca) { |
| 741 SamplingParams params; | 741 SamplingParams params; |
| 742 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 742 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 743 params.samples_per_burst = 1; | 743 params.samples_per_burst = 1; |
| 744 | 744 |
| 745 std::vector<CallStackProfile> profiles; | 745 std::vector<CallStackProfile> profiles; |
| 746 WithTargetThread( | 746 WithTargetThread( |
| 747 [¶ms, &profiles](PlatformThreadId target_thread_id) { | 747 [¶ms, &profiles](PlatformThreadId target_thread_id) { |
| 748 WaitableEvent sampling_thread_completed( | 748 WaitableEvent sampling_thread_completed( |
| 749 WaitableEvent::ResetPolicy::MANUAL, | 749 WaitableEvent::ResetPolicy::MANUAL, |
| 750 WaitableEvent::InitialState::NOT_SIGNALED); | 750 WaitableEvent::InitialState::NOT_SIGNALED); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 << FormatSampleForDiagnosticOutput(sample, profile.modules); | 785 << FormatSampleForDiagnosticOutput(sample, profile.modules); |
| 786 | 786 |
| 787 // These frames should be adjacent on the stack. | 787 // These frames should be adjacent on the stack. |
| 788 EXPECT_EQ(1, alloca_frame - end_frame) | 788 EXPECT_EQ(1, alloca_frame - end_frame) |
| 789 << "Stack:\n" | 789 << "Stack:\n" |
| 790 << FormatSampleForDiagnosticOutput(sample, profile.modules); | 790 << FormatSampleForDiagnosticOutput(sample, profile.modules); |
| 791 } | 791 } |
| 792 | 792 |
| 793 // Checks that the expected number of profiles and samples are present in the | 793 // Checks that the expected number of profiles and samples are present in the |
| 794 // call stack profiles produced. | 794 // call stack profiles produced. |
| 795 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 795 PROFILER_TEST_F(StackSamplingProfilerTest, MultipleProfilesAndSamples) { |
| 796 #define MAYBE_MultipleProfilesAndSamples MultipleProfilesAndSamples | |
| 797 #else | |
| 798 #define MAYBE_MultipleProfilesAndSamples DISABLED_MultipleProfilesAndSamples | |
| 799 #endif | |
| 800 TEST_F(StackSamplingProfilerTest, MAYBE_MultipleProfilesAndSamples) { | |
| 801 SamplingParams params; | 796 SamplingParams params; |
| 802 params.burst_interval = params.sampling_interval = | 797 params.burst_interval = params.sampling_interval = |
| 803 TimeDelta::FromMilliseconds(0); | 798 TimeDelta::FromMilliseconds(0); |
| 804 params.bursts = 2; | 799 params.bursts = 2; |
| 805 params.samples_per_burst = 3; | 800 params.samples_per_burst = 3; |
| 806 | 801 |
| 807 std::vector<CallStackProfile> profiles; | 802 std::vector<CallStackProfile> profiles; |
| 808 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); | 803 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); |
| 809 | 804 |
| 810 ASSERT_EQ(2u, profiles.size()); | 805 ASSERT_EQ(2u, profiles.size()); |
| 811 EXPECT_EQ(3u, profiles[0].samples.size()); | 806 EXPECT_EQ(3u, profiles[0].samples.size()); |
| 812 EXPECT_EQ(3u, profiles[1].samples.size()); | 807 EXPECT_EQ(3u, profiles[1].samples.size()); |
| 813 } | 808 } |
| 814 | 809 |
| 815 // Checks that a profiler can stop/destruct without ever having started. | 810 // Checks that a profiler can stop/destruct without ever having started. |
| 816 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 811 PROFILER_TEST_F(StackSamplingProfilerTest, StopWithoutStarting) { |
| 817 #define MAYBE_StopWithoutStarting StopWithoutStarting | |
| 818 #else | |
| 819 #define MAYBE_StopWithoutStarting DISABLED_StopWithoutStarting | |
| 820 #endif | |
| 821 TEST_F(StackSamplingProfilerTest, MAYBE_StopWithoutStarting) { | |
| 822 WithTargetThread([](PlatformThreadId target_thread_id) { | 812 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 823 SamplingParams params; | 813 SamplingParams params; |
| 824 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 814 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 825 params.samples_per_burst = 1; | 815 params.samples_per_burst = 1; |
| 826 | 816 |
| 827 CallStackProfiles profiles; | 817 CallStackProfiles profiles; |
| 828 WaitableEvent sampling_completed(WaitableEvent::ResetPolicy::MANUAL, | 818 WaitableEvent sampling_completed(WaitableEvent::ResetPolicy::MANUAL, |
| 829 WaitableEvent::InitialState::NOT_SIGNALED); | 819 WaitableEvent::InitialState::NOT_SIGNALED); |
| 830 const StackSamplingProfiler::CompletedCallback callback = | 820 const StackSamplingProfiler::CompletedCallback callback = |
| 831 Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles), | 821 Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles), |
| 832 Unretained(&sampling_completed)); | 822 Unretained(&sampling_completed)); |
| 833 StackSamplingProfiler profiler(target_thread_id, params, callback); | 823 StackSamplingProfiler profiler(target_thread_id, params, callback); |
| 834 | 824 |
| 835 profiler.Stop(); // Constructed but never started. | 825 profiler.Stop(); // Constructed but never started. |
| 836 EXPECT_FALSE(sampling_completed.IsSignaled()); | 826 EXPECT_FALSE(sampling_completed.IsSignaled()); |
| 837 }); | 827 }); |
| 838 } | 828 } |
| 839 | 829 |
| 840 // Checks that its okay to stop a profiler before it finishes even when the | 830 // Checks that its okay to stop a profiler before it finishes even when the |
| 841 // sampling thread continues to run. | 831 // sampling thread continues to run. |
| 842 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 832 PROFILER_TEST_F(StackSamplingProfilerTest, StopSafely) { |
| 843 #define MAYBE_StopSafely StopSafely | |
| 844 #else | |
| 845 #define MAYBE_StopSafely DISABLED_StopSafely | |
| 846 #endif | |
| 847 TEST_F(StackSamplingProfilerTest, MAYBE_StopSafely) { | |
| 848 // Test delegate that counts samples. | 833 // Test delegate that counts samples. |
| 849 class SampleRecordedCounter : public NativeStackSamplerTestDelegate { | 834 class SampleRecordedCounter : public NativeStackSamplerTestDelegate { |
| 850 public: | 835 public: |
| 851 SampleRecordedCounter() {} | 836 SampleRecordedCounter() {} |
| 852 | 837 |
| 853 void OnPreStackWalk() override { | 838 void OnPreStackWalk() override { |
| 854 AutoLock lock(lock_); | 839 AutoLock lock(lock_); |
| 855 ++count_; | 840 ++count_; |
| 856 } | 841 } |
| 857 | 842 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 912 while (samples_recorded[1].Get() < count1 + 2) | 897 while (samples_recorded[1].Get() < count1 + 2) |
| 913 PlatformThread::Sleep(TimeDelta::FromMilliseconds(1)); | 898 PlatformThread::Sleep(TimeDelta::FromMilliseconds(1)); |
| 914 | 899 |
| 915 // Ensure that the first profiler didn't do anything since it was stopped. | 900 // Ensure that the first profiler didn't do anything since it was stopped. |
| 916 EXPECT_EQ(count0, samples_recorded[0].Get()); | 901 EXPECT_EQ(count0, samples_recorded[0].Get()); |
| 917 }); | 902 }); |
| 918 } | 903 } |
| 919 | 904 |
| 920 // Checks that no call stack profiles are captured if the profiling is stopped | 905 // Checks that no call stack profiles are captured if the profiling is stopped |
| 921 // during the initial delay. | 906 // during the initial delay. |
| 922 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 907 PROFILER_TEST_F(StackSamplingProfilerTest, StopDuringInitialDelay) { |
| 923 #define MAYBE_StopDuringInitialDelay StopDuringInitialDelay | |
| 924 #else | |
| 925 #define MAYBE_StopDuringInitialDelay DISABLED_StopDuringInitialDelay | |
| 926 #endif | |
| 927 TEST_F(StackSamplingProfilerTest, MAYBE_StopDuringInitialDelay) { | |
| 928 SamplingParams params; | 908 SamplingParams params; |
| 929 params.initial_delay = TimeDelta::FromSeconds(60); | 909 params.initial_delay = TimeDelta::FromSeconds(60); |
| 930 | 910 |
| 931 std::vector<CallStackProfile> profiles; | 911 std::vector<CallStackProfile> profiles; |
| 932 CaptureProfiles(params, TimeDelta::FromMilliseconds(0), &profiles); | 912 CaptureProfiles(params, TimeDelta::FromMilliseconds(0), &profiles); |
| 933 | 913 |
| 934 EXPECT_TRUE(profiles.empty()); | 914 EXPECT_TRUE(profiles.empty()); |
| 935 } | 915 } |
| 936 | 916 |
| 937 // Checks that the single completed call stack profile is captured if the | 917 // Checks that the single completed call stack profile is captured if the |
| 938 // profiling is stopped between bursts. | 918 // profiling is stopped between bursts. |
| 939 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 919 PROFILER_TEST_F(StackSamplingProfilerTest, StopDuringInterBurstInterval) { |
| 940 #define MAYBE_StopDuringInterBurstInterval StopDuringInterBurstInterval | |
| 941 #else | |
| 942 #define MAYBE_StopDuringInterBurstInterval DISABLED_StopDuringInterBurstInterval | |
| 943 #endif | |
| 944 TEST_F(StackSamplingProfilerTest, MAYBE_StopDuringInterBurstInterval) { | |
| 945 SamplingParams params; | 920 SamplingParams params; |
| 946 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 921 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 947 params.burst_interval = TimeDelta::FromSeconds(60); | 922 params.burst_interval = TimeDelta::FromSeconds(60); |
| 948 params.bursts = 2; | 923 params.bursts = 2; |
| 949 params.samples_per_burst = 1; | 924 params.samples_per_burst = 1; |
| 950 | 925 |
| 951 std::vector<CallStackProfile> profiles; | 926 std::vector<CallStackProfile> profiles; |
| 952 CaptureProfiles(params, TimeDelta::FromMilliseconds(50), &profiles); | 927 CaptureProfiles(params, TimeDelta::FromMilliseconds(50), &profiles); |
| 953 | 928 |
| 954 ASSERT_EQ(1u, profiles.size()); | 929 ASSERT_EQ(1u, profiles.size()); |
| 955 EXPECT_EQ(1u, profiles[0].samples.size()); | 930 EXPECT_EQ(1u, profiles[0].samples.size()); |
| 956 } | 931 } |
| 957 | 932 |
| 958 // Checks that tasks can be stopped before completion and incomplete call stack | 933 // Checks that tasks can be stopped before completion and incomplete call stack |
| 959 // profiles are captured. | 934 // profiles are captured. |
| 960 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 935 PROFILER_TEST_F(StackSamplingProfilerTest, StopDuringInterSampleInterval) { |
| 961 #define MAYBE_StopDuringInterSampleInterval StopDuringInterSampleInterval | |
| 962 #else | |
| 963 #define MAYBE_StopDuringInterSampleInterval \ | |
| 964 DISABLED_StopDuringInterSampleInterval | |
| 965 #endif | |
| 966 TEST_F(StackSamplingProfilerTest, MAYBE_StopDuringInterSampleInterval) { | |
| 967 // Test delegate that counts samples. | 936 // Test delegate that counts samples. |
| 968 class SampleRecordedEvent : public NativeStackSamplerTestDelegate { | 937 class SampleRecordedEvent : public NativeStackSamplerTestDelegate { |
| 969 public: | 938 public: |
| 970 SampleRecordedEvent() | 939 SampleRecordedEvent() |
| 971 : sample_recorded_(WaitableEvent::ResetPolicy::MANUAL, | 940 : sample_recorded_(WaitableEvent::ResetPolicy::MANUAL, |
| 972 WaitableEvent::InitialState::NOT_SIGNALED) {} | 941 WaitableEvent::InitialState::NOT_SIGNALED) {} |
| 973 | 942 |
| 974 void OnPreStackWalk() override { sample_recorded_.Signal(); } | 943 void OnPreStackWalk() override { sample_recorded_.Signal(); } |
| 975 | 944 |
| 976 void WaitForSample() { sample_recorded_.Wait(); } | 945 void WaitForSample() { sample_recorded_.Wait(); } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 996 // Ensure that it can stop safely. | 965 // Ensure that it can stop safely. |
| 997 profiler_info.profiler.Stop(); | 966 profiler_info.profiler.Stop(); |
| 998 profiler_info.completed.Wait(); | 967 profiler_info.completed.Wait(); |
| 999 | 968 |
| 1000 ASSERT_EQ(1u, profiler_info.profiles.size()); | 969 ASSERT_EQ(1u, profiler_info.profiles.size()); |
| 1001 EXPECT_EQ(1u, profiler_info.profiles[0].samples.size()); | 970 EXPECT_EQ(1u, profiler_info.profiles[0].samples.size()); |
| 1002 }); | 971 }); |
| 1003 } | 972 } |
| 1004 | 973 |
| 1005 // Checks that we can destroy the profiler while profiling. | 974 // Checks that we can destroy the profiler while profiling. |
| 1006 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 975 PROFILER_TEST_F(StackSamplingProfilerTest, DestroyProfilerWhileProfiling) { |
| 1007 #define MAYBE_DestroyProfilerWhileProfiling DestroyProfilerWhileProfiling | |
| 1008 #else | |
| 1009 #define MAYBE_DestroyProfilerWhileProfiling \ | |
| 1010 DISABLED_DestroyProfilerWhileProfiling | |
| 1011 #endif | |
| 1012 TEST_F(StackSamplingProfilerTest, MAYBE_DestroyProfilerWhileProfiling) { | |
| 1013 SamplingParams params; | 976 SamplingParams params; |
| 1014 params.sampling_interval = TimeDelta::FromMilliseconds(10); | 977 params.sampling_interval = TimeDelta::FromMilliseconds(10); |
| 1015 | 978 |
| 1016 CallStackProfiles profiles; | 979 CallStackProfiles profiles; |
| 1017 WithTargetThread([¶ms, &profiles](PlatformThreadId target_thread_id) { | 980 WithTargetThread([¶ms, &profiles](PlatformThreadId target_thread_id) { |
| 1018 std::unique_ptr<StackSamplingProfiler> profiler; | 981 std::unique_ptr<StackSamplingProfiler> profiler; |
| 1019 profiler.reset(new StackSamplingProfiler( | 982 profiler.reset(new StackSamplingProfiler( |
| 1020 target_thread_id, params, Bind(&SaveProfiles, Unretained(&profiles)))); | 983 target_thread_id, params, Bind(&SaveProfiles, Unretained(&profiles)))); |
| 1021 profiler->Start(); | 984 profiler->Start(); |
| 1022 profiler.reset(); | 985 profiler.reset(); |
| 1023 | 986 |
| 1024 // Wait longer than a sample interval to catch any use-after-free actions by | 987 // Wait longer than a sample interval to catch any use-after-free actions by |
| 1025 // the profiler thread. | 988 // the profiler thread. |
| 1026 PlatformThread::Sleep(TimeDelta::FromMilliseconds(50)); | 989 PlatformThread::Sleep(TimeDelta::FromMilliseconds(50)); |
| 1027 }); | 990 }); |
| 1028 } | 991 } |
| 1029 | 992 |
| 1030 // Checks that the same profiler may be run multiple times. | 993 // Checks that the same profiler may be run multiple times. |
| 1031 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 994 PROFILER_TEST_F(StackSamplingProfilerTest, CanRunMultipleTimes) { |
| 1032 #define MAYBE_CanRunMultipleTimes CanRunMultipleTimes | |
| 1033 #else | |
| 1034 #define MAYBE_CanRunMultipleTimes DISABLED_CanRunMultipleTimes | |
| 1035 #endif | |
| 1036 TEST_F(StackSamplingProfilerTest, MAYBE_CanRunMultipleTimes) { | |
| 1037 WithTargetThread([](PlatformThreadId target_thread_id) { | 995 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 1038 SamplingParams params; | 996 SamplingParams params; |
| 1039 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 997 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 1040 params.samples_per_burst = 1; | 998 params.samples_per_burst = 1; |
| 1041 | 999 |
| 1042 CallStackProfiles profiles; | 1000 CallStackProfiles profiles; |
| 1043 WaitableEvent sampling_completed(WaitableEvent::ResetPolicy::MANUAL, | 1001 WaitableEvent sampling_completed(WaitableEvent::ResetPolicy::MANUAL, |
| 1044 WaitableEvent::InitialState::NOT_SIGNALED); | 1002 WaitableEvent::InitialState::NOT_SIGNALED); |
| 1045 const StackSamplingProfiler::CompletedCallback callback = | 1003 const StackSamplingProfiler::CompletedCallback callback = |
| 1046 Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles), | 1004 Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles), |
| 1047 Unretained(&sampling_completed)); | 1005 Unretained(&sampling_completed)); |
| 1048 StackSamplingProfiler profiler(target_thread_id, params, callback); | 1006 StackSamplingProfiler profiler(target_thread_id, params, callback); |
| 1049 | 1007 |
| 1050 // Just start and stop to execute code paths. | 1008 // Just start and stop to execute code paths. |
| 1051 profiler.Start(); | 1009 profiler.Start(); |
| 1052 profiler.Stop(); | 1010 profiler.Stop(); |
| 1053 sampling_completed.Wait(); | 1011 sampling_completed.Wait(); |
| 1054 | 1012 |
| 1055 // Ensure a second request will run and not block. | 1013 // Ensure a second request will run and not block. |
| 1056 sampling_completed.Reset(); | 1014 sampling_completed.Reset(); |
| 1057 profiles.clear(); | 1015 profiles.clear(); |
| 1058 profiler.Start(); | 1016 profiler.Start(); |
| 1059 sampling_completed.Wait(); | 1017 sampling_completed.Wait(); |
| 1060 profiler.Stop(); | 1018 profiler.Stop(); |
| 1061 ASSERT_EQ(1u, profiles.size()); | 1019 ASSERT_EQ(1u, profiles.size()); |
| 1062 }); | 1020 }); |
| 1063 } | 1021 } |
| 1064 | 1022 |
| 1065 // Checks that the different profilers may be run. | 1023 // Checks that the different profilers may be run. |
| 1066 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1024 PROFILER_TEST_F(StackSamplingProfilerTest, CanRunMultipleProfilers) { |
| 1067 #define MAYBE_CanRunMultipleProfilers CanRunMultipleProfilers | |
| 1068 #else | |
| 1069 #define MAYBE_CanRunMultipleProfilers DISABLED_CanRunMultipleProfilers | |
| 1070 #endif | |
| 1071 TEST_F(StackSamplingProfilerTest, MAYBE_CanRunMultipleProfilers) { | |
| 1072 SamplingParams params; | 1025 SamplingParams params; |
| 1073 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 1026 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 1074 params.samples_per_burst = 1; | 1027 params.samples_per_burst = 1; |
| 1075 | 1028 |
| 1076 std::vector<CallStackProfile> profiles; | 1029 std::vector<CallStackProfile> profiles; |
| 1077 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); | 1030 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); |
| 1078 ASSERT_EQ(1u, profiles.size()); | 1031 ASSERT_EQ(1u, profiles.size()); |
| 1079 | 1032 |
| 1080 profiles.clear(); | 1033 profiles.clear(); |
| 1081 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); | 1034 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); |
| 1082 ASSERT_EQ(1u, profiles.size()); | 1035 ASSERT_EQ(1u, profiles.size()); |
| 1083 } | 1036 } |
| 1084 | 1037 |
| 1085 // Checks that a sampler can be started while another is running. | 1038 // Checks that a sampler can be started while another is running. |
| 1086 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1039 PROFILER_TEST_F(StackSamplingProfilerTest, MultipleStart) { |
| 1087 #define MAYBE_MultipleStart MultipleStart | |
| 1088 #else | |
| 1089 #define MAYBE_MultipleStart DISABLED_MultipleStart | |
| 1090 #endif | |
| 1091 TEST_F(StackSamplingProfilerTest, MAYBE_MultipleStart) { | |
| 1092 WithTargetThread([](PlatformThreadId target_thread_id) { | 1040 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 1093 std::vector<SamplingParams> params(2); | 1041 std::vector<SamplingParams> params(2); |
| 1094 | 1042 |
| 1095 params[0].initial_delay = AVeryLongTimeDelta(); | 1043 params[0].initial_delay = AVeryLongTimeDelta(); |
| 1096 params[0].samples_per_burst = 1; | 1044 params[0].samples_per_burst = 1; |
| 1097 | 1045 |
| 1098 params[1].sampling_interval = TimeDelta::FromMilliseconds(1); | 1046 params[1].sampling_interval = TimeDelta::FromMilliseconds(1); |
| 1099 params[1].samples_per_burst = 1; | 1047 params[1].samples_per_burst = 1; |
| 1100 | 1048 |
| 1101 std::vector<std::unique_ptr<TestProfilerInfo>> profiler_infos = | 1049 std::vector<std::unique_ptr<TestProfilerInfo>> profiler_infos = |
| 1102 CreateProfilers(target_thread_id, params); | 1050 CreateProfilers(target_thread_id, params); |
| 1103 | 1051 |
| 1104 profiler_infos[0]->profiler.Start(); | 1052 profiler_infos[0]->profiler.Start(); |
| 1105 profiler_infos[1]->profiler.Start(); | 1053 profiler_infos[1]->profiler.Start(); |
| 1106 profiler_infos[1]->completed.Wait(); | 1054 profiler_infos[1]->completed.Wait(); |
| 1107 EXPECT_EQ(1u, profiler_infos[1]->profiles.size()); | 1055 EXPECT_EQ(1u, profiler_infos[1]->profiles.size()); |
| 1108 }); | 1056 }); |
| 1109 } | 1057 } |
| 1110 | 1058 |
| 1111 // Checks that the sampling thread can shut down. | 1059 // Checks that the sampling thread can shut down. |
| 1112 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1060 PROFILER_TEST_F(StackSamplingProfilerTest, SamplerIdleShutdown) { |
| 1113 #define MAYBE_SamplerIdleShutdown SamplerIdleShutdown | |
| 1114 #else | |
| 1115 #define MAYBE_SamplerIdleShutdown DISABLED_SamplerIdleShutdown | |
| 1116 #endif | |
| 1117 TEST_F(StackSamplingProfilerTest, MAYBE_SamplerIdleShutdown) { | |
| 1118 SamplingParams params; | 1061 SamplingParams params; |
| 1119 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 1062 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 1120 params.samples_per_burst = 1; | 1063 params.samples_per_burst = 1; |
| 1121 | 1064 |
| 1122 std::vector<CallStackProfile> profiles; | 1065 std::vector<CallStackProfile> profiles; |
| 1123 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); | 1066 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); |
| 1124 ASSERT_EQ(1u, profiles.size()); | 1067 ASSERT_EQ(1u, profiles.size()); |
| 1125 | 1068 |
| 1126 // Capture thread should still be running at this point. | 1069 // Capture thread should still be running at this point. |
| 1127 ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); | 1070 ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); |
| 1128 | 1071 |
| 1129 // Initiate an "idle" shutdown and ensure it happens. Idle-shutdown was | 1072 // Initiate an "idle" shutdown and ensure it happens. Idle-shutdown was |
| 1130 // disabled by the test fixture so the test will fail due to a timeout if | 1073 // disabled by the test fixture so the test will fail due to a timeout if |
| 1131 // it does not exit. | 1074 // it does not exit. |
| 1132 StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false); | 1075 StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false); |
| 1133 | 1076 |
| 1134 // While the shutdown has been initiated, the actual exit of the thread still | 1077 // While the shutdown has been initiated, the actual exit of the thread still |
| 1135 // happens asynchronously. Watch until the thread actually exits. This test | 1078 // happens asynchronously. Watch until the thread actually exits. This test |
| 1136 // will time-out in the case of failure. | 1079 // will time-out in the case of failure. |
| 1137 while (StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()) | 1080 while (StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()) |
| 1138 PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); | 1081 PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); |
| 1139 } | 1082 } |
| 1140 | 1083 |
| 1141 // Checks that additional requests will restart a stopped profiler. | 1084 // Checks that additional requests will restart a stopped profiler. |
| 1142 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1085 PROFILER_TEST_F(StackSamplingProfilerTest, |
| 1143 #define MAYBE_WillRestartSamplerAfterIdleShutdown \ | 1086 WillRestartSamplerAfterIdleShutdown) { |
| 1144 WillRestartSamplerAfterIdleShutdown | |
| 1145 #else | |
| 1146 #define MAYBE_WillRestartSamplerAfterIdleShutdown \ | |
| 1147 DISABLED_WillRestartSamplerAfterIdleShutdown | |
| 1148 #endif | |
| 1149 TEST_F(StackSamplingProfilerTest, MAYBE_WillRestartSamplerAfterIdleShutdown) { | |
| 1150 SamplingParams params; | 1087 SamplingParams params; |
| 1151 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 1088 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 1152 params.samples_per_burst = 1; | 1089 params.samples_per_burst = 1; |
| 1153 | 1090 |
| 1154 std::vector<CallStackProfile> profiles; | 1091 std::vector<CallStackProfile> profiles; |
| 1155 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); | 1092 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); |
| 1156 ASSERT_EQ(1u, profiles.size()); | 1093 ASSERT_EQ(1u, profiles.size()); |
| 1157 | 1094 |
| 1158 // Capture thread should still be running at this point. | 1095 // Capture thread should still be running at this point. |
| 1159 ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); | 1096 ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); |
| 1160 | 1097 |
| 1161 // Post a ShutdownTask on the sampling thread which, when executed, will | 1098 // Post a ShutdownTask on the sampling thread which, when executed, will |
| 1162 // mark the thread as EXITING and begin shut down of the thread. | 1099 // mark the thread as EXITING and begin shut down of the thread. |
| 1163 StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false); | 1100 StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false); |
| 1164 | 1101 |
| 1165 // Ensure another capture will start the sampling thread and run. | 1102 // Ensure another capture will start the sampling thread and run. |
| 1166 profiles.clear(); | 1103 profiles.clear(); |
| 1167 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); | 1104 CaptureProfiles(params, AVeryLongTimeDelta(), &profiles); |
| 1168 ASSERT_EQ(1u, profiles.size()); | 1105 ASSERT_EQ(1u, profiles.size()); |
| 1169 EXPECT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); | 1106 EXPECT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); |
| 1170 } | 1107 } |
| 1171 | 1108 |
| 1172 // Checks that it's safe to stop a task after it's completed and the sampling | 1109 // Checks that it's safe to stop a task after it's completed and the sampling |
| 1173 // thread has shut-down for being idle. | 1110 // thread has shut-down for being idle. |
| 1174 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1111 PROFILER_TEST_F(StackSamplingProfilerTest, StopAfterIdleShutdown) { |
| 1175 #define MAYBE_StopAfterIdleShutdown StopAfterIdleShutdown | |
| 1176 #else | |
| 1177 #define MAYBE_StopAfterIdleShutdown DISABLED_StopAfterIdleShutdown | |
| 1178 #endif | |
| 1179 TEST_F(StackSamplingProfilerTest, MAYBE_StopAfterIdleShutdown) { | |
| 1180 WithTargetThread([](PlatformThreadId target_thread_id) { | 1112 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 1181 SamplingParams params; | 1113 SamplingParams params; |
| 1182 | 1114 |
| 1183 params.sampling_interval = TimeDelta::FromMilliseconds(1); | 1115 params.sampling_interval = TimeDelta::FromMilliseconds(1); |
| 1184 params.samples_per_burst = 1; | 1116 params.samples_per_burst = 1; |
| 1185 | 1117 |
| 1186 TestProfilerInfo profiler_info(target_thread_id, params); | 1118 TestProfilerInfo profiler_info(target_thread_id, params); |
| 1187 | 1119 |
| 1188 profiler_info.profiler.Start(); | 1120 profiler_info.profiler.Start(); |
| 1189 profiler_info.completed.Wait(); | 1121 profiler_info.completed.Wait(); |
| 1190 | 1122 |
| 1191 // Capture thread should still be running at this point. | 1123 // Capture thread should still be running at this point. |
| 1192 ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); | 1124 ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); |
| 1193 | 1125 |
| 1194 // Perform an idle shutdown. | 1126 // Perform an idle shutdown. |
| 1195 StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false); | 1127 StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false); |
| 1196 | 1128 |
| 1197 // Stop should be safe though its impossible to know at this moment if the | 1129 // Stop should be safe though its impossible to know at this moment if the |
| 1198 // sampling thread has completely exited or will just "stop soon". | 1130 // sampling thread has completely exited or will just "stop soon". |
| 1199 profiler_info.profiler.Stop(); | 1131 profiler_info.profiler.Stop(); |
| 1200 }); | 1132 }); |
| 1201 } | 1133 } |
| 1202 | 1134 |
| 1203 // Checks that profilers can run both before and after the sampling thread has | 1135 // Checks that profilers can run both before and after the sampling thread has |
| 1204 // started. | 1136 // started. |
| 1205 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1137 PROFILER_TEST_F(StackSamplingProfilerTest, |
| 1206 #define MAYBE_ProfileBeforeAndAfterSamplingThreadRunning \ | 1138 ProfileBeforeAndAfterSamplingThreadRunning) { |
| 1207 ProfileBeforeAndAfterSamplingThreadRunning | |
| 1208 #else | |
| 1209 #define MAYBE_ProfileBeforeAndAfterSamplingThreadRunning \ | |
| 1210 DISABLED_ProfileBeforeAndAfterSamplingThreadRunning | |
| 1211 #endif | |
| 1212 TEST_F(StackSamplingProfilerTest, | |
| 1213 MAYBE_ProfileBeforeAndAfterSamplingThreadRunning) { | |
| 1214 WithTargetThread([](PlatformThreadId target_thread_id) { | 1139 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 1215 std::vector<SamplingParams> params(2); | 1140 std::vector<SamplingParams> params(2); |
| 1216 | 1141 |
| 1217 params[0].initial_delay = AVeryLongTimeDelta(); | 1142 params[0].initial_delay = AVeryLongTimeDelta(); |
| 1218 params[0].sampling_interval = TimeDelta::FromMilliseconds(1); | 1143 params[0].sampling_interval = TimeDelta::FromMilliseconds(1); |
| 1219 params[0].samples_per_burst = 1; | 1144 params[0].samples_per_burst = 1; |
| 1220 | 1145 |
| 1221 params[1].initial_delay = TimeDelta::FromMilliseconds(0); | 1146 params[1].initial_delay = TimeDelta::FromMilliseconds(0); |
| 1222 params[1].sampling_interval = TimeDelta::FromMilliseconds(1); | 1147 params[1].sampling_interval = TimeDelta::FromMilliseconds(1); |
| 1223 params[1].samples_per_burst = 1; | 1148 params[1].samples_per_burst = 1; |
| 1224 | 1149 |
| 1225 std::vector<std::unique_ptr<TestProfilerInfo>> profiler_infos = | 1150 std::vector<std::unique_ptr<TestProfilerInfo>> profiler_infos = |
| 1226 CreateProfilers(target_thread_id, params); | 1151 CreateProfilers(target_thread_id, params); |
| 1227 | 1152 |
| 1228 // First profiler is started when there has never been a sampling thread. | 1153 // First profiler is started when there has never been a sampling thread. |
| 1229 EXPECT_FALSE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); | 1154 EXPECT_FALSE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); |
| 1230 profiler_infos[0]->profiler.Start(); | 1155 profiler_infos[0]->profiler.Start(); |
| 1231 // Second profiler is started when sampling thread is already running. | 1156 // Second profiler is started when sampling thread is already running. |
| 1232 EXPECT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); | 1157 EXPECT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning()); |
| 1233 profiler_infos[1]->profiler.Start(); | 1158 profiler_infos[1]->profiler.Start(); |
| 1234 | 1159 |
| 1235 // Only the second profiler should finish before test times out. | 1160 // Only the second profiler should finish before test times out. |
| 1236 size_t completed_profiler = WaitForSamplingComplete(profiler_infos); | 1161 size_t completed_profiler = WaitForSamplingComplete(profiler_infos); |
| 1237 EXPECT_EQ(1U, completed_profiler); | 1162 EXPECT_EQ(1U, completed_profiler); |
| 1238 }); | 1163 }); |
| 1239 } | 1164 } |
| 1240 | 1165 |
| 1241 // Checks that an idle-shutdown task will abort if a new profiler starts | 1166 // Checks that an idle-shutdown task will abort if a new profiler starts |
| 1242 // between when it was posted and when it runs. | 1167 // between when it was posted and when it runs. |
| 1243 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1168 PROFILER_TEST_F(StackSamplingProfilerTest, IdleShutdownAbort) { |
| 1244 #define MAYBE_IdleShutdownAbort IdleShutdownAbort | |
| 1245 #else | |
| 1246 #define MAYBE_IdleShutdownAbort DISABLED_IdleShutdownAbort | |
| 1247 #endif | |
| 1248 TEST_F(StackSamplingProfilerTest, MAYBE_IdleShutdownAbort) { | |
| 1249 WithTargetThread([](PlatformThreadId target_thread_id) { | 1169 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 1250 SamplingParams params; | 1170 SamplingParams params; |
| 1251 | 1171 |
| 1252 params.sampling_interval = TimeDelta::FromMilliseconds(1); | 1172 params.sampling_interval = TimeDelta::FromMilliseconds(1); |
| 1253 params.samples_per_burst = 1; | 1173 params.samples_per_burst = 1; |
| 1254 | 1174 |
| 1255 TestProfilerInfo profiler_info(target_thread_id, params); | 1175 TestProfilerInfo profiler_info(target_thread_id, params); |
| 1256 | 1176 |
| 1257 profiler_info.profiler.Start(); | 1177 profiler_info.profiler.Start(); |
| 1258 profiler_info.completed.Wait(); | 1178 profiler_info.completed.Wait(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1272 | 1192 |
| 1273 // Ensure that it's still possible to run another sampler. | 1193 // Ensure that it's still possible to run another sampler. |
| 1274 TestProfilerInfo another_info(target_thread_id, params); | 1194 TestProfilerInfo another_info(target_thread_id, params); |
| 1275 another_info.profiler.Start(); | 1195 another_info.profiler.Start(); |
| 1276 another_info.completed.Wait(); | 1196 another_info.completed.Wait(); |
| 1277 EXPECT_EQ(1u, another_info.profiles.size()); | 1197 EXPECT_EQ(1u, another_info.profiles.size()); |
| 1278 }); | 1198 }); |
| 1279 } | 1199 } |
| 1280 | 1200 |
| 1281 // Checks that synchronized multiple sampling requests execute in parallel. | 1201 // Checks that synchronized multiple sampling requests execute in parallel. |
| 1282 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1202 PROFILER_TEST_F(StackSamplingProfilerTest, ConcurrentProfiling_InSync) { |
| 1283 #define MAYBE_ConcurrentProfiling_InSync ConcurrentProfiling_InSync | |
| 1284 #else | |
| 1285 #define MAYBE_ConcurrentProfiling_InSync DISABLED_ConcurrentProfiling_InSync | |
| 1286 #endif | |
| 1287 TEST_F(StackSamplingProfilerTest, MAYBE_ConcurrentProfiling_InSync) { | |
| 1288 WithTargetThread([](PlatformThreadId target_thread_id) { | 1203 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 1289 std::vector<SamplingParams> params(2); | 1204 std::vector<SamplingParams> params(2); |
| 1290 | 1205 |
| 1291 // Providing an initial delay makes it more likely that both will be | 1206 // Providing an initial delay makes it more likely that both will be |
| 1292 // scheduled before either starts to run. Once started, samples will | 1207 // scheduled before either starts to run. Once started, samples will |
| 1293 // run ordered by their scheduled, interleaved times regardless of | 1208 // run ordered by their scheduled, interleaved times regardless of |
| 1294 // whatever interval the thread wakes up. Thus, total execution time | 1209 // whatever interval the thread wakes up. Thus, total execution time |
| 1295 // will be 10ms (delay) + 10x1ms (sampling) + 1/2 timer minimum interval. | 1210 // will be 10ms (delay) + 10x1ms (sampling) + 1/2 timer minimum interval. |
| 1296 params[0].initial_delay = TimeDelta::FromMilliseconds(10); | 1211 params[0].initial_delay = TimeDelta::FromMilliseconds(10); |
| 1297 params[0].sampling_interval = TimeDelta::FromMilliseconds(1); | 1212 params[0].sampling_interval = TimeDelta::FromMilliseconds(1); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1316 profiler_infos[other_profiler]->completed.Wait(); | 1231 profiler_infos[other_profiler]->completed.Wait(); |
| 1317 ASSERT_EQ(1u, profiler_infos[other_profiler]->profiles.size()); | 1232 ASSERT_EQ(1u, profiler_infos[other_profiler]->profiles.size()); |
| 1318 | 1233 |
| 1319 // Ensure each got the correct number of samples. | 1234 // Ensure each got the correct number of samples. |
| 1320 EXPECT_EQ(9u, profiler_infos[0]->profiles[0].samples.size()); | 1235 EXPECT_EQ(9u, profiler_infos[0]->profiles[0].samples.size()); |
| 1321 EXPECT_EQ(8u, profiler_infos[1]->profiles[0].samples.size()); | 1236 EXPECT_EQ(8u, profiler_infos[1]->profiles[0].samples.size()); |
| 1322 }); | 1237 }); |
| 1323 } | 1238 } |
| 1324 | 1239 |
| 1325 // Checks that several mixed sampling requests execute in parallel. | 1240 // Checks that several mixed sampling requests execute in parallel. |
| 1326 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1241 PROFILER_TEST_F(StackSamplingProfilerTest, ConcurrentProfiling_Mixed) { |
| 1327 #define MAYBE_ConcurrentProfiling_Mixed ConcurrentProfiling_Mixed | |
| 1328 #else | |
| 1329 #define MAYBE_ConcurrentProfiling_Mixed DISABLED_ConcurrentProfiling_Mixed | |
| 1330 #endif | |
| 1331 TEST_F(StackSamplingProfilerTest, MAYBE_ConcurrentProfiling_Mixed) { | |
| 1332 WithTargetThread([](PlatformThreadId target_thread_id) { | 1242 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 1333 std::vector<SamplingParams> params(3); | 1243 std::vector<SamplingParams> params(3); |
| 1334 | 1244 |
| 1335 params[0].initial_delay = TimeDelta::FromMilliseconds(8); | 1245 params[0].initial_delay = TimeDelta::FromMilliseconds(8); |
| 1336 params[0].sampling_interval = TimeDelta::FromMilliseconds(4); | 1246 params[0].sampling_interval = TimeDelta::FromMilliseconds(4); |
| 1337 params[0].samples_per_burst = 10; | 1247 params[0].samples_per_burst = 10; |
| 1338 | 1248 |
| 1339 params[1].initial_delay = TimeDelta::FromMilliseconds(9); | 1249 params[1].initial_delay = TimeDelta::FromMilliseconds(9); |
| 1340 params[1].sampling_interval = TimeDelta::FromMilliseconds(3); | 1250 params[1].sampling_interval = TimeDelta::FromMilliseconds(3); |
| 1341 params[1].samples_per_burst = 10; | 1251 params[1].samples_per_burst = 10; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1357 for (size_t i = 0; i < profiler_infos.size(); ++i) | 1267 for (size_t i = 0; i < profiler_infos.size(); ++i) |
| 1358 profiler_infos[i]->profiler.Stop(); | 1268 profiler_infos[i]->profiler.Stop(); |
| 1359 for (size_t i = 0; i < profiler_infos.size(); ++i) | 1269 for (size_t i = 0; i < profiler_infos.size(); ++i) |
| 1360 profiler_infos[i].reset(); | 1270 profiler_infos[i].reset(); |
| 1361 }); | 1271 }); |
| 1362 } | 1272 } |
| 1363 | 1273 |
| 1364 // Checks that a stack that runs through another library produces a stack with | 1274 // Checks that a stack that runs through another library produces a stack with |
| 1365 // the expected functions. | 1275 // the expected functions. |
| 1366 // macOS ASAN is not yet supported - crbug.com/718628. | 1276 // macOS ASAN is not yet supported - crbug.com/718628. |
| 1367 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) && \ | 1277 #if !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)) |
| 1368 !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)) | |
| 1369 #define MAYBE_OtherLibrary OtherLibrary | 1278 #define MAYBE_OtherLibrary OtherLibrary |
| 1370 #else | 1279 #else |
| 1371 #define MAYBE_OtherLibrary DISABLED_OtherLibrary | 1280 #define MAYBE_OtherLibrary DISABLED_OtherLibrary |
| 1372 #endif | 1281 #endif |
| 1373 TEST_F(StackSamplingProfilerTest, MAYBE_OtherLibrary) { | 1282 PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_OtherLibrary) { |
| 1374 SamplingParams params; | 1283 SamplingParams params; |
| 1375 params.sampling_interval = TimeDelta::FromMilliseconds(0); | 1284 params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| 1376 params.samples_per_burst = 1; | 1285 params.samples_per_burst = 1; |
| 1377 | 1286 |
| 1378 std::vector<CallStackProfile> profiles; | 1287 std::vector<CallStackProfile> profiles; |
| 1379 { | 1288 { |
| 1380 ScopedNativeLibrary other_library(LoadOtherLibrary()); | 1289 ScopedNativeLibrary other_library(LoadOtherLibrary()); |
| 1381 WithTargetThread( | 1290 WithTargetThread( |
| 1382 [¶ms, &profiles](PlatformThreadId target_thread_id) { | 1291 [¶ms, &profiles](PlatformThreadId target_thread_id) { |
| 1383 WaitableEvent sampling_thread_completed( | 1292 WaitableEvent sampling_thread_completed( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1430 // TargetThread::OtherLibraryCallback | 1339 // TargetThread::OtherLibraryCallback |
| 1431 // InvokeCallbackFunction (in other library) | 1340 // InvokeCallbackFunction (in other library) |
| 1432 // TargetThread::CallThroughOtherLibrary | 1341 // TargetThread::CallThroughOtherLibrary |
| 1433 EXPECT_EQ(3, other_library_frame - end_frame) | 1342 EXPECT_EQ(3, other_library_frame - end_frame) |
| 1434 << "Stack:\n" << FormatSampleForDiagnosticOutput(sample, profile.modules); | 1343 << "Stack:\n" << FormatSampleForDiagnosticOutput(sample, profile.modules); |
| 1435 } | 1344 } |
| 1436 | 1345 |
| 1437 // Checks that a stack that runs through a library that is unloading produces a | 1346 // Checks that a stack that runs through a library that is unloading produces a |
| 1438 // stack, and doesn't crash. | 1347 // stack, and doesn't crash. |
| 1439 // Unloading is synchronous on the Mac, so this test is inapplicable. | 1348 // Unloading is synchronous on the Mac, so this test is inapplicable. |
| 1440 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) && !defined(OS_MACOSX) | 1349 #if !defined(OS_MACOSX) |
| 1441 #define MAYBE_UnloadingLibrary UnloadingLibrary | 1350 #define MAYBE_UnloadingLibrary UnloadingLibrary |
| 1442 #else | 1351 #else |
| 1443 #define MAYBE_UnloadingLibrary DISABLED_UnloadingLibrary | 1352 #define MAYBE_UnloadingLibrary DISABLED_UnloadingLibrary |
| 1444 #endif | 1353 #endif |
| 1445 TEST_F(StackSamplingProfilerTest, MAYBE_UnloadingLibrary) { | 1354 PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_UnloadingLibrary) { |
| 1446 TestLibraryUnload(false); | 1355 TestLibraryUnload(false); |
| 1447 } | 1356 } |
| 1448 | 1357 |
| 1449 // Checks that a stack that runs through a library that has been unloaded | 1358 // Checks that a stack that runs through a library that has been unloaded |
| 1450 // produces a stack, and doesn't crash. | 1359 // produces a stack, and doesn't crash. |
| 1451 // macOS ASAN is not yet supported - crbug.com/718628. | 1360 // macOS ASAN is not yet supported - crbug.com/718628. |
| 1452 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) && \ | 1361 #if !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)) |
| 1453 !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)) | |
| 1454 #define MAYBE_UnloadedLibrary UnloadedLibrary | 1362 #define MAYBE_UnloadedLibrary UnloadedLibrary |
| 1455 #else | 1363 #else |
| 1456 #define MAYBE_UnloadedLibrary DISABLED_UnloadedLibrary | 1364 #define MAYBE_UnloadedLibrary DISABLED_UnloadedLibrary |
| 1457 #endif | 1365 #endif |
| 1458 TEST_F(StackSamplingProfilerTest, MAYBE_UnloadedLibrary) { | 1366 PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_UnloadedLibrary) { |
| 1459 TestLibraryUnload(true); | 1367 TestLibraryUnload(true); |
| 1460 } | 1368 } |
| 1461 | 1369 |
| 1462 // Checks that different threads can be sampled in parallel. | 1370 // Checks that different threads can be sampled in parallel. |
| 1463 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1371 PROFILER_TEST_F(StackSamplingProfilerTest, MultipleSampledThreads) { |
| 1464 #define MAYBE_MultipleSampledThreads MultipleSampledThreads | |
| 1465 #else | |
| 1466 #define MAYBE_MultipleSampledThreads DISABLED_MultipleSampledThreads | |
| 1467 #endif | |
| 1468 TEST_F(StackSamplingProfilerTest, MAYBE_MultipleSampledThreads) { | |
| 1469 // Create target threads. The extra parethesis around the StackConfiguration | 1372 // Create target threads. The extra parethesis around the StackConfiguration |
| 1470 // call are to avoid the most-vexing-parse problem. | 1373 // call are to avoid the most-vexing-parse problem. |
| 1471 TargetThread target_thread1((StackConfiguration(StackConfiguration::NORMAL))); | 1374 TargetThread target_thread1((StackConfiguration(StackConfiguration::NORMAL))); |
| 1472 TargetThread target_thread2((StackConfiguration(StackConfiguration::NORMAL))); | 1375 TargetThread target_thread2((StackConfiguration(StackConfiguration::NORMAL))); |
| 1473 PlatformThreadHandle target_thread_handle1, target_thread_handle2; | 1376 PlatformThreadHandle target_thread_handle1, target_thread_handle2; |
| 1474 EXPECT_TRUE( | 1377 EXPECT_TRUE( |
| 1475 PlatformThread::Create(0, &target_thread1, &target_thread_handle1)); | 1378 PlatformThread::Create(0, &target_thread1, &target_thread_handle1)); |
| 1476 EXPECT_TRUE( | 1379 EXPECT_TRUE( |
| 1477 PlatformThread::Create(0, &target_thread2, &target_thread_handle2)); | 1380 PlatformThread::Create(0, &target_thread2, &target_thread_handle2)); |
| 1478 target_thread1.WaitForThreadStart(); | 1381 target_thread1.WaitForThreadStart(); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1554 | 1457 |
| 1555 private: | 1458 private: |
| 1556 WaitableEvent run_; | 1459 WaitableEvent run_; |
| 1557 | 1460 |
| 1558 CallStackProfiles profiles_; | 1461 CallStackProfiles profiles_; |
| 1559 WaitableEvent completed_; | 1462 WaitableEvent completed_; |
| 1560 StackSamplingProfiler profiler_; | 1463 StackSamplingProfiler profiler_; |
| 1561 }; | 1464 }; |
| 1562 | 1465 |
| 1563 // Checks that different threads can run samplers in parallel. | 1466 // Checks that different threads can run samplers in parallel. |
| 1564 #if defined(STACK_SAMPLING_PROFILER_SUPPORTED) | 1467 PROFILER_TEST_F(StackSamplingProfilerTest, MultipleProfilerThreads) { |
| 1565 #define MAYBE_MultipleProfilerThreads MultipleProfilerThreads | |
| 1566 #else | |
| 1567 #define MAYBE_MultipleProfilerThreads DISABLED_MultipleProfilerThreads | |
| 1568 #endif | |
| 1569 TEST_F(StackSamplingProfilerTest, MAYBE_MultipleProfilerThreads) { | |
| 1570 WithTargetThread([](PlatformThreadId target_thread_id) { | 1468 WithTargetThread([](PlatformThreadId target_thread_id) { |
| 1571 // Providing an initial delay makes it more likely that both will be | 1469 // Providing an initial delay makes it more likely that both will be |
| 1572 // scheduled before either starts to run. Once started, samples will | 1470 // scheduled before either starts to run. Once started, samples will |
| 1573 // run ordered by their scheduled, interleaved times regardless of | 1471 // run ordered by their scheduled, interleaved times regardless of |
| 1574 // whatever interval the thread wakes up. | 1472 // whatever interval the thread wakes up. |
| 1575 SamplingParams params1, params2; | 1473 SamplingParams params1, params2; |
| 1576 params1.initial_delay = TimeDelta::FromMilliseconds(10); | 1474 params1.initial_delay = TimeDelta::FromMilliseconds(10); |
| 1577 params1.sampling_interval = TimeDelta::FromMilliseconds(1); | 1475 params1.sampling_interval = TimeDelta::FromMilliseconds(1); |
| 1578 params1.samples_per_burst = 9; | 1476 params1.samples_per_burst = 9; |
| 1579 params2.initial_delay = TimeDelta::FromMilliseconds(10); | 1477 params2.initial_delay = TimeDelta::FromMilliseconds(10); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1598 EXPECT_EQ(9u, profiler_thread1.profiles()[0].samples.size()); | 1496 EXPECT_EQ(9u, profiler_thread1.profiles()[0].samples.size()); |
| 1599 ASSERT_EQ(1u, profiler_thread2.profiles().size()); | 1497 ASSERT_EQ(1u, profiler_thread2.profiles().size()); |
| 1600 EXPECT_EQ(8u, profiler_thread2.profiles()[0].samples.size()); | 1498 EXPECT_EQ(8u, profiler_thread2.profiles()[0].samples.size()); |
| 1601 | 1499 |
| 1602 profiler_thread1.Join(); | 1500 profiler_thread1.Join(); |
| 1603 profiler_thread2.Join(); | 1501 profiler_thread2.Join(); |
| 1604 }); | 1502 }); |
| 1605 } | 1503 } |
| 1606 | 1504 |
| 1607 } // namespace base | 1505 } // namespace base |
| OLD | NEW |