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 2bb54563775f844314dc8a5c28ef6093138df431..48650c5cb4b42be0e07ad4187bafd7330d4f6c84 100644 |
--- a/tools/deep_memory_profiler/subcommands/expand.py |
+++ b/tools/deep_memory_profiler/subcommands/expand.py |
@@ -87,31 +87,39 @@ 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) |
+ 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) |