def testProcessMemoryDump_composability(self): java_spaces = 100 process = mock.Mock() process.pid = 1234 allocators = {'v8': {'size': 10}} mmaps = {'/dev/ashmem/dalvik-space-foo': {'pss': java_spaces}} events = [ MakeRawMemoryDumpEvent(pid=process.pid, allocators=allocators), MakeRawMemoryDumpEvent(pid=process.pid, mmaps=mmaps) ] memory_dump = memory_dump_event.ProcessMemoryDumpEvent(process, events) self.assertEquals(memory_dump._allocators, allocators) EXPECTED_MMAPS = { '/': java_spaces, '/Android/Java runtime': java_spaces, '/Android': java_spaces, } self.assertTrue(memory_dump.has_mmaps) for path, value in EXPECTED_MMAPS.iteritems(): self.assertEquals( value, memory_dump.GetMemoryBucket(path).GetValue( 'proportional_resident'))
def testDumpEventsTiming(self): process = mock.Mock() process.pid = 1 composable_dump = memory_dump_event.ProcessMemoryDumpEvent( process, [ MakeRawMemoryDumpEvent(pid=process.pid, start=8), MakeRawMemoryDumpEvent(pid=process.pid, start=16), MakeRawMemoryDumpEvent(pid=process.pid, start=10) ]) self.assertAlmostEquals(8.0, composable_dump.start) self.assertAlmostEquals(16.0, composable_dump.end) memory_dump = memory_dump_event.GlobalMemoryDump([ composable_dump, TestProcessDumpEvent(pid=3, start=8), TestProcessDumpEvent(pid=2, start=13), TestProcessDumpEvent(pid=4, start=7) ]) self.assertFalse(memory_dump.has_mmaps) self.assertEquals(4, len(list(memory_dump.IterProcessMemoryDumps()))) self.assertItemsEqual([1, 2, 3, 4], memory_dump.pids) self.assertAlmostEquals(7.0, memory_dump.start) self.assertAlmostEquals(16.0, memory_dump.end) self.assertAlmostEquals(9.0, memory_dump.duration)
def TestProcessDumpEvent(dump_id='123456ABCDEF', pid=1234, start=0, mmaps=None, allocators=None): event = MakeRawMemoryDumpEvent(dump_id, pid, start, mmaps=mmaps, allocators=allocators) process = mock.Mock() process.pid = event['pid'] return memory_dump_event.ProcessMemoryDumpEvent(process, [event])
def _ProcessMemoryDumpEvents(self, events): # Dictionary to order dumps by id and process. global_dumps = {} for event in events: global_dump = global_dumps.setdefault(event['id'], {}) dump_events = global_dump.setdefault(event['pid'], []) dump_events.append(event) for dump_id, global_dump in global_dumps.iteritems(): for pid, dump_events in global_dump.iteritems(): process = self._GetOrCreateProcess(pid) memory_dump = memory_dump_event.ProcessMemoryDumpEvent( process, dump_events) process.AddMemoryDumpEvent(memory_dump) self._all_memory_dumps_by_dump_id[dump_id].append(memory_dump)
def TestProcessDumpEvent(dump_id='123456ABCDEF', pid=1234, start=0, mmaps=None, allocators=None): def vm_region(mapped_file, byte_stats): return { 'mf': mapped_file, 'bs': {k: hex(v) for k, v in byte_stats.iteritems()} } def attrs(sizes): return { 'attrs': { k: { 'value': hex(v), 'units': 'bytes' } for k, v in sizes.iteritems() } } if allocators is None: allocators = {} event = { 'ph': 'v', 'id': dump_id, 'pid': pid, 'ts': start * 1000, 'args': { 'dumps': { 'allocators': {name: attrs(sizes) for name, sizes in allocators.iteritems()} } } } if mmaps: event['args']['dumps']['process_mmaps'] = { 'vm_regions': [ vm_region(mapped_file, byte_stats) for mapped_file, byte_stats in mmaps.iteritems() ] } process = mock.Mock() process.pid = event['pid'] return memory_dump_event.ProcessMemoryDumpEvent(process, event)
def testProcessMemoryDump_allocators(self): process = mock.Mock() process.pid = 1234 events = [ MakeRawMemoryDumpEvent(pid=process.pid, allocators={ 'v8': { 'size': 10, 'allocated_objects_size': 5 }, 'v8/allocated_objects': { 'size': 4 }, 'skia': { 'not_size': 10, 'allocated_objects_size': 5 }, 'skia/cache1': { 'size': 24 } }), MakeRawMemoryDumpEvent(pid=process.pid, allocators={ 'skia/cache2': { 'not_size': 20 }, 'skia/cache2/obj1': { 'size': 8 }, 'skia/cache2/obj2': { 'size': 9 }, 'skia_different/obj': { 'size': 30 }, 'skia_different/obj/not_counted': { 'size': 26 }, 'global/0xdead': { 'size': 26 } }) ] memory_dump = memory_dump_event.ProcessMemoryDumpEvent(process, events) EXPECTED_ALLOCATORS = { 'skia': { 'allocated_objects_size': 5, 'not_size': 30, 'size': 41 }, 'v8': { 'allocated_objects_size': 5, 'size': 10 }, 'skia_different': { 'size': 30 } } self.assertEquals(memory_dump._allocators, EXPECTED_ALLOCATORS)
def _ProcessMemoryDumpEvent(self, event): process = self._GetOrCreateProcess(event['pid']) memory_dump = memory_dump_event.ProcessMemoryDumpEvent(process, event) process.AddMemoryDumpEvent(memory_dump) self._all_memory_dumps_by_dump_id[memory_dump.dump_id].append( memory_dump)