def test_lookup(self): d = LibraryData("lib", 1234, 1300) d.symbols = [(1234, "a"), (1260, "b")] d2 = LibraryData("lib2", 1400, 1500) d2.symbols = [] addr = AddressSpace([d, d2]) fn, _, is_virtual = addr.lookup(1350) assert fn == '0x0000000000000547' # outside of range fn, _, is_virtual = addr.lookup(1250) assert fn == "a"
def test_read_profile(here): prof_path = os.path.join(here, 'test.prof') prof_content = open(prof_path, 'rb') period, profiles, symbols, ranges = read_prof(prof_content) assert ranges[5].name == '/lib/x86_64-linux-gnu/liblzma.so.5.0.0' assert ranges[5].start == 140682901667840 assert ranges[5].end == 140682901803008 # symbols contains all kinds of crap, reverse it sym_dict = {} for k, v in symbols: sym_dict[v] = k assert 'py:f:7:x.py' in sym_dict assert 'py:g:4:x.py' in sym_dict assert 'py:<module>:2:x.py' in sym_dict addrspace = AddressSpace([ LibraryData('virtual', 0x7000000000000000, 0x7000000000010000, True, symbols=symbols) ]) name, start_addr, is_virtual = addrspace.lookup( sym_dict['py:<module>:2:x.py']) assert name == 'py:<module>:2:x.py' assert is_virtual
def read_profile(prof_filename, lib_cache={}, extra_libs=None, virtual_only=True): prof = open(prof_filename, 'rb') period, profiles, virtual_symbols, libs = read_prof(prof) if not virtual_only: for i, lib in enumerate(libs): if lib.name in lib_cache: libs[i] = lib_cache[lib.name] else: lib.read_object_data(lib.start) lib_cache[lib.name] = lib libs.append( LibraryData('<virtual>', 0x7000000000000000, 0x7fffffffffffffff, True, symbols=virtual_symbols)) if extra_libs: libs += extra_libs addrspace = AddressSpace(libs) filtered_profiles, addr_set = addrspace.filter_addr(profiles, virtual_only) d = {} for addr in addr_set: name, _, _ = addrspace.lookup(addr) d[addr] = name return Stats(filtered_profiles, d)
def test_filter_profiles(self): d = LibraryData("lib", 12, 20) d.symbols = [(12, "lib:a"), (15, "lib:b")] d2 = LibraryData("<virtual>", 1000, 1500, True, symbols=[ (1000, "py:one"), (1010, "py:two"), ]) addr_space = AddressSpace([d, d2]) profiles = [([12, 17, 1007], 1), ([12, 12, 12], 1), ([1000, 1020, 17], 1)] profiles = addr_space.filter(profiles) assert profiles == [ (["py:one"], 1), (["py:two", "py:one"], 1), ] p = Stats(profiles) assert p.functions == {"py:one": 2, "py:two": 1} assert p.function_profile("py:two") == ([('py:one', 1)], 1)
def read_profile(prof_filename, lib_cache={}, extra_libs=None, virtual_only=True, include_extra_info=True): prof = open(str(prof_filename), 'rb') period, profiles, virtual_symbols, libs, interp_name = read_prof(prof) if not virtual_only or include_extra_info: exe_name = libs[0].name for lib in libs: executable = lib.name == exe_name if lib.name in lib_cache: lib.get_symbols_from(lib_cache[lib.name], executable) else: lib.read_object_data(executable) lib_cache[lib.name] = lib libs.append( LibraryData('<virtual>', 0x7000000000000000, 0x7fffffffffffffff, True, symbols=virtual_symbols)) if extra_libs: libs += extra_libs addrspace = AddressSpace(libs) filtered_profiles, addr_set, jit_frames = addrspace.filter_addr( profiles, virtual_only, include_extra_info, interp_name) d = {} for addr in addr_set: name, _, _, lib = addrspace.lookup(addr) if lib is None: name = 'jit:' + name d[addr] = name if include_extra_info: d.update(addrspace.meta_data) s = Stats(filtered_profiles, d, jit_frames, interp_name) s.addrspace = addrspace return s
def get_or_write_libcache(filename): libache_filename = str(py.path.local(__file__).join('..', filename + '.libcache')) try: with open(libache_filename, 'rb') as f: s = zlib.decompress(f.read()) if not isinstance(s, str): s = s.decode('utf-8') d = json.loads(s) lib_cache = {} for k, v in d.items(): lib_cache[k] = LibraryData(v[0], v[1], v[2], v[3], [tuple(x) for x in v[4]]) return lib_cache except (IOError, OSError): pass path = py.path.local(__file__).join('..', filename) lib_cache = {} vmprof.read_profile(path, virtual_only=True, include_extra_info=True, lib_cache=lib_cache) d = {} for k, lib in six.iteritems(lib_cache): d[k] = (lib.name, lib.start, lib.end, lib.is_virtual, lib.symbols) with open(libache_filename, "wb") as f: f.write(zlib.compress(json.dumps(d).encode('utf-8'))) return lib_cache