1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2015 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_config.h" 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 70d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stddef.h> 80d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 90d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <utility> 100d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/json/json_reader.h" 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/json/json_writer.h" 1394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/memory/ptr_util.h" 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/string_split.h" 150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/trace_event/memory_dump_manager.h" 160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/trace_event/memory_dump_request_args.h" 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_event.h" 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace trace_event { 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace { 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// String options that can be used to initialize TraceOptions. 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordUntilFull[] = "record-until-full"; 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordContinuously[] = "record-continuously"; 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordAsMuchAsPossible[] = "record-as-much-as-possible"; 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kTraceToConsole[] = "trace-to-console"; 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableSystrace[] = "enable-systrace"; 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableArgumentFilter[] = "enable-argument-filter"; 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// String parameters that can be used to parse the trace config string. 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kRecordModeParam[] = "record_mode"; 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableSystraceParam[] = "enable_systrace"; 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kEnableArgumentFilterParam[] = "enable_argument_filter"; 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 370d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// String parameters that is used to parse memory dump config in trace config 380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// string. 390d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoconst char kMemoryDumpConfigParam[] = "memory_dump_config"; 400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezconst char kAllowedDumpModesParam[] = "allowed_dump_modes"; 410d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoconst char kTriggersParam[] = "triggers"; 4236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kTriggerModeParam[] = "mode"; 4336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kMinTimeBetweenDumps[] = "min_time_between_dumps_ms"; 4436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kTriggerTypeParam[] = "type"; 4536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kPeriodicIntervalLegacyParam[] = "periodic_interval_ms"; 4694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst char kHeapProfilerOptions[] = "heap_profiler_options"; 4794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes"; 480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 4936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe// String parameters used to parse category event filters. 5036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kEventFiltersParam[] = "event_filters"; 5136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kFilterPredicateParam[] = "filter_predicate"; 5236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abeconst char kFilterArgsParam[] = "filter_args"; 5336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Default configuration of memory dumps. 5594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst TraceConfig::MemoryDumpConfig::Trigger kDefaultHeavyMemoryDumpTrigger = { 5636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 2000, // min_time_between_dumps_ms 5736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe MemoryDumpLevelOfDetail::DETAILED, MemoryDumpType::PERIODIC_INTERVAL}; 5894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezconst TraceConfig::MemoryDumpConfig::Trigger kDefaultLightMemoryDumpTrigger = { 5936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 250, // min_time_between_dumps_ms 6036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe MemoryDumpLevelOfDetail::LIGHT, MemoryDumpType::PERIODIC_INTERVAL}; 610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoclass ConvertableTraceConfigToTraceFormat 630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko : public base::trace_event::ConvertableToTraceFormat { 640d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko public: 650d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config) 660d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko : trace_config_(trace_config) {} 6736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 6845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko ~ConvertableTraceConfigToTraceFormat() override {} 690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 700d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko void AppendAsTraceFormat(std::string* out) const override { 710d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko out->append(trace_config_.ToString()); 720d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko private: 750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const TraceConfig trace_config_; 760d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko}; 770d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezstd::set<MemoryDumpLevelOfDetail> GetDefaultAllowedMemoryDumpModes() { 790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::set<MemoryDumpLevelOfDetail> all_modes; 800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez for (uint32_t mode = static_cast<uint32_t>(MemoryDumpLevelOfDetail::FIRST); 810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez mode <= static_cast<uint32_t>(MemoryDumpLevelOfDetail::LAST); mode++) { 820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez all_modes.insert(static_cast<MemoryDumpLevelOfDetail>(mode)); 830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez return all_modes; 850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez} 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez} // namespace 8894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::HeapProfiler::HeapProfiler() 900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez : breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {} 9194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 9294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::MemoryDumpConfig::HeapProfiler::Clear() { 9394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez breakdown_threshold_bytes = kDefaultBreakdownThresholdBytes; 9494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 9594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::ResetMemoryDumpConfig( 970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const TraceConfig::MemoryDumpConfig& memory_dump_config) { 980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez memory_dump_config_.Clear(); 990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez memory_dump_config_ = memory_dump_config; 1000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez} 1010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::MemoryDumpConfig() {} 10394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 10494ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::MemoryDumpConfig::MemoryDumpConfig( 10594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez const MemoryDumpConfig& other) = default; 10694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 1070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {} 10894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 10994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::MemoryDumpConfig::Clear() { 1100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez allowed_dump_modes.clear(); 11194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez triggers.clear(); 11294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez heap_profiler_options.Clear(); 11394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 11494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 11536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::MemoryDumpConfig::Merge( 11636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe const TraceConfig::MemoryDumpConfig& config) { 11736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe triggers.insert(triggers.end(), config.triggers.begin(), 11836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe config.triggers.end()); 11936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe allowed_dump_modes.insert(config.allowed_dump_modes.begin(), 12036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe config.allowed_dump_modes.end()); 12136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe heap_profiler_options.breakdown_threshold_bytes = 12236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe std::min(heap_profiler_options.breakdown_threshold_bytes, 12336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe config.heap_profiler_options.breakdown_threshold_bytes); 12436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 12536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 12636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::EventFilterConfig( 12736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe const std::string& predicate_name) 12836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe : predicate_name_(predicate_name) {} 12936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 13036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::~EventFilterConfig() {} 13136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 13236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig::EventFilterConfig(const EventFilterConfig& tc) { 13336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe *this = tc; 13436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 13536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 13636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko AbeTraceConfig::EventFilterConfig& TraceConfig::EventFilterConfig::operator=( 13736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe const TraceConfig::EventFilterConfig& rhs) { 13836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe if (this == &rhs) 13936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe return *this; 14036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 14136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe predicate_name_ = rhs.predicate_name_; 142319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_ = rhs.category_filter_; 143319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski 14436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe if (rhs.args_) 14536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe args_ = rhs.args_->CreateDeepCopy(); 14636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 14736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe return *this; 14836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 14936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 150319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowskivoid TraceConfig::EventFilterConfig::InitializeFromConfigDict( 151319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski const base::DictionaryValue* event_filter) { 152319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_.InitializeFromConfigDict(*event_filter); 153319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski 154319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski const base::DictionaryValue* args_dict = nullptr; 155319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski if (event_filter->GetDictionary(kFilterArgsParam, &args_dict)) 156319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski args_ = args_dict->CreateDeepCopy(); 15736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 15836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 159319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowskivoid TraceConfig::EventFilterConfig::SetCategoryFilter( 160319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski const TraceConfigCategoryFilter& category_filter) { 161319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_ = category_filter; 16236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 16336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 164319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowskivoid TraceConfig::EventFilterConfig::ToDict( 165319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski DictionaryValue* filter_dict) const { 166319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski filter_dict->SetString(kFilterPredicateParam, predicate_name()); 167319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski 168319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_.ToDict(filter_dict); 169319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski 170319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski if (args_) 171319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski filter_dict->Set(kFilterArgsParam, args_->CreateDeepCopy()); 17236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 17336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 17436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abebool TraceConfig::EventFilterConfig::GetArgAsSet( 17536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe const char* key, 17636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe std::unordered_set<std::string>* out_set) const { 17736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe const ListValue* list = nullptr; 17836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe if (!args_->GetList(key, &list)) 17936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe return false; 18036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe for (size_t i = 0; i < list->GetSize(); ++i) { 18136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe std::string value; 18236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe if (list->GetString(i, &value)) 18336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe out_set->insert(value); 18436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe } 18536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe return true; 18636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 18736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 18836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abebool TraceConfig::EventFilterConfig::IsCategoryGroupEnabled( 189f810b5921dde57180956b9eadf39a3a2b8cb5855Hidehiko Abe const StringPiece& category_group_name) const { 190319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski return category_filter_.IsCategoryGroupEnabled(category_group_name); 19136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 19236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::TraceConfig() { 194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat InitializeDefault(); 195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece category_filter_string, 1980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez StringPiece trace_options_string) { 199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat InitializeFromStrings(category_filter_string, trace_options_string); 200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece category_filter_string, 203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceRecordMode record_mode) { 204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string trace_options_string; 205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat switch (record_mode) { 206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_UNTIL_FULL: 207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_options_string = kRecordUntilFull; 208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_CONTINUOUSLY: 210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_options_string = kRecordContinuously; 211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_AS_MUCH_AS_POSSIBLE: 213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_options_string = kRecordAsMuchAsPossible; 214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case ECHO_TO_CONSOLE: 216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_options_string = kTraceToConsole; 217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat default: 219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat NOTREACHED(); 220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat InitializeFromStrings(category_filter_string, trace_options_string); 222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 22494ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::TraceConfig(const DictionaryValue& config) { 22594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez InitializeFromConfigDict(config); 22694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 22794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 2280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTraceConfig::TraceConfig(StringPiece config_string) { 229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!config_string.empty()) 230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat InitializeFromConfigString(config_string); 231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat else 232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat InitializeDefault(); 233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::TraceConfig(const TraceConfig& tc) 236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : record_mode_(tc.record_mode_), 237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_systrace_(tc.enable_systrace_), 238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_argument_filter_(tc.enable_argument_filter_), 239319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_(tc.category_filter_), 2400d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko memory_dump_config_(tc.memory_dump_config_), 24136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe event_filters_(tc.event_filters_) {} 242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig::~TraceConfig() { 244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceConfig& TraceConfig::operator=(const TraceConfig& rhs) { 247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (this == &rhs) 248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return *this; 249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = rhs.record_mode_; 251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_systrace_ = rhs.enable_systrace_; 252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_argument_filter_ = rhs.enable_argument_filter_; 253319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_ = rhs.category_filter_; 2540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko memory_dump_config_ = rhs.memory_dump_config_; 25536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe event_filters_ = rhs.event_filters_; 256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return *this; 257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst TraceConfig::StringList& TraceConfig::GetSyntheticDelayValues() const { 260319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski return category_filter_.synthetic_delays(); 261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToString() const { 2640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<DictionaryValue> dict = ToDict(); 265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string json; 2660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONWriter::Write(*dict, &json); 267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return json; 268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 27094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstd::unique_ptr<ConvertableToTraceFormat> 27194ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezTraceConfig::AsConvertableToTraceFormat() const { 27236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe return MakeUnique<ConvertableTraceConfigToTraceFormat>(*this); 2730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 2740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToCategoryFilterString() const { 276319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski return category_filter_.ToFilterString(); 277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceConfig::IsCategoryGroupEnabled( 280f810b5921dde57180956b9eadf39a3a2b8cb5855Hidehiko Abe const StringPiece& category_group_name) const { 281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TraceLog should call this method only as part of enabling/disabling 282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // categories. 283319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski return category_filter_.IsCategoryGroupEnabled(category_group_name); 284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::Merge(const TraceConfig& config) { 287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (record_mode_ != config.record_mode_ 288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat || enable_systrace_ != config.enable_systrace_ 289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat || enable_argument_filter_ != config.enable_argument_filter_) { 290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DLOG(ERROR) << "Attempting to merge trace config with a different " 291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat << "set of options."; 292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 294319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_.Merge(config.category_filter_); 295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 29636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe memory_dump_config_.Merge(config.memory_dump_config_); 2970d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 29836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe event_filters_.insert(event_filters_.end(), config.event_filters().begin(), 29936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe config.event_filters().end()); 300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::Clear() { 303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_UNTIL_FULL; 304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_systrace_ = false; 305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_argument_filter_ = false; 306319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_.Clear(); 30794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.Clear(); 30836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe event_filters_.clear(); 309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceConfig::InitializeDefault() { 312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_UNTIL_FULL; 313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_systrace_ = false; 314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_argument_filter_ = false; 315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 31794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvoid TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) { 318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_UNTIL_FULL; 319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string record_mode; 32094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez if (dict.GetString(kRecordModeParam, &record_mode)) { 321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (record_mode == kRecordUntilFull) { 322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_UNTIL_FULL; 323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } else if (record_mode == kRecordContinuously) { 324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_CONTINUOUSLY; 325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } else if (record_mode == kTraceToConsole) { 326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = ECHO_TO_CONSOLE; 327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } else if (record_mode == kRecordAsMuchAsPossible) { 328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE; 329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 3320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez bool val; 3330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez enable_systrace_ = dict.GetBoolean(kEnableSystraceParam, &val) ? val : false; 3340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez enable_argument_filter_ = 3350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict.GetBoolean(kEnableArgumentFilterParam, &val) ? val : false; 336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 337319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_.InitializeFromConfigDict(dict); 3380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 33936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe const base::ListValue* category_event_filters = nullptr; 34036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe if (dict.GetList(kEventFiltersParam, &category_event_filters)) 34136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe SetEventFiltersFromConfigList(*category_event_filters); 34236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 343319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { 3440d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // If dump triggers not set, the client is using the legacy with just 3450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // category enabled. So, use the default periodic dump config. 3460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const DictionaryValue* memory_dump_config = nullptr; 34794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez if (dict.GetDictionary(kMemoryDumpConfigParam, &memory_dump_config)) 3480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez SetMemoryDumpConfigFromConfigDict(*memory_dump_config); 3490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko else 3500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko SetDefaultMemoryDumpConfig(); 3510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 3540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::InitializeFromConfigString(StringPiece config_string) { 3550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez auto dict = DictionaryValue::From(JSONReader::Read(config_string)); 3560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez if (dict) 3570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez InitializeFromConfigDict(*dict); 3580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez else 3590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez InitializeDefault(); 36094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 36194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 3620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::InitializeFromStrings(StringPiece category_filter_string, 3630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez StringPiece trace_options_string) { 364319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski if (!category_filter_string.empty()) 365319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_.InitializeFromString(category_filter_string); 366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_UNTIL_FULL; 368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_systrace_ = false; 369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_argument_filter_ = false; 3700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez if (!trace_options_string.empty()) { 3710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::vector<std::string> split = 3720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez SplitString(trace_options_string, ",", TRIM_WHITESPACE, SPLIT_WANT_ALL); 3730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez for (const std::string& token : split) { 3740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez if (token == kRecordUntilFull) { 375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_UNTIL_FULL; 3760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } else if (token == kRecordContinuously) { 377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_CONTINUOUSLY; 3780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } else if (token == kTraceToConsole) { 379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = ECHO_TO_CONSOLE; 3800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } else if (token == kRecordAsMuchAsPossible) { 381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE; 3820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } else if (token == kEnableSystrace) { 383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_systrace_ = true; 3840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } else if (token == kEnableArgumentFilter) { 385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat enable_argument_filter_ = true; 386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 3890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 390319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { 3910d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko SetDefaultMemoryDumpConfig(); 3920d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 3950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid TraceConfig::SetMemoryDumpConfigFromConfigDict( 3960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const DictionaryValue& memory_dump_config) { 3970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Set allowed dump modes. 3980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez memory_dump_config_.allowed_dump_modes.clear(); 3990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const ListValue* allowed_modes_list; 4000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez if (memory_dump_config.GetList(kAllowedDumpModesParam, &allowed_modes_list)) { 4010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez for (size_t i = 0; i < allowed_modes_list->GetSize(); ++i) { 4020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string level_of_detail_str; 4030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez allowed_modes_list->GetString(i, &level_of_detail_str); 4040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez memory_dump_config_.allowed_dump_modes.insert( 4050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez StringToMemoryDumpLevelOfDetail(level_of_detail_str)); 4060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 4070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } else { 4080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // If allowed modes param is not given then allow all modes by default. 4090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes(); 4100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 4110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 41294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Set triggers 41394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.triggers.clear(); 4140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const ListValue* trigger_list = nullptr; 41594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez if (memory_dump_config.GetList(kTriggersParam, &trigger_list) && 41694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez trigger_list->GetSize() > 0) { 41794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez for (size_t i = 0; i < trigger_list->GetSize(); ++i) { 4180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const DictionaryValue* trigger = nullptr; 41994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez if (!trigger_list->GetDictionary(i, &trigger)) 42094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez continue; 4210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 42236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe MemoryDumpConfig::Trigger dump_config; 42394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int interval = 0; 42436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe if (!trigger->GetInteger(kMinTimeBetweenDumps, &interval)) { 42536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe // If "min_time_between_dumps_ms" param was not given, then the trace 42636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe // config uses old format where only periodic dumps are supported. 42736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe trigger->GetInteger(kPeriodicIntervalLegacyParam, &interval); 42836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe dump_config.trigger_type = MemoryDumpType::PERIODIC_INTERVAL; 42936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe } else { 43036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe std::string trigger_type_str; 43136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe trigger->GetString(kTriggerTypeParam, &trigger_type_str); 43236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe dump_config.trigger_type = StringToMemoryDumpType(trigger_type_str); 43336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe } 434e5b2c6fa6f923f3a2f66346c2f169d9f0fceb3dcLuis Hector Chavez DCHECK_GT(interval, 0); 43536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe dump_config.min_time_between_dumps_ms = static_cast<uint32_t>(interval); 43636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 43794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::string level_of_detail_str; 43836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe trigger->GetString(kTriggerModeParam, &level_of_detail_str); 43994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez dump_config.level_of_detail = 44094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez StringToMemoryDumpLevelOfDetail(level_of_detail_str); 44136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 44294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.triggers.push_back(dump_config); 44394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 44494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 4450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 44694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Set heap profiler options 4470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const DictionaryValue* heap_profiler_options = nullptr; 44894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez if (memory_dump_config.GetDictionary(kHeapProfilerOptions, 44994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez &heap_profiler_options)) { 45094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int min_size_bytes = 0; 45194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez if (heap_profiler_options->GetInteger(kBreakdownThresholdBytes, 45294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez &min_size_bytes) 45394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez && min_size_bytes >= 0) { 45494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes = 45594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez static_cast<size_t>(min_size_bytes); 45694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } else { 45794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes = 45894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes; 4590d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 4600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 4610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 4620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 4630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkovoid TraceConfig::SetDefaultMemoryDumpConfig() { 46494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.Clear(); 46594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger); 46694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger); 4670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes(); 468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 47036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abevoid TraceConfig::SetEventFiltersFromConfigList( 47136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe const base::ListValue& category_event_filters) { 47236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe event_filters_.clear(); 47336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 47436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe for (size_t event_filter_index = 0; 47536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe event_filter_index < category_event_filters.GetSize(); 47636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe ++event_filter_index) { 47736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe const base::DictionaryValue* event_filter = nullptr; 47836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe if (!category_event_filters.GetDictionary(event_filter_index, 47936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe &event_filter)) 48036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe continue; 48136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 48236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe std::string predicate_name; 48336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe CHECK(event_filter->GetString(kFilterPredicateParam, &predicate_name)) 48436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe << "Invalid predicate name in category event filter."; 48536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 48636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe EventFilterConfig new_config(predicate_name); 487319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski new_config.InitializeFromConfigDict(event_filter); 48836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe event_filters_.push_back(new_config); 48936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe } 49036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe} 49136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 4920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezstd::unique_ptr<DictionaryValue> TraceConfig::ToDict() const { 4930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez auto dict = MakeUnique<DictionaryValue>(); 494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat switch (record_mode_) { 495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_UNTIL_FULL: 4960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict->SetString(kRecordModeParam, kRecordUntilFull); 497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_CONTINUOUSLY: 4990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict->SetString(kRecordModeParam, kRecordContinuously); 500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_AS_MUCH_AS_POSSIBLE: 5020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict->SetString(kRecordModeParam, kRecordAsMuchAsPossible); 503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case ECHO_TO_CONSOLE: 5050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict->SetString(kRecordModeParam, kTraceToConsole); 506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat default: 508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat NOTREACHED(); 509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict->SetBoolean(kEnableSystraceParam, enable_systrace_); 5120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict->SetBoolean(kEnableArgumentFilterParam, enable_argument_filter_); 513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 514319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski category_filter_.ToDict(dict.get()); 5150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 51636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe if (!event_filters_.empty()) { 51736040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe std::unique_ptr<base::ListValue> filter_list(new base::ListValue()); 51836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe for (const EventFilterConfig& filter : event_filters_) { 51936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe std::unique_ptr<base::DictionaryValue> filter_dict( 52036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe new base::DictionaryValue()); 521319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski filter.ToDict(filter_dict.get()); 52236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe filter_list->Append(std::move(filter_dict)); 52336040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe } 52436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe dict->Set(kEventFiltersParam, std::move(filter_list)); 52536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe } 52636040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe 527319afc59a539d6261307aadbdab4d4ee93eaf1ffJakub Pawlowski if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { 5280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez auto allowed_modes = MakeUnique<ListValue>(); 5290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez for (auto dump_mode : memory_dump_config_.allowed_dump_modes) 5300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez allowed_modes->AppendString(MemoryDumpLevelOfDetailToString(dump_mode)); 5310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez auto memory_dump_config = MakeUnique<DictionaryValue>(); 5330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez memory_dump_config->Set(kAllowedDumpModesParam, std::move(allowed_modes)); 5340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez auto triggers_list = MakeUnique<ListValue>(); 5360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez for (const auto& config : memory_dump_config_.triggers) { 5370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez auto trigger_dict = MakeUnique<DictionaryValue>(); 53836040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe trigger_dict->SetString(kTriggerTypeParam, 53936040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe MemoryDumpTypeToString(config.trigger_type)); 54036040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe trigger_dict->SetInteger( 54136040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe kMinTimeBetweenDumps, 54236040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe static_cast<int>(config.min_time_between_dumps_ms)); 5430d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trigger_dict->SetString( 54436040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe kTriggerModeParam, 54536040ed30c39d2106a2cd5ec033e98b71302a744Hidehiko Abe MemoryDumpLevelOfDetailToString(config.level_of_detail)); 5460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko triggers_list->Append(std::move(trigger_dict)); 5470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 5480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 5490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // Empty triggers will still be specified explicitly since it means that 5500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // the periodic dumps are not enabled. 5510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko memory_dump_config->Set(kTriggersParam, std::move(triggers_list)); 55294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 55394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez if (memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes != 55494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes) { 5550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez auto options = MakeUnique<DictionaryValue>(); 5560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez options->SetInteger( 55794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez kBreakdownThresholdBytes, 55894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes); 5590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez memory_dump_config->Set(kHeapProfilerOptions, std::move(options)); 56094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 5610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict->Set(kMemoryDumpConfigParam, std::move(memory_dump_config)); 5620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 5630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez return dict; 564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string TraceConfig::ToTraceOptionsString() const { 567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat std::string ret; 568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat switch (record_mode_) { 569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_UNTIL_FULL: 570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ret = kRecordUntilFull; 571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_CONTINUOUSLY: 573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ret = kRecordContinuously; 574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case RECORD_AS_MUCH_AS_POSSIBLE: 576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ret = kRecordAsMuchAsPossible; 577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat case ECHO_TO_CONSOLE: 579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ret = kTraceToConsole; 580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat break; 581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat default: 582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat NOTREACHED(); 583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (enable_systrace_) 585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ret = ret + "," + kEnableSystrace; 586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (enable_argument_filter_) 587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ret = ret + "," + kEnableArgumentFilter; 588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return ret; 589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace trace_event 592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 593