| Index: tools/memory_inspector/memory_inspector/backends/android/native_heap_dump_parser.py
|
| diff --git a/tools/memory_inspector/memory_inspector/backends/android/native_heap_dump_parser.py b/tools/memory_inspector/memory_inspector/backends/android/native_heap_dump_parser.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eb6a0d873d9b0691c127a24ab1483901aa56ca63
|
| --- /dev/null
|
| +++ b/tools/memory_inspector/memory_inspector/backends/android/native_heap_dump_parser.py
|
| @@ -0,0 +1,56 @@
|
| +# Copyright 2014 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.
|
| +
|
| +"""This parser turns the heap_dump output into a |NativeHeap| object."""
|
| +
|
| +import json
|
| +
|
| +from memory_inspector.core import native_heap
|
| +from memory_inspector.core import stacktrace
|
| +
|
| +
|
| +# These are defined in heap_profiler/heap_profiler.h
|
| +FLAGS_MALLOC = 1
|
| +FLAGS_MMAP = 2
|
| +FLAGS_MMAP_FILE = 4
|
| +FLAGS_IN_ZYGOTE = 8
|
| +
|
| +
|
| +def Parse(content):
|
| + """Parses the output of the heap_dump binary (part of libheap_profiler).
|
| +
|
| + heap_dump provides a conveniente JSON output.
|
| + See the header of tools/android/heap_profiler/heap_dump.c for more details.
|
| +
|
| + Args:
|
| + content: string containing the command output.
|
| +
|
| + Returns:
|
| + An instance of |native_heap.NativeHeap|.
|
| + """
|
| + data = json.loads(content)
|
| + assert('allocs' in data), 'Need to run heap_dump with the -x (extended) arg.'
|
| + nativeheap = native_heap.NativeHeap()
|
| + strace_by_index = {} # index (str) -> |stacktrace.Stacktrace|
|
| +
|
| + for index, entry in data['stacks'].iteritems():
|
| + strace = stacktrace.Stacktrace()
|
| + for absolute_addr in entry['f']:
|
| + strace.Add(nativeheap.GetStackFrame(absolute_addr))
|
| + strace_by_index[index] = strace
|
| +
|
| + for start_addr, entry in data['allocs'].iteritems():
|
| + flags = int(entry['f'])
|
| + # TODO(primiano): For the moment we just skip completely the allocations
|
| + # made in the Zygote (pre-fork) because this is usually reasonable. In the
|
| + # near future we will expose them with some UI to selectively filter them.
|
| + if flags & FLAGS_IN_ZYGOTE:
|
| + continue
|
| + nativeheap.Add(native_heap.Allocation(
|
| + size=entry['l'],
|
| + stack_trace=strace_by_index[entry['s']],
|
| + start=int(start_addr, 16),
|
| + flags=flags))
|
| +
|
| + return nativeheap
|
|
|