21 function_info_index_(function_info_index),
24 id_(tree->next_node_id()) {
34 unsigned function_info_index) {
43 unsigned function_info_index) {
45 if (child ==
nullptr) {
61 if (tracker !=
nullptr) {
64 base::OS::Print(
"%s #%u", info->name,
id_);
68 base::OS::Print(
"\n");
71 node->Print(indent, tracker);
84 for (
const unsigned* entry = path.
begin() + path.
length() - 1;
85 entry != path.
begin() - 1; --entry) {
86 node = node->FindOrAddChild(*entry);
92 base::OS::Print(
"[AllocationTraceTree:]\n");
93 base::OS::Print(
"Total size | Allocation count | Function id | id\n");
107 unsigned trace_node_id) {
112 ranges_.insert(RangeMap::value_type(
end, new_range));
117 RangeMap::const_iterator it = ranges_.upper_bound(addr);
118 if (it == ranges_.end())
return 0;
119 if (it->second.start <= addr) {
120 return it->second.trace_node_id;
127 unsigned trace_node_id = GetTraceNodeId(from);
128 if (trace_node_id == 0)
return;
129 RemoveRange(from, from + size);
130 AddRange(to, size, trace_node_id);
140 PrintF(
"[AddressToTraceMap (%zu): \n", ranges_.size());
141 for (RangeMap::iterator it = ranges_.begin(); it != ranges_.end(); ++it) {
142 PrintF(
"[%p - %p] => %u\n",
reinterpret_cast<void*
>(it->second.start),
143 reinterpret_cast<void*
>(it->first), it->second.trace_node_id);
150 RangeMap::iterator it = ranges_.upper_bound(
start);
151 if (it == ranges_.end())
return;
155 RangeMap::iterator to_remove_begin = it;
156 if (it->second.start <
start) {
157 prev_range = it->second;
160 if (it->first >
end) {
161 if (it->second.start <
end) {
162 it->second.start =
end;
167 }
while (it != ranges_.end());
169 ranges_.erase(to_remove_begin, it);
171 if (prev_range.
start != 0) {
172 ranges_.insert(RangeMap::value_type(
start, prev_range));
182 info->name =
"(root)";
196 heap->CreateFillerObjectAt(addr, size);
236 script_.Reset(local_script->GetIsolate(), local_script);
249 script_data->
script_.ClearWeak();
260 CHECK(inserted.second);
261 return inserted.first->second.line_ends();
263 return it->second.line_ends();
270 if (script->has_line_ends()) {
271 script->GetPositionInfo(
start, &position_info);
273 script->GetPositionInfoWithLineEnds(
start, &position_info,
276 return position_info;
284 if (entry->
value ==
nullptr) {
287 info->function_id = id;
288 if (IsScript(shared->script())) {
290 if (IsName(script->name())) {
294 info->script_id = script->id();
295 info->start_position = shared->StartPosition();
298 info->line = position_info.
line;
299 info->column = position_info.
column;
304 return static_cast<unsigned>(
reinterpret_cast<intptr_t
>((entry->
value)));
308 if (state !=
OTHER)
return 0;
311 info->name =
"(V8 API)";
Entry * LookupOrInsert(const Key &key, uint32_t hash)
constexpr T * begin() const
void MoveObject(Address from, Address to, int size)
void AddRange(Address addr, int size, unsigned node_id)
void RemoveRange(Address start, Address end)
unsigned GetTraceNodeId(Address addr)
std::vector< AllocationTraceNode * > children_
AllocationTraceTree * tree_
unsigned function_info_index_
AllocationTraceNode * FindOrAddChild(unsigned function_info_index)
void AddAllocation(unsigned size)
unsigned allocation_count_
AllocationTraceNode(AllocationTraceTree *tree, unsigned function_info_index)
void Print(int indent, AllocationTracker *tracker)
unsigned function_info_index() const
AllocationTraceNode * FindChild(unsigned function_info_index)
AllocationTraceNode * AddPathFromEnd(base::Vector< const unsigned > path)
V8_EXPORT_PRIVATE void Print(AllocationTracker *tracker)
AllocationTraceNode * root()
AllocationTracker * tracker_
static void HandleWeakScript(const v8::WeakCallbackInfo< ScriptData > &)
ScriptData(Tagged< Script >, Isolate *, AllocationTracker *)
Global< debug::Script > script_
base::HashMap id_to_function_info_index_
unsigned info_index_for_other_state_
AddressToTraceMap address_to_trace_
unsigned functionInfoIndexForVMState(StateTag state)
unsigned allocation_trace_buffer_[kMaxAllocationTraceLength]
AllocationTraceTree trace_tree_
unsigned AddFunctionInfo(Tagged< SharedFunctionInfo > info, SnapshotObjectId id, Isolate *isolate)
std::vector< FunctionInfo * > function_info_list_
Script::PositionInfo GetScriptPositionInfo(Tagged< Script > script, Isolate *isolate, int start)
static const int kMaxAllocationTraceLength
ScriptsDataMap scripts_data_map_
String::LineEndsVector & GetOrCreateLineEnds(Tagged< Script > script, Isolate *isolate)
AllocationTracker(HeapObjectsMap *ids, StringsStorage *names)
void AllocationEvent(Address addr, int size)
const std::vector< FunctionInfo * > & function_info_list() const
SnapshotObjectId FindOrAddEntry(Address addr, unsigned int size, MarkEntryAccessed accessed=MarkEntryAccessed::kYes, IsNativeObject is_native_object=IsNativeObject::kNo)
static Isolate * FromHeap(const Heap *heap)
Tagged< JSFunction > function() const override
const char * GetCopy(const char *src)
const char * GetName(Tagged< Name > name)
Handle< SharedFunctionInfo > info
void PrintF(const char *format,...)
uint32_t ComputeUnseededHash(uint32_t key)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
static uint32_t SnapshotObjectIdHash(SnapshotObjectId id)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
v8::Local< T > ToApiHandle(v8::internal::DirectHandle< v8::internal::Object > obj)
uint32_t SnapshotObjectId