OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import logging | 5 import logging |
6 import sys | 6 import sys |
7 | 7 |
8 from lib.policy import PolicySet | 8 from lib.policy import PolicySet |
9 from lib.subcommand import SubCommand | 9 from lib.subcommand import SubCommand |
10 | 10 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 0 : min(len(bucket.symbolized_stackfunction), 1 + depth)], | 80 0 : min(len(bucket.symbolized_stackfunction), 1 + depth)], |
81 bucket.symbolized_stacksourcefile[ | 81 bucket.symbolized_stacksourcefile[ |
82 0 : min(len(bucket.symbolized_stacksourcefile), 1 + depth)]): | 82 0 : min(len(bucket.symbolized_stacksourcefile), 1 + depth)]): |
83 stacktrace_sequence += '%s(@%s) ' % (function, sourcefile) | 83 stacktrace_sequence += '%s(@%s) ' % (function, sourcefile) |
84 if not stacktrace_sequence in sizes: | 84 if not stacktrace_sequence in sizes: |
85 sizes[stacktrace_sequence] = 0 | 85 sizes[stacktrace_sequence] = 0 |
86 sizes[stacktrace_sequence] += committed | 86 sizes[stacktrace_sequence] += committed |
87 | 87 |
88 @staticmethod | 88 @staticmethod |
89 def _accumulate(dump, policy, bucket_set, component_name, depth, sizes): | 89 def _accumulate(dump, policy, bucket_set, component_name, depth, sizes): |
90 rule = policy.find_rule(component_name) | 90 allocator_type = [] |
91 if not rule: | 91 rule = None |
92 pass | 92 while True: |
93 elif rule.allocator_type == 'malloc': | 93 rule = policy.find_rule(component_name, rule) |
94 for bucket_id, _, committed, allocs, frees in dump.iter_stacktrace: | 94 if not rule: |
95 bucket = bucket_set.get(bucket_id) | 95 break |
96 if not bucket or bucket.allocator_type == 'malloc': | 96 if rule.allocator_type not in allocator_type: |
97 component_match = policy.find_malloc(bucket) | 97 allocator_type.append(rule.allocator_type) |
98 elif bucket.allocator_type == 'mmap': | 98 else: |
99 continue | 99 continue |
100 else: | 100 |
101 assert False | 101 if rule.allocator_type == 'malloc': |
102 if component_match == component_name: | 102 for bucket_id, _, committed, allocs, frees in dump.iter_stacktrace: |
103 precedence = '' | 103 bucket = bucket_set.get(bucket_id) |
104 precedence += '(alloc=%d) ' % allocs | 104 if not bucket or bucket.allocator_type == 'malloc': |
105 precedence += '(free=%d) ' % frees | 105 component_match = policy.find_malloc(bucket) |
106 if bucket.typeinfo: | 106 elif bucket.allocator_type == 'mmap': |
107 precedence += '(type=%s) ' % bucket.symbolized_typeinfo | 107 continue |
108 precedence += '(type.name=%s) ' % bucket.typeinfo_name | 108 else: |
109 ExpandCommand._add_size(precedence, bucket, depth, committed, sizes) | 109 assert False |
110 elif rule.allocator_type == 'mmap': | 110 if component_match == component_name: |
111 for _, region in dump.iter_map: | 111 precedence = '' |
112 if region[0] != 'hooked': | 112 precedence += '(alloc=%d) ' % allocs |
113 continue | 113 precedence += '(free=%d) ' % frees |
114 component_match, bucket = policy.find_mmap(region, bucket_set) | 114 if bucket.typeinfo: |
115 if component_match == component_name: | 115 precedence += '(type=%s) ' % bucket.symbolized_typeinfo |
116 ExpandCommand._add_size('', bucket, depth, | 116 precedence += '(type.name=%s) ' % bucket.typeinfo_name |
117 region[1]['committed'], sizes) | 117 ExpandCommand._add_size(precedence, bucket, depth, committed, sizes) |
118 elif rule.allocator_type == 'unhooked': | 118 elif rule.allocator_type == 'mmap': |
119 for addr, region in dump.iter_map: | 119 for _, region in dump.iter_map: |
120 if region[0] != 'unhooked': | 120 if region[0] != 'hooked': |
121 continue | 121 continue |
122 component_match = policy.find_unhooked(region) | 122 component_match, bucket = policy.find_mmap(region, bucket_set) |
123 if component_match == component_name: | 123 if component_match == component_name: |
124 precedence = '' | 124 ExpandCommand._add_size('', bucket, depth, |
125 precedence += '%s-' % hex(addr[0])[2:] | 125 region[1]['committed'], sizes) |
126 precedence += '%s' % hex(addr[1])[2:] | 126 elif rule.allocator_type == 'unhooked': |
127 precedence += ' %s' % region[1]['vma']['readable'] | 127 for addr, region in dump.iter_map: |
128 precedence += '%s' % region[1]['vma']['writable'] | 128 if region[0] != 'unhooked': |
129 precedence += '%s' % region[1]['vma']['executable'] | 129 continue |
130 precedence += '%s' % region[1]['vma']['private'] | 130 component_match = policy.find_unhooked(region) |
131 precedence += ' %s' % region[1]['vma']['offset'] | 131 if component_match == component_name: |
132 precedence += ' %s:' % region[1]['vma']['major'] | 132 precedence = '' |
133 precedence += '%s' % region[1]['vma']['minor'] | 133 precedence += '%s-' % hex(addr[0])[2:] |
134 precedence += ' %s' % region[1]['vma']['inode'] | 134 precedence += '%s' % hex(addr[1])[2:] |
135 precedence += ' %s' % region[1]['vma']['name'] | 135 precedence += ' %s' % region[1]['vma']['readable'] |
136 if not precedence in sizes: | 136 precedence += '%s' % region[1]['vma']['writable'] |
137 sizes[precedence] = 0 | 137 precedence += '%s' % region[1]['vma']['executable'] |
138 sizes[precedence] += region[1]['committed'] | 138 precedence += '%s' % region[1]['vma']['private'] |
| 139 precedence += ' %s' % region[1]['vma']['offset'] |
| 140 precedence += ' %s:' % region[1]['vma']['major'] |
| 141 precedence += '%s' % region[1]['vma']['minor'] |
| 142 precedence += ' %s' % region[1]['vma']['inode'] |
| 143 precedence += ' %s' % region[1]['vma']['name'] |
| 144 if not precedence in sizes: |
| 145 sizes[precedence] = 0 |
| 146 sizes[precedence] += region[1]['committed'] |
OLD | NEW |