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 "base/trace_event/memory_dump_manager.h" | 5 #include "base/trace_event/memory_dump_manager.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
989 // Swallow all the final spurious calls until tracing gets disabled. | 989 // Swallow all the final spurious calls until tracing gets disabled. |
990 EXPECT_CALL(delegate, RequestGlobalMemoryDump(_, _)).Times(AnyNumber()); | 990 EXPECT_CALL(delegate, RequestGlobalMemoryDump(_, _)).Times(AnyNumber()); |
991 | 991 |
992 EnableTracingWithTraceConfig( | 992 EnableTracingWithTraceConfig( |
993 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers( | 993 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers( |
994 kLightDumpPeriodMs, kHeavyDumpPeriodMs)); | 994 kLightDumpPeriodMs, kHeavyDumpPeriodMs)); |
995 run_loop.Run(); | 995 run_loop.Run(); |
996 DisableTracing(); | 996 DisableTracing(); |
997 } | 997 } |
998 | 998 |
999 // Tests against race conditions that might arise when disabling tracing in the | |
1000 // middle of a global memory dump. | |
1001 // Flaky on iOS, see crbug.com/706961 | |
1002 #if defined(OS_IOS) | |
1003 #define MAYBE_DisableTracingWhileDumping DISABLED_DisableTracingWhileDumping | |
1004 #else | |
1005 #define MAYBE_DisableTracingWhileDumping DisableTracingWhileDumping | |
1006 #endif | |
1007 TEST_F(MemoryDumpManagerTest, MAYBE_DisableTracingWhileDumping) { | |
1008 base::WaitableEvent tracing_disabled_event( | |
1009 WaitableEvent::ResetPolicy::AUTOMATIC, | |
1010 WaitableEvent::InitialState::NOT_SIGNALED); | |
1011 InitializeMemoryDumpManager(false /* is_coordinator */); | |
1012 | |
1013 // Register a bound dump provider. | |
1014 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); | |
1015 mdp_thread->Start(); | |
1016 MockMemoryDumpProvider mdp_with_affinity; | |
1017 RegisterDumpProvider(&mdp_with_affinity, mdp_thread->task_runner(), | |
1018 kDefaultOptions); | |
1019 | |
1020 // Register also an unbound dump provider. Unbound dump providers are always | |
1021 // invoked after bound ones. | |
1022 MockMemoryDumpProvider unbound_mdp; | |
1023 RegisterDumpProvider(&unbound_mdp, nullptr, kDefaultOptions); | |
1024 | |
1025 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | |
1026 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | |
1027 EXPECT_CALL(mdp_with_affinity, OnMemoryDump(_, _)) | |
1028 .Times(1) | |
1029 .WillOnce( | |
1030 Invoke([&tracing_disabled_event](const MemoryDumpArgs&, | |
1031 ProcessMemoryDump* pmd) -> bool { | |
1032 tracing_disabled_event.Wait(); | |
1033 | |
1034 // At this point tracing has been disabled and the | |
1035 // MemoryDumpManager.dump_thread_ has been shut down. | |
1036 return true; | |
1037 })); | |
1038 | |
1039 // |unbound_mdp| should never be invoked because the thread for unbound dump | |
1040 // providers has been shutdown in the meanwhile. | |
1041 EXPECT_CALL(unbound_mdp, OnMemoryDump(_, _)).Times(0); | |
1042 | |
1043 last_callback_success_ = true; | |
1044 RunLoop run_loop; | |
1045 MemoryDumpCallback callback = | |
1046 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), | |
1047 ThreadTaskRunnerHandle::Get(), run_loop.QuitClosure()); | |
1048 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | |
1049 MemoryDumpLevelOfDetail::DETAILED, callback); | |
1050 DisableTracing(); | |
1051 tracing_disabled_event.Signal(); | |
1052 run_loop.Run(); | |
1053 | |
1054 EXPECT_FALSE(last_callback_success_); | |
1055 } | |
1056 | |
1057 // Tests against race conditions that can happen if tracing is disabled before | 999 // Tests against race conditions that can happen if tracing is disabled before |
1058 // the CreateProcessDump() call. Real-world regression: crbug.com/580295 . | 1000 // the CreateProcessDump() call. Real-world regression: crbug.com/580295 . |
1059 TEST_F(MemoryDumpManagerTest, DisableTracingRightBeforeStartOfDump) { | 1001 TEST_F(MemoryDumpManagerTest, DisableTracingRightBeforeStartOfDump) { |
1060 base::WaitableEvent tracing_disabled_event( | 1002 base::WaitableEvent tracing_disabled_event( |
1061 WaitableEvent::ResetPolicy::AUTOMATIC, | 1003 WaitableEvent::ResetPolicy::AUTOMATIC, |
1062 WaitableEvent::InitialState::NOT_SIGNALED); | 1004 WaitableEvent::InitialState::NOT_SIGNALED); |
1063 InitializeMemoryDumpManager(false /* is_coordinator */); | 1005 InitializeMemoryDumpManager(false /* is_coordinator */); |
1064 | 1006 |
1065 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); | 1007 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); |
1066 mdp_thread->Start(); | 1008 mdp_thread->Start(); |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1280 | 1222 |
1281 Thread thread("test thread"); | 1223 Thread thread("test thread"); |
1282 thread.Start(); | 1224 thread.Start(); |
1283 RegisterDumpProvider(&mdp1, thread.task_runner(), kDefaultOptions, | 1225 RegisterDumpProvider(&mdp1, thread.task_runner(), kDefaultOptions, |
1284 "BlacklistTestDumpProvider"); | 1226 "BlacklistTestDumpProvider"); |
1285 // Unregistering on wrong thread should not crash. | 1227 // Unregistering on wrong thread should not crash. |
1286 mdm_->UnregisterDumpProvider(&mdp1); | 1228 mdm_->UnregisterDumpProvider(&mdp1); |
1287 thread.Stop(); | 1229 thread.Stop(); |
1288 } | 1230 } |
1289 | 1231 |
1232 // Tests that we can manually take a dump without enabling tracing. | |
1233 TEST_F(MemoryDumpManagerTest, TestManualEnable) { | |
Primiano Tucci (use gerrit)
2017/04/21 10:10:26
I'd s/TestManualEnable/DumpWithTracingDisabled/
hjd
2017/04/21 11:51:57
Done.
| |
1234 InitializeMemoryDumpManager(false /* is_coordinator */); | |
1235 MockMemoryDumpProvider mdp; | |
1236 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | |
1237 | |
1238 DisableTracing(); | |
1239 | |
1240 const TraceConfig& trace_config = | |
1241 TraceConfig(TraceConfigMemoryTestUtil::GetTraceConfig_NoTriggers()); | |
1242 const TraceConfig::MemoryDumpConfig& memory_dump_config = | |
1243 trace_config.memory_dump_config(); | |
1244 | |
1245 mdm_->Enable(memory_dump_config); | |
1246 | |
1247 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(3); | |
1248 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); | |
1249 last_callback_success_ = false; | |
1250 for (int i = 0; i < 3; ++i) | |
1251 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | |
1252 MemoryDumpLevelOfDetail::DETAILED); | |
1253 EXPECT_TRUE(last_callback_success_); | |
1254 | |
1255 mdm_->Disable(); | |
1256 | |
1257 mdm_->UnregisterDumpProvider(&mdp); | |
1258 } | |
1259 | |
1290 } // namespace trace_event | 1260 } // namespace trace_event |
1291 } // namespace base | 1261 } // namespace base |
OLD | NEW |