def samples_to_df(h, need_line): """Convert a parsed perf event list to a pandas table. The pandas table contains all events in a easily to process format. The pandas table has callchain_aux and branch_aux fields pointing to Aux object defining the callchains/branches.""" ev = perfdata.get_events(h) index = [] data = defaultdict(list) callchains = Aux() branches = Aux() used = Counter() mm = mmap.MmapTracker() for n in range(0, len(ev)): mm.lookahead_mmap(ev, n) j = ev[n] if j.type != "SAMPLE": continue mm.update_sample(j) add = lambda k, i: do_add(data, used, k, i) filename, mmap_base, foffset = mm.resolve(j.pid, j.ip) if filename == "[kernel.kallsyms]_text": filename = None add('filename', filename) sym, soffset, line = elf.resolve_ip(filename, foffset, j.ip, need_line) add('symbol', sym) add('line', line) add('soffset', soffset) if 'callchain' in j and j.callchain: id = callchains.add(j.callchain.caller, lambda: resolve_chain(j.callchain, j, mm, need_line)) add('callchain', id) if 'branch_stack' in j and j.branch_stack: branch = j.branch_stack.branch id = branches.add(map(lambda x: (x['from'], x.to), branch), lambda: resolve_branch(branch, j, mm, need_line)) add('branch', id) kernel, guest, hv = cpumodes[j['cpumode']] add('kernel', kernel) add('guest', guest) add('hv', hv) for name in j: if name not in ignored: if j[name]: used[name] += 1 data[name].append(j[name]) index.append(int(j["time"])) for j in data.keys(): if used[j] == 0: del data[j] df = pd.DataFrame(data, index=index, dtype=np.uint64) for i in bool_fields: df[i] = df[i].astype('bool') df.branch_aux = branches df.callchain_aux = callchains return df
def resolve_list(j, ip, mm, need_line): filename, _, foffset = mm.resolve(j.pid, ip) sym, soffset, line = elf.resolve_ip(filename, foffset, ip, need_line) return [filename, sym, soffset, line]
def samples_to_df(h, need_line): """Convert a parsed perf event list to a pandas table. The pandas table contains all events in a easy to process format. The pandas table has callchain_aux and branch_aux fields pointing to Aux object defining the callchains/branches.""" ev = perfdata.get_events(h) index = [] data = defaultdict(list) callchains = Aux() branches = Aux() used = Counter() mm = mmap.MmapTracker() numsample = 0 for n in range(0, len(ev)): mm.lookahead_mmap(ev, n) j = ev[n] print(j) if j.type != "SAMPLE": continue numsample += 1 mm.update_sample(j) def add(k, i): data[k].append(i) used[k] += 1 filename, mmap_base, foffset = mm.resolve(j.pid, j.ip) if filename == "[kernel.kallsyms]_text": filename = None add('filename', filename) sym, soffset, line = elf.resolve_ip(filename, foffset, j.ip, need_line) add('symbol', sym) add('line', line) add('soffset', soffset) if 'callchain' in j and j.callchain: id = callchains.add( j.callchain.caller, lambda: resolve_chain(j.callchain, j, mm, need_line)) add('callchain', id) if 'branch_stack' in j and j.branch_stack: branch = j.branch_stack.branch id = branches.add(map(lambda x: (x['from'], x.to), branch), lambda: resolve_branch(branch, j, mm, need_line)) add('branch', id) kernel, guest, hv = cpumodes[j['cpumode']] add('kernel', kernel) add('guest', guest) add('hv', hv) for name in j: if name not in ignored: if j[name]: used[name] += 1 data[name].append(j[name]) index.append(int(j["time"])) for j in data.keys(): if used[j] == 0: del data[j] df = pd.DataFrame(data, index=index, dtype=np.uint64) if numsample > 0: for i in bool_fields: df[i] = df[i].astype('bool') df.branch_aux = branches df.callchain_aux = callchains return df