Index: tools/deep_memory_profiler/subcommands/expand.py |
diff --git a/tools/deep_memory_profiler/subcommands/expand.py b/tools/deep_memory_profiler/subcommands/expand.py |
index 088b6e9d10a087328b729921006cab40e588a411..00ff3628377f4d9f260a02907d6b2b81be537d29 100644 |
--- a/tools/deep_memory_profiler/subcommands/expand.py |
+++ b/tools/deep_memory_profiler/subcommands/expand.py |
@@ -87,52 +87,60 @@ class ExpandCommand(SubCommand): |
@staticmethod |
def _accumulate(dump, policy, bucket_set, component_name, depth, sizes): |
- rule = policy.find_rule(component_name) |
- if not rule: |
- pass |
- elif rule.allocator_type == 'malloc': |
- for bucket_id, _, committed, allocs, frees in dump.iter_stacktrace: |
- bucket = bucket_set.get(bucket_id) |
- if not bucket or bucket.allocator_type == 'malloc': |
- component_match = policy.find_malloc(bucket) |
- elif bucket.allocator_type == 'mmap': |
- continue |
- else: |
- assert False |
- if component_match == component_name: |
- precedence = '' |
- precedence += '(alloc=%d) ' % allocs |
- precedence += '(free=%d) ' % frees |
- if bucket.typeinfo: |
- precedence += '(type=%s) ' % bucket.symbolized_typeinfo |
- precedence += '(type.name=%s) ' % bucket.typeinfo_name |
- ExpandCommand._add_size(precedence, bucket, depth, committed, sizes) |
- elif rule.allocator_type == 'mmap': |
- for _, region in dump.iter_map: |
- if region[0] != 'hooked': |
- continue |
- component_match, bucket = policy.find_mmap(region, bucket_set) |
- if component_match == component_name: |
- ExpandCommand._add_size('', bucket, depth, |
- region[1]['committed'], sizes) |
- elif rule.allocator_type == 'unhooked': |
- for addr, region in dump.iter_map: |
- if region[0] != 'unhooked': |
- continue |
- component_match = policy.find_unhooked(region) |
- if component_match == component_name: |
- precedence = '' |
- precedence += '%s-' % hex(addr[0])[2:] |
- precedence += '%s' % hex(addr[1])[2:] |
- precedence += ' %s' % region[1]['vma']['readable'] |
- precedence += '%s' % region[1]['vma']['writable'] |
- precedence += '%s' % region[1]['vma']['executable'] |
- precedence += '%s' % region[1]['vma']['private'] |
- precedence += ' %s' % region[1]['vma']['offset'] |
- precedence += ' %s:' % region[1]['vma']['major'] |
- precedence += '%s' % region[1]['vma']['minor'] |
- precedence += ' %s' % region[1]['vma']['inode'] |
- precedence += ' %s' % region[1]['vma']['name'] |
- if not precedence in sizes: |
- sizes[precedence] = 0 |
- sizes[precedence] += region[1]['committed'] |
+ allocator_type = [] |
+ rule = None |
+ while True: |
+ rule = policy.find_rule(component_name, rule) |
+ if not rule: |
+ break |
+ if rule.allocator_type not in allocator_type: |
+ allocator_type.append(rule.allocator_type) |
+ else: |
+ continue |
+ |
+ if rule.allocator_type == 'malloc': |
+ for bucket_id, _, committed, allocs, frees in dump.iter_stacktrace: |
+ bucket = bucket_set.get(bucket_id) |
+ if not bucket or bucket.allocator_type == 'malloc': |
+ component_match = policy.find_malloc(bucket) |
+ elif bucket.allocator_type == 'mmap': |
+ continue |
+ else: |
+ assert False |
+ if component_match == component_name: |
+ precedence = '' |
+ precedence += '(alloc=%d) ' % allocs |
+ precedence += '(free=%d) ' % frees |
+ if bucket.typeinfo: |
+ precedence += '(type=%s) ' % bucket.symbolized_typeinfo |
+ precedence += '(type.name=%s) ' % bucket.typeinfo_name |
+ ExpandCommand._add_size(precedence, bucket, depth, committed, sizes) |
+ elif rule.allocator_type == 'mmap': |
+ for _, region in dump.iter_map: |
+ if region[0] != 'hooked': |
+ continue |
+ component_match, bucket = policy.find_mmap(region, bucket_set) |
+ if component_match == component_name: |
+ ExpandCommand._add_size('', bucket, depth, |
+ region[1]['committed'], sizes) |
+ elif rule.allocator_type == 'unhooked': |
+ for addr, region in dump.iter_map: |
+ if region[0] != 'unhooked': |
+ continue |
+ component_match = policy.find_unhooked(region) |
+ if component_match == component_name: |
+ precedence = '' |
+ precedence += '%s-' % hex(addr[0])[2:] |
+ precedence += '%s' % hex(addr[1])[2:] |
+ precedence += ' %s' % region[1]['vma']['readable'] |
+ precedence += '%s' % region[1]['vma']['writable'] |
+ precedence += '%s' % region[1]['vma']['executable'] |
+ precedence += '%s' % region[1]['vma']['private'] |
+ precedence += ' %s' % region[1]['vma']['offset'] |
+ precedence += ' %s:' % region[1]['vma']['major'] |
+ precedence += '%s' % region[1]['vma']['minor'] |
+ precedence += ' %s' % region[1]['vma']['inode'] |
+ precedence += ' %s' % region[1]['vma']['name'] |
+ if not precedence in sizes: |
+ sizes[precedence] = 0 |
+ sizes[precedence] += region[1]['committed'] |