diff options
author | ssid <ssid@chromium.org> | 2015-04-14 08:32:37 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-14 15:32:56 +0000 |
commit | 07386850164a47409d7caf56cc5cd04a0ee58fce (patch) | |
tree | 0416d73e18da8ee6780379e1b2295a3301c2ecc7 /base/trace_event | |
parent | 0811a259dca90930c4ebe97b30a1eb9a94a554b1 (diff) | |
download | chromium_src-07386850164a47409d7caf56cc5cd04a0ee58fce.zip chromium_src-07386850164a47409d7caf56cc5cd04a0ee58fce.tar.gz chromium_src-07386850164a47409d7caf56cc5cd04a0ee58fce.tar.bz2 |
Add a dump provider to dump malloc allocation data.
This CL adds malloc_dump_provider to dump information about
allocations by using malloc(). It dumps total memory allocated
from system and total memory used by the objects from mallinfo()
function.
For more details see design doc http://goo.gl/fMR8lF.
BUG=443593
Review URL: https://codereview.chromium.org/1003113006
Cr-Commit-Position: refs/heads/master@{#325053}
Diffstat (limited to 'base/trace_event')
-rw-r--r-- | base/trace_event/BUILD.gn | 7 | ||||
-rw-r--r-- | base/trace_event/malloc_dump_provider.cc | 65 | ||||
-rw-r--r-- | base/trace_event/malloc_dump_provider.h | 37 | ||||
-rw-r--r-- | base/trace_event/trace_event.gypi | 8 |
4 files changed, 117 insertions, 0 deletions
diff --git a/base/trace_event/BUILD.gn b/base/trace_event/BUILD.gn index c0c6a05..d32bd28 100644 --- a/base/trace_event/BUILD.gn +++ b/base/trace_event/BUILD.gn @@ -46,6 +46,13 @@ source_set("trace_event") { ] } + if (is_linux || is_android) { + sources += [ + "malloc_dump_provider.cc", + "malloc_dump_provider.h", + ] + } + configs += [ "//base:base_implementation" ] deps = [ diff --git a/base/trace_event/malloc_dump_provider.cc b/base/trace_event/malloc_dump_provider.cc new file mode 100644 index 0000000..671ac65 --- /dev/null +++ b/base/trace_event/malloc_dump_provider.cc @@ -0,0 +1,65 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/trace_event/malloc_dump_provider.h" + +#include <malloc.h> + +#include "base/trace_event/process_memory_dump.h" + +namespace base { +namespace trace_event { + +namespace { + +const char kDumperFriendlyName[] = "Malloc"; +const char kDumperName[] = "malloc"; + +} // namespace + +// static +MallocDumpProvider* MallocDumpProvider::GetInstance() { + return Singleton<MallocDumpProvider, + LeakySingletonTraits<MallocDumpProvider>>::get(); +} + +MallocDumpProvider::MallocDumpProvider() { +} + +MallocDumpProvider::~MallocDumpProvider() { +} + +// Called at trace dump point time. Creates a snapshot the memory counters for +// the current process. +bool MallocDumpProvider::DumpInto(ProcessMemoryDump* pmd) { + struct mallinfo info = mallinfo(); + DCHECK(info.uordblks > 0); + DCHECK_GE(info.arena + info.hblkhd, info.uordblks); + + MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(kDumperName); + if (!dump) + return false; + + // When the system allocator is implemented by tcmalloc, the total physical + // size is given by |arena| and |hblkhd| is 0. In case of Android's jemalloc + // |arena| is 0 and the outer pages size is reported by |hblkhd|. In case of + // dlmalloc the total is given by |arena| + |hblkhd|. + // For more details see link: http://goo.gl/fMR8lF. + dump->set_physical_size_in_bytes(info.arena + info.hblkhd); + + // mallinfo doesn't support any allocated object count. + dump->set_allocated_objects_count(0); + + // Total allocated space is given by |uordblks|. + dump->set_allocated_objects_size_in_bytes(info.uordblks); + + return true; +} + +const char* MallocDumpProvider::GetFriendlyName() const { + return kDumperFriendlyName; +} + +} // namespace trace_event +} // namespace base diff --git a/base/trace_event/malloc_dump_provider.h b/base/trace_event/malloc_dump_provider.h new file mode 100644 index 0000000..b6f69736 --- /dev/null +++ b/base/trace_event/malloc_dump_provider.h @@ -0,0 +1,37 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_TRACE_EVENT_MALLOC_DUMP_PROVIDER_H_ +#define BASE_TRACE_EVENT_MALLOC_DUMP_PROVIDER_H_ + +#include <istream> + +#include "base/memory/singleton.h" +#include "base/trace_event/memory_dump_provider.h" + +namespace base { +namespace trace_event { + +// Dump provider which collects process-wide memory stats. +class BASE_EXPORT MallocDumpProvider : public MemoryDumpProvider { + public: + static MallocDumpProvider* GetInstance(); + + // MemoryDumpProvider implementation. + bool DumpInto(ProcessMemoryDump* pmd) override; + const char* GetFriendlyName() const override; + + private: + friend struct DefaultSingletonTraits<MallocDumpProvider>; + + MallocDumpProvider(); + ~MallocDumpProvider() override; + + DISALLOW_COPY_AND_ASSIGN(MallocDumpProvider); +}; + +} // namespace trace_event +} // namespace base + +#endif // BASE_TRACE_EVENT_MALLOC_DUMP_PROVIDER_H_ diff --git a/base/trace_event/trace_event.gypi b/base/trace_event/trace_event.gypi index 36e3ab3..9be9149 100644 --- a/base/trace_event/trace_event.gypi +++ b/base/trace_event/trace_event.gypi @@ -38,6 +38,14 @@ 'trace_event/trace_event_win.cc', 'trace_event/trace_event_win.h', ], + 'conditions': [ + ['OS == "linux" or OS == "android"', { + 'trace_event_sources': [ + 'trace_event/malloc_dump_provider.cc', + 'trace_event/malloc_dump_provider.h', + ], + }], + ], 'trace_event_test_sources' : [ 'trace_event/memory_allocator_dump_unittest.cc', 'trace_event/memory_dump_manager_unittest.cc', |