1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
// Copyright 2016 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/memory_infra_background_whitelist.h"
#include <ctype.h>
#include <string.h>
#include <string>
namespace base {
namespace trace_event {
namespace {
// The names of dump providers whitelisted for background tracing. Dump
// providers can be added here only if the background mode dump has very
// less performance and memory overhead.
const char* const kDumpProviderWhitelist[] = {
"android::ResourceManagerImpl",
"BlinkGC",
"ChildDiscardableSharedMemoryManager",
"DOMStorage",
"HostDiscardableSharedMemoryManager",
"IndexedDBBackingStore",
"JavaHeap",
"LevelDB",
"LeveldbValueStore",
"Malloc",
"MemoryCache",
"PartitionAlloc",
"ProcessMemoryMetrics",
"Skia",
"Sql",
"V8Isolate",
"WinHeap",
"SyncDirectory",
nullptr // End of list marker.
};
// A list of string names that are allowed for the memory allocator dumps in
// background mode.
const char* const kAllocatorDumpNameWhitelist[] = {
"blink_gc",
"blink_gc/allocated_objects",
"discardable",
"discardable/child_0x?",
"dom_storage/0x?/cache_size",
"dom_storage/session_storage_0x?",
"java_heap",
"java_heap/allocated_objects",
"leveldb/index_db/0x?",
"leveldb/leveldb_proto/0x?",
"leveldb/value_store/Extensions.Database.Open.Settings/0x?",
"leveldb/value_store/Extensions.Database.Open.Rules/0x?",
"leveldb/value_store/Extensions.Database.Open.State/0x?",
"leveldb/value_store/Extensions.Database.Open/0x?",
"leveldb/value_store/Extensions.Database.Restore/0x?",
"leveldb/value_store/Extensions.Database.Value.Restore/0x?",
"malloc",
"malloc/allocated_objects",
"malloc/metadata_fragmentation_caches",
"web_cache/Image_resources",
"web_cache/CSS stylesheet_resources",
"web_cache/Script_resources",
"web_cache/XSL stylesheet_resources",
"web_cache/Font_resources",
"web_cache/Other_resources",
"partition_alloc/allocated_objects",
"partition_alloc/partitions",
"partition_alloc/partitions/buffer",
"partition_alloc/partitions/fast_malloc",
"partition_alloc/partitions/layout",
"skia/sk_glyph_cache",
"skia/sk_resource_cache",
"sqlite",
"ui/resource_manager_0x?",
"v8/isolate_0x?/heap_spaces",
"v8/isolate_0x?/heap_spaces/code_space",
"v8/isolate_0x?/heap_spaces/large_object_space",
"v8/isolate_0x?/heap_spaces/map_space",
"v8/isolate_0x?/heap_spaces/new_space",
"v8/isolate_0x?/heap_spaces/old_space",
"v8/isolate_0x?/heap_spaces/other_spaces",
"v8/isolate_0x?/malloc",
"v8/isolate_0x?/zapped_for_debug",
"winheap",
"winheap/allocated_objects",
"sync/0x?/kernel",
"sync/0x?/store",
nullptr // End of list marker.
};
const char* const* g_dump_provider_whitelist = kDumpProviderWhitelist;
const char* const* g_allocator_dump_name_whitelist =
kAllocatorDumpNameWhitelist;
} // namespace
bool IsMemoryDumpProviderWhitelisted(const char* mdp_name) {
for (size_t i = 0; g_dump_provider_whitelist[i] != nullptr; ++i) {
if (strcmp(mdp_name, g_dump_provider_whitelist[i]) == 0)
return true;
}
return false;
}
bool IsMemoryAllocatorDumpNameWhitelisted(const std::string& name) {
// Remove special characters, numbers (including hexadecimal which are marked
// by '0x') from the given string.
const size_t length = name.size();
std::string stripped_str;
stripped_str.reserve(length);
bool parsing_hex = false;
for (size_t i = 0; i < length; ++i) {
if (parsing_hex && isxdigit(name[i]))
continue;
parsing_hex = false;
if (i + 1 < length && name[i] == '0' && name[i + 1] == 'x') {
parsing_hex = true;
stripped_str.append("0x?");
++i;
} else {
stripped_str.push_back(name[i]);
}
}
for (size_t i = 0; g_allocator_dump_name_whitelist[i] != nullptr; ++i) {
if (stripped_str == g_allocator_dump_name_whitelist[i]) {
return true;
}
}
return false;
}
void SetDumpProviderWhitelistForTesting(const char* const* list) {
g_dump_provider_whitelist = list;
}
void SetAllocatorDumpNameWhitelistForTesting(const char* const* list) {
g_allocator_dump_name_whitelist = list;
}
} // namespace trace_event
} // namespace base
|