Commit 24c207be authored by Siddhartha's avatar Siddhartha Committed by Commit Bot

Make trace buffer size configurable

Add a config param to limit the total trace buffer size

BUG=859260

Change-Id: Ic15e5aa0d381273eadcdad270d955441386cd288
Reviewed-on: https://chromium-review.googlesource.com/1182510
Commit-Queue: Siddhartha S <ssid@chromium.org>
Reviewed-by: default avataroysteine <oysteine@chromium.org>
Cr-Commit-Position: refs/heads/master@{#584654}
parent 2d12ef93
...@@ -31,6 +31,7 @@ const char kEnableArgumentFilter[] = "enable-argument-filter"; ...@@ -31,6 +31,7 @@ const char kEnableArgumentFilter[] = "enable-argument-filter";
// String parameters that can be used to parse the trace config string. // String parameters that can be used to parse the trace config string.
const char kRecordModeParam[] = "record_mode"; const char kRecordModeParam[] = "record_mode";
const char kTraceBufferSizeInEvents[] = "trace_buffer_size_in_events";
const char kEnableSystraceParam[] = "enable_systrace"; const char kEnableSystraceParam[] = "enable_systrace";
const char kEnableArgumentFilterParam[] = "enable_argument_filter"; const char kEnableArgumentFilterParam[] = "enable_argument_filter";
...@@ -287,6 +288,7 @@ TraceConfig& TraceConfig::operator=(const TraceConfig& rhs) { ...@@ -287,6 +288,7 @@ TraceConfig& TraceConfig::operator=(const TraceConfig& rhs) {
return *this; return *this;
record_mode_ = rhs.record_mode_; record_mode_ = rhs.record_mode_;
trace_buffer_size_in_events_ = rhs.trace_buffer_size_in_events_;
enable_systrace_ = rhs.enable_systrace_; enable_systrace_ = rhs.enable_systrace_;
enable_argument_filter_ = rhs.enable_argument_filter_; enable_argument_filter_ = rhs.enable_argument_filter_;
category_filter_ = rhs.category_filter_; category_filter_ = rhs.category_filter_;
...@@ -326,6 +328,8 @@ void TraceConfig::Merge(const TraceConfig& config) { ...@@ -326,6 +328,8 @@ void TraceConfig::Merge(const TraceConfig& config) {
DLOG(ERROR) << "Attempting to merge trace config with a different " DLOG(ERROR) << "Attempting to merge trace config with a different "
<< "set of options."; << "set of options.";
} }
DCHECK_EQ(trace_buffer_size_in_events_, config.trace_buffer_size_in_events_)
<< "Cannot change trace buffer size";
category_filter_.Merge(config.category_filter_); category_filter_.Merge(config.category_filter_);
memory_dump_config_.Merge(config.memory_dump_config_); memory_dump_config_.Merge(config.memory_dump_config_);
...@@ -337,6 +341,7 @@ void TraceConfig::Merge(const TraceConfig& config) { ...@@ -337,6 +341,7 @@ void TraceConfig::Merge(const TraceConfig& config) {
void TraceConfig::Clear() { void TraceConfig::Clear() {
record_mode_ = RECORD_UNTIL_FULL; record_mode_ = RECORD_UNTIL_FULL;
trace_buffer_size_in_events_ = 0;
enable_systrace_ = false; enable_systrace_ = false;
enable_argument_filter_ = false; enable_argument_filter_ = false;
category_filter_.Clear(); category_filter_.Clear();
...@@ -347,6 +352,7 @@ void TraceConfig::Clear() { ...@@ -347,6 +352,7 @@ void TraceConfig::Clear() {
void TraceConfig::InitializeDefault() { void TraceConfig::InitializeDefault() {
record_mode_ = RECORD_UNTIL_FULL; record_mode_ = RECORD_UNTIL_FULL;
trace_buffer_size_in_events_ = 0;
enable_systrace_ = false; enable_systrace_ = false;
enable_argument_filter_ = false; enable_argument_filter_ = false;
} }
...@@ -365,6 +371,9 @@ void TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) { ...@@ -365,6 +371,9 @@ void TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) {
record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE; record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
} }
} }
int buffer_size = 0;
trace_buffer_size_in_events_ =
dict.GetInteger(kTraceBufferSizeInEvents, &buffer_size) ? buffer_size : 0;
bool val; bool val;
enable_systrace_ = dict.GetBoolean(kEnableSystraceParam, &val) ? val : false; enable_systrace_ = dict.GetBoolean(kEnableSystraceParam, &val) ? val : false;
...@@ -403,6 +412,7 @@ void TraceConfig::InitializeFromStrings(StringPiece category_filter_string, ...@@ -403,6 +412,7 @@ void TraceConfig::InitializeFromStrings(StringPiece category_filter_string,
category_filter_.InitializeFromString(category_filter_string); category_filter_.InitializeFromString(category_filter_string);
record_mode_ = RECORD_UNTIL_FULL; record_mode_ = RECORD_UNTIL_FULL;
trace_buffer_size_in_events_ = 0;
enable_systrace_ = false; enable_systrace_ = false;
enable_argument_filter_ = false; enable_argument_filter_ = false;
if (!trace_options_string.empty()) { if (!trace_options_string.empty()) {
...@@ -535,6 +545,8 @@ std::unique_ptr<DictionaryValue> TraceConfig::ToDict() const { ...@@ -535,6 +545,8 @@ std::unique_ptr<DictionaryValue> TraceConfig::ToDict() const {
TraceConfig::TraceRecordModeToStr(record_mode_)); TraceConfig::TraceRecordModeToStr(record_mode_));
dict->SetBoolean(kEnableSystraceParam, enable_systrace_); dict->SetBoolean(kEnableSystraceParam, enable_systrace_);
dict->SetBoolean(kEnableArgumentFilterParam, enable_argument_filter_); dict->SetBoolean(kEnableArgumentFilterParam, enable_argument_filter_);
if (trace_buffer_size_in_events_ > 0)
dict->SetInteger(kTraceBufferSizeInEvents, trace_buffer_size_in_events_);
category_filter_.ToDict(dict.get()); category_filter_.ToDict(dict.get());
process_filter_config_.ToDict(dict.get()); process_filter_config_.ToDict(dict.get());
......
...@@ -226,10 +226,16 @@ class BASE_EXPORT TraceConfig { ...@@ -226,10 +226,16 @@ class BASE_EXPORT TraceConfig {
TraceConfig& operator=(const TraceConfig& rhs); TraceConfig& operator=(const TraceConfig& rhs);
TraceRecordMode GetTraceRecordMode() const { return record_mode_; } TraceRecordMode GetTraceRecordMode() const { return record_mode_; }
size_t GetTraceBufferSizeInEvents() const {
return trace_buffer_size_in_events_;
}
bool IsSystraceEnabled() const { return enable_systrace_; } bool IsSystraceEnabled() const { return enable_systrace_; }
bool IsArgumentFilterEnabled() const { return enable_argument_filter_; } bool IsArgumentFilterEnabled() const { return enable_argument_filter_; }
void SetTraceRecordMode(TraceRecordMode mode) { record_mode_ = mode; } void SetTraceRecordMode(TraceRecordMode mode) { record_mode_ = mode; }
void SetTraceBufferSizeInEvents(size_t size) {
trace_buffer_size_in_events_ = size;
}
void EnableSystrace() { enable_systrace_ = true; } void EnableSystrace() { enable_systrace_ = true; }
void EnableArgumentFilter() { enable_argument_filter_ = true; } void EnableArgumentFilter() { enable_argument_filter_ = true; }
...@@ -304,6 +310,7 @@ class BASE_EXPORT TraceConfig { ...@@ -304,6 +310,7 @@ class BASE_EXPORT TraceConfig {
std::string ToTraceOptionsString() const; std::string ToTraceOptionsString() const;
TraceRecordMode record_mode_; TraceRecordMode record_mode_;
size_t trace_buffer_size_in_events_ = 0; // 0 specifies default size
bool enable_systrace_ : 1; bool enable_systrace_ : 1;
bool enable_argument_filter_ : 1; bool enable_argument_filter_ : 1;
......
...@@ -60,7 +60,8 @@ const char kCustomTraceConfigString[] = ...@@ -60,7 +60,8 @@ const char kCustomTraceConfigString[] =
"}" "}"
"]" "]"
"}," "},"
"\"record_mode\":\"record-continuously\"" "\"record_mode\":\"record-continuously\","
"\"trace_buffer_size_in_events\":100"
"}"; "}";
void CheckDefaultTraceConfigBehavior(const TraceConfig& tc) { void CheckDefaultTraceConfigBehavior(const TraceConfig& tc) {
...@@ -348,6 +349,7 @@ TEST(TraceConfigTest, TraceConfigFromDict) { ...@@ -348,6 +349,7 @@ TEST(TraceConfigTest, TraceConfigFromDict) {
EXPECT_EQ(RECORD_CONTINUOUSLY, custom_tc.GetTraceRecordMode()); EXPECT_EQ(RECORD_CONTINUOUSLY, custom_tc.GetTraceRecordMode());
EXPECT_TRUE(custom_tc.IsSystraceEnabled()); EXPECT_TRUE(custom_tc.IsSystraceEnabled());
EXPECT_TRUE(custom_tc.IsArgumentFilterEnabled()); EXPECT_TRUE(custom_tc.IsArgumentFilterEnabled());
EXPECT_EQ(100u, custom_tc.GetTraceBufferSizeInEvents());
EXPECT_STREQ( EXPECT_STREQ(
"included,inc_pattern*," "included,inc_pattern*,"
"disabled-by-default-cc,disabled-by-default-memory-infra," "disabled-by-default-cc,disabled-by-default-memory-infra,"
......
...@@ -2699,6 +2699,16 @@ TEST_F(TraceEventTestFixture, TraceRecordAsMuchAsPossibleMode) { ...@@ -2699,6 +2699,16 @@ TEST_F(TraceEventTestFixture, TraceRecordAsMuchAsPossibleMode) {
TraceLog::GetInstance()->SetDisabled(); TraceLog::GetInstance()->SetDisabled();
} }
TEST_F(TraceEventTestFixture, ConfigTraceBufferLimit) {
const size_t kLimit = 2048;
TraceConfig config(kRecordAllCategoryFilter, RECORD_UNTIL_FULL);
config.SetTraceBufferSizeInEvents(kLimit);
TraceLog::GetInstance()->SetEnabled(config, TraceLog::RECORDING_MODE);
TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
EXPECT_EQ(kLimit, buffer->Capacity());
TraceLog::GetInstance()->SetDisabled();
}
void BlockUntilStopped(WaitableEvent* task_start_event, void BlockUntilStopped(WaitableEvent* task_start_event,
WaitableEvent* task_stop_event) { WaitableEvent* task_stop_event) {
task_start_event->Signal(); task_start_event->Signal();
......
...@@ -625,7 +625,11 @@ void TraceLog::SetEnabled(const TraceConfig& trace_config, ...@@ -625,7 +625,11 @@ void TraceLog::SetEnabled(const TraceConfig& trace_config,
if (!(modes_to_enable & RECORDING_MODE) || already_recording) if (!(modes_to_enable & RECORDING_MODE) || already_recording)
return; return;
if (new_options != old_options) { // Discard events if new trace options are different. Reducing trace buffer
// size is not supported while already recording, so only replace trace
// buffer if we were not already recording.
if (new_options != old_options ||
(trace_config_.GetTraceBufferSizeInEvents() && !already_recording)) {
subtle::NoBarrier_Store(&trace_options_, new_options); subtle::NoBarrier_Store(&trace_options_, new_options);
UseNextTraceBuffer(); UseNextTraceBuffer();
} }
...@@ -1718,20 +1722,26 @@ void TraceLog::SetCurrentThreadBlocksMessageLoop() { ...@@ -1718,20 +1722,26 @@ void TraceLog::SetCurrentThreadBlocksMessageLoop() {
TraceBuffer* TraceLog::CreateTraceBuffer() { TraceBuffer* TraceLog::CreateTraceBuffer() {
HEAP_PROFILER_SCOPED_IGNORE; HEAP_PROFILER_SCOPED_IGNORE;
InternalTraceOptions options = trace_options(); InternalTraceOptions options = trace_options();
const size_t config_buffer_chunks =
trace_config_.GetTraceBufferSizeInEvents() / kTraceBufferChunkSize;
if (options & kInternalRecordContinuously) { if (options & kInternalRecordContinuously) {
return TraceBuffer::CreateTraceBufferRingBuffer( return TraceBuffer::CreateTraceBufferRingBuffer(
kTraceEventRingBufferChunks); config_buffer_chunks > 0 ? config_buffer_chunks
: kTraceEventRingBufferChunks);
} }
if (options & kInternalEchoToConsole) { if (options & kInternalEchoToConsole) {
return TraceBuffer::CreateTraceBufferRingBuffer( return TraceBuffer::CreateTraceBufferRingBuffer(
kEchoToConsoleTraceEventBufferChunks); config_buffer_chunks > 0 ? config_buffer_chunks
: kEchoToConsoleTraceEventBufferChunks);
} }
if (options & kInternalRecordAsMuchAsPossible) { if (options & kInternalRecordAsMuchAsPossible) {
return TraceBuffer::CreateTraceBufferVectorOfSize( return TraceBuffer::CreateTraceBufferVectorOfSize(
kTraceEventVectorBigBufferChunks); config_buffer_chunks > 0 ? config_buffer_chunks
: kTraceEventVectorBigBufferChunks);
} }
return TraceBuffer::CreateTraceBufferVectorOfSize( return TraceBuffer::CreateTraceBufferVectorOfSize(
kTraceEventVectorBufferChunks); config_buffer_chunks > 0 ? config_buffer_chunks
: kTraceEventVectorBufferChunks);
} }
#if defined(OS_WIN) #if defined(OS_WIN)
......
...@@ -369,6 +369,7 @@ class BASE_EXPORT TraceLog : public MemoryDumpProvider { ...@@ -369,6 +369,7 @@ class BASE_EXPORT TraceLog : public MemoryDumpProvider {
ConvertTraceConfigToInternalOptions); ConvertTraceConfigToInternalOptions);
FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
TraceRecordAsMuchAsPossibleMode); TraceRecordAsMuchAsPossibleMode);
FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, ConfigTraceBufferLimit);
friend class base::NoDestructor<TraceLog>; friend class base::NoDestructor<TraceLog>;
......
...@@ -67,6 +67,8 @@ TraceStartupConfig::GetDefaultBrowserStartupConfig() { ...@@ -67,6 +67,8 @@ TraceStartupConfig::GetDefaultBrowserStartupConfig() {
// Filter only browser process events. // Filter only browser process events.
base::trace_event::TraceConfig::ProcessFilterConfig process_config( base::trace_event::TraceConfig::ProcessFilterConfig process_config(
{base::GetCurrentProcId()}); {base::GetCurrentProcId()});
// First 10k events at start are sufficient to debug startup traces.
trace_config.SetTraceBufferSizeInEvents(10000);
trace_config.SetProcessFilterConfig(process_config); trace_config.SetProcessFilterConfig(process_config);
// Enable argument filter since we could be background tracing. // Enable argument filter since we could be background tracing.
trace_config.EnableArgumentFilter(); trace_config.EnableArgumentFilter();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment