Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(971)

Side by Side Diff: base/trace_event/trace_config.cc

Issue 1911643002: Add configurable limit to allocations in heap profiler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed naming in protocol.json Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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/trace_config.h" 5 #include "base/trace_event/trace_config.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 const char kSyntheticDelaysParam[] = "synthetic_delays"; 43 const char kSyntheticDelaysParam[] = "synthetic_delays";
44 44
45 const char kSyntheticDelayCategoryFilterPrefix[] = "DELAY("; 45 const char kSyntheticDelayCategoryFilterPrefix[] = "DELAY(";
46 46
47 // String parameters that is used to parse memory dump config in trace config 47 // String parameters that is used to parse memory dump config in trace config
48 // string. 48 // string.
49 const char kMemoryDumpConfigParam[] = "memory_dump_config"; 49 const char kMemoryDumpConfigParam[] = "memory_dump_config";
50 const char kTriggersParam[] = "triggers"; 50 const char kTriggersParam[] = "triggers";
51 const char kPeriodicIntervalParam[] = "periodic_interval_ms"; 51 const char kPeriodicIntervalParam[] = "periodic_interval_ms";
52 const char kModeParam[] = "mode"; 52 const char kModeParam[] = "mode";
53 const char kHeapProfilerOptions[] = "heap_profiler_options";
54 const char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes";
53 55
54 // Default configuration of memory dumps. 56 // Default configuration of memory dumps.
55 const TraceConfig::MemoryDumpTriggerConfig kDefaultHeavyMemoryDumpTrigger = { 57 const TraceConfig::MemoryDumpTrigger kDefaultHeavyMemoryDumpTrigger = {
56 2000, // periodic_interval_ms 58 2000, // periodic_interval_ms
57 MemoryDumpLevelOfDetail::DETAILED}; 59 MemoryDumpLevelOfDetail::DETAILED};
58 const TraceConfig::MemoryDumpTriggerConfig kDefaultLightMemoryDumpTrigger = { 60 const TraceConfig::MemoryDumpTrigger kDefaultLightMemoryDumpTrigger = {
59 250, // periodic_interval_ms 61 250, // periodic_interval_ms
60 MemoryDumpLevelOfDetail::LIGHT}; 62 MemoryDumpLevelOfDetail::LIGHT};
61 63
62 class ConvertableTraceConfigToTraceFormat 64 class ConvertableTraceConfigToTraceFormat
63 : public base::trace_event::ConvertableToTraceFormat { 65 : public base::trace_event::ConvertableToTraceFormat {
64 public: 66 public:
65 explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config) 67 explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config)
66 : trace_config_(trace_config) {} 68 : trace_config_(trace_config) {}
67 ~ConvertableTraceConfigToTraceFormat() override {} 69 ~ConvertableTraceConfigToTraceFormat() override {}
68 void AppendAsTraceFormat(std::string* out) const override { 70 void AppendAsTraceFormat(std::string* out) const override {
69 out->append(trace_config_.ToString()); 71 out->append(trace_config_.ToString());
70 } 72 }
71 73
72 private: 74 private:
73 const TraceConfig trace_config_; 75 const TraceConfig trace_config_;
74 }; 76 };
75 77
76 } // namespace 78 } // namespace
77 79
80
81 TraceConfig::MemoryDumpConfig::HeapProfilerOptions::HeapProfilerOptions() :
82 breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {};
83
84 TraceConfig::MemoryDumpConfig::HeapProfilerOptions::~HeapProfilerOptions() {};
85
86 void TraceConfig::MemoryDumpConfig::HeapProfilerOptions::Clear() {
87 breakdown_threshold_bytes = kDefaultBreakdownThresholdBytes;
88 }
89
90 TraceConfig::MemoryDumpConfig::MemoryDumpConfig() {};
91
92 TraceConfig::MemoryDumpConfig::MemoryDumpConfig(
93 const MemoryDumpConfig& other) = default;
94
95 TraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {};
96
97 void TraceConfig::MemoryDumpConfig::Clear() {
98 triggers.clear();
99 heap_profiler_options.Clear();
100 }
101
78 TraceConfig::TraceConfig() { 102 TraceConfig::TraceConfig() {
79 InitializeDefault(); 103 InitializeDefault();
80 } 104 }
81 105
82 TraceConfig::TraceConfig(const std::string& category_filter_string, 106 TraceConfig::TraceConfig(const std::string& category_filter_string,
83 const std::string& trace_options_string) { 107 const std::string& trace_options_string) {
84 InitializeFromStrings(category_filter_string, trace_options_string); 108 InitializeFromStrings(category_filter_string, trace_options_string);
85 } 109 }
86 110
87 TraceConfig::TraceConfig(const std::string& category_filter_string, 111 TraceConfig::TraceConfig(const std::string& category_filter_string,
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 // Otherwise, one of the filter was specifying "*" and we want to honor the 274 // Otherwise, one of the filter was specifying "*" and we want to honor the
251 // broadest filter. 275 // broadest filter.
252 if (HasIncludedPatterns() && config.HasIncludedPatterns()) { 276 if (HasIncludedPatterns() && config.HasIncludedPatterns()) {
253 included_categories_.insert(included_categories_.end(), 277 included_categories_.insert(included_categories_.end(),
254 config.included_categories_.begin(), 278 config.included_categories_.begin(),
255 config.included_categories_.end()); 279 config.included_categories_.end());
256 } else { 280 } else {
257 included_categories_.clear(); 281 included_categories_.clear();
258 } 282 }
259 283
260 memory_dump_config_.insert(memory_dump_config_.end(), 284 memory_dump_config_.triggers.insert(memory_dump_config_.triggers.end(),
261 config.memory_dump_config_.begin(), 285 config.memory_dump_config_.triggers.begin(),
262 config.memory_dump_config_.end()); 286 config.memory_dump_config_.triggers.end());
263 287
264 disabled_categories_.insert(disabled_categories_.end(), 288 disabled_categories_.insert(disabled_categories_.end(),
265 config.disabled_categories_.begin(), 289 config.disabled_categories_.begin(),
266 config.disabled_categories_.end()); 290 config.disabled_categories_.end());
267 excluded_categories_.insert(excluded_categories_.end(), 291 excluded_categories_.insert(excluded_categories_.end(),
268 config.excluded_categories_.begin(), 292 config.excluded_categories_.begin(),
269 config.excluded_categories_.end()); 293 config.excluded_categories_.end());
270 synthetic_delays_.insert(synthetic_delays_.end(), 294 synthetic_delays_.insert(synthetic_delays_.end(),
271 config.synthetic_delays_.begin(), 295 config.synthetic_delays_.begin(),
272 config.synthetic_delays_.end()); 296 config.synthetic_delays_.end());
273 } 297 }
274 298
275 void TraceConfig::Clear() { 299 void TraceConfig::Clear() {
276 record_mode_ = RECORD_UNTIL_FULL; 300 record_mode_ = RECORD_UNTIL_FULL;
277 enable_sampling_ = false; 301 enable_sampling_ = false;
278 enable_systrace_ = false; 302 enable_systrace_ = false;
279 enable_argument_filter_ = false; 303 enable_argument_filter_ = false;
280 included_categories_.clear(); 304 included_categories_.clear();
281 disabled_categories_.clear(); 305 disabled_categories_.clear();
282 excluded_categories_.clear(); 306 excluded_categories_.clear();
283 synthetic_delays_.clear(); 307 synthetic_delays_.clear();
284 memory_dump_config_.clear(); 308 memory_dump_config_.Clear();
285 } 309 }
286 310
287 void TraceConfig::InitializeDefault() { 311 void TraceConfig::InitializeDefault() {
288 record_mode_ = RECORD_UNTIL_FULL; 312 record_mode_ = RECORD_UNTIL_FULL;
289 enable_sampling_ = false; 313 enable_sampling_ = false;
290 enable_systrace_ = false; 314 enable_systrace_ = false;
291 enable_argument_filter_ = false; 315 enable_argument_filter_ = false;
292 excluded_categories_.push_back("*Debug"); 316 excluded_categories_.push_back("*Debug");
293 excluded_categories_.push_back("*Test"); 317 excluded_categories_.push_back("*Test");
294 } 318 }
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 ci != categories.end(); 506 ci != categories.end();
483 ++ci) { 507 ++ci) {
484 list->AppendString(*ci); 508 list->AppendString(*ci);
485 } 509 }
486 510
487 dict.Set(param, std::move(list)); 511 dict.Set(param, std::move(list));
488 } 512 }
489 513
490 void TraceConfig::SetMemoryDumpConfig( 514 void TraceConfig::SetMemoryDumpConfig(
491 const base::DictionaryValue& memory_dump_config) { 515 const base::DictionaryValue& memory_dump_config) {
492 memory_dump_config_.clear(); 516 // Set triggers
517 memory_dump_config_.triggers.clear();
493 518
494 const base::ListValue* trigger_list = nullptr; 519 const base::ListValue* trigger_list = nullptr;
495 if (!memory_dump_config.GetList(kTriggersParam, &trigger_list) || 520 if (memory_dump_config.GetList(kTriggersParam, &trigger_list) &&
496 trigger_list->GetSize() == 0) { 521 trigger_list->GetSize() > 0) {
497 return; 522 for (size_t i = 0; i < trigger_list->GetSize(); ++i) {
523 const base::DictionaryValue* trigger = nullptr;
524 if (!trigger_list->GetDictionary(i, &trigger))
525 continue;
526
527 MemoryDumpTrigger dump_config;
528 int interval = 0;
529
530 if (!trigger->GetInteger(kPeriodicIntervalParam, &interval)) {
531 continue;
532 }
533 DCHECK_GT(interval, 0);
534 dump_config.periodic_interval_ms = static_cast<uint32_t>(interval);
535 std::string level_of_detail_str;
536 trigger->GetString(kModeParam, &level_of_detail_str);
537 dump_config.level_of_detail =
538 StringToMemoryDumpLevelOfDetail(level_of_detail_str);
539 memory_dump_config_.triggers.push_back(dump_config);
540 }
498 } 541 }
499 542
500 for (size_t i = 0; i < trigger_list->GetSize(); ++i) { 543 // Set heap profiler options
501 const base::DictionaryValue* trigger = nullptr; 544 const base::DictionaryValue* heap_profiler_options = nullptr;
502 if (!trigger_list->GetDictionary(i, &trigger)) 545 if (memory_dump_config.GetDictionary(kHeapProfilerOptions,
503 continue; 546 &heap_profiler_options)) {
504 547 int min_size_bytes = 0;
505 MemoryDumpTriggerConfig dump_config; 548 if (heap_profiler_options->GetInteger(kBreakdownThresholdBytes,
506 int interval = 0; 549 &min_size_bytes)
507 550 && min_size_bytes >= 0) {
Primiano Tucci (use gerrit) 2016/04/28 07:33:45 are you sure you want the && min_size_bytes >= 0 p
Maria 2016/04/28 17:23:39 Sorry, maybe I am not seeing something, but my rea
Primiano Tucci (use gerrit) 2016/04/28 20:55:11 oops sorry somehow I didn't see the "=" part of t
508 if (!trigger->GetInteger(kPeriodicIntervalParam, &interval)) { 551 memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes =
509 continue; 552 static_cast<size_t>(min_size_bytes);
553 } else {
554 memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes =
555 MemoryDumpHeapProfilerOptions::kDefaultBreakdownThresholdBytes;
510 } 556 }
511 DCHECK_GT(interval, 0);
512 dump_config.periodic_interval_ms = static_cast<uint32_t>(interval);
513 std::string level_of_detail_str;
514 trigger->GetString(kModeParam, &level_of_detail_str);
515 dump_config.level_of_detail =
516 StringToMemoryDumpLevelOfDetail(level_of_detail_str);
517 memory_dump_config_.push_back(dump_config);
518 } 557 }
519 } 558 }
520 559
521 void TraceConfig::SetDefaultMemoryDumpConfig() { 560 void TraceConfig::SetDefaultMemoryDumpConfig() {
522 memory_dump_config_.clear(); 561 memory_dump_config_.Clear();
523 memory_dump_config_.push_back(kDefaultHeavyMemoryDumpTrigger); 562 memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger);
524 memory_dump_config_.push_back(kDefaultLightMemoryDumpTrigger); 563 memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger);
Primiano Tucci (use gerrit) 2016/04/28 07:33:45 don't you want also to set kDefaultBreakdownThresh
Maria 2016/04/28 17:23:39 memory_dump_config_.Clear() does that
Primiano Tucci (use gerrit) 2016/04/28 20:55:11 Acknowledged.
525 } 564 }
526 565
527 void TraceConfig::ToDict(base::DictionaryValue& dict) const { 566 void TraceConfig::ToDict(base::DictionaryValue& dict) const {
528 switch (record_mode_) { 567 switch (record_mode_) {
529 case RECORD_UNTIL_FULL: 568 case RECORD_UNTIL_FULL:
530 dict.SetString(kRecordModeParam, kRecordUntilFull); 569 dict.SetString(kRecordModeParam, kRecordUntilFull);
531 break; 570 break;
532 case RECORD_CONTINUOUSLY: 571 case RECORD_CONTINUOUSLY:
533 dict.SetString(kRecordModeParam, kRecordContinuously); 572 dict.SetString(kRecordModeParam, kRecordContinuously);
534 break; 573 break;
(...skipping 27 matching lines...) Expand all
562 disabled_categories_.begin(), 601 disabled_categories_.begin(),
563 disabled_categories_.end()); 602 disabled_categories_.end());
564 AddCategoryToDict(dict, kIncludedCategoriesParam, categories); 603 AddCategoryToDict(dict, kIncludedCategoriesParam, categories);
565 AddCategoryToDict(dict, kExcludedCategoriesParam, excluded_categories_); 604 AddCategoryToDict(dict, kExcludedCategoriesParam, excluded_categories_);
566 AddCategoryToDict(dict, kSyntheticDelaysParam, synthetic_delays_); 605 AddCategoryToDict(dict, kSyntheticDelaysParam, synthetic_delays_);
567 606
568 if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { 607 if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
569 std::unique_ptr<base::DictionaryValue> memory_dump_config( 608 std::unique_ptr<base::DictionaryValue> memory_dump_config(
570 new base::DictionaryValue()); 609 new base::DictionaryValue());
571 std::unique_ptr<base::ListValue> triggers_list(new base::ListValue()); 610 std::unique_ptr<base::ListValue> triggers_list(new base::ListValue());
572 for (const MemoryDumpTriggerConfig& config : memory_dump_config_) { 611 for (const MemoryDumpTrigger& config : memory_dump_config_.triggers) {
573 std::unique_ptr<base::DictionaryValue> trigger_dict( 612 std::unique_ptr<base::DictionaryValue> trigger_dict(
574 new base::DictionaryValue()); 613 new base::DictionaryValue());
575 trigger_dict->SetInteger(kPeriodicIntervalParam, 614 trigger_dict->SetInteger(kPeriodicIntervalParam,
576 static_cast<int>(config.periodic_interval_ms)); 615 static_cast<int>(config.periodic_interval_ms));
577 trigger_dict->SetString( 616 trigger_dict->SetString(
578 kModeParam, MemoryDumpLevelOfDetailToString(config.level_of_detail)); 617 kModeParam, MemoryDumpLevelOfDetailToString(config.level_of_detail));
579 triggers_list->Append(std::move(trigger_dict)); 618 triggers_list->Append(std::move(trigger_dict));
580 } 619 }
581 620
582 // Empty triggers will still be specified explicitly since it means that 621 // Empty triggers will still be specified explicitly since it means that
583 // the periodic dumps are not enabled. 622 // the periodic dumps are not enabled.
584 memory_dump_config->Set(kTriggersParam, std::move(triggers_list)); 623 memory_dump_config->Set(kTriggersParam, std::move(triggers_list));
624
625 if (memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes !=
626 MemoryDumpHeapProfilerOptions::kDefaultBreakdownThresholdBytes) {
627 std::unique_ptr<base::DictionaryValue> heap_profiler_options(
628 new base::DictionaryValue());
629 heap_profiler_options->SetInteger(
630 kBreakdownThresholdBytes,
631 memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes);
632 memory_dump_config->Set(kHeapProfilerOptions,
633 std::move(heap_profiler_options));
634 }
585 dict.Set(kMemoryDumpConfigParam, std::move(memory_dump_config)); 635 dict.Set(kMemoryDumpConfigParam, std::move(memory_dump_config));
586 } 636 }
587 } 637 }
588 638
589 std::string TraceConfig::ToTraceOptionsString() const { 639 std::string TraceConfig::ToTraceOptionsString() const {
590 std::string ret; 640 std::string ret;
591 switch (record_mode_) { 641 switch (record_mode_) {
592 case RECORD_UNTIL_FULL: 642 case RECORD_UNTIL_FULL:
593 ret = kRecordUntilFull; 643 ret = kRecordUntilFull;
594 break; 644 break;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 str.at(0) == ' ' || 722 str.at(0) == ' ' ||
673 str.at(str.length() - 1) == ' '; 723 str.at(str.length() - 1) == ' ';
674 } 724 }
675 725
676 bool TraceConfig::HasIncludedPatterns() const { 726 bool TraceConfig::HasIncludedPatterns() const {
677 return !included_categories_.empty(); 727 return !included_categories_.empty();
678 } 728 }
679 729
680 } // namespace trace_event 730 } // namespace trace_event
681 } // namespace base 731 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698