import os, sys import graphlib def parse(f): graphs = {} def getgraph(name): try: return graphs[name] except KeyError: res = graphs[name] = graphlib.Graph(name) return res for line in f: if line.startswith('index'): break firstgraph = None while True: lines = [] middle = None for line in f: if line.startswith("-------------------"): break if line.startswith("\f"): return firstgraph fields = line.strip().split() if line.startswith('['): assert middle is None middle = len(lines) fields = [s for s in fields if not (s.startswith('[') and s.endswith(']'))] name = None i = 0 for fld in fields: if not ('0' <= fld[0] <= '9' or fld[0]=='['): name = fld fields[i] = '\\n'+name break i += 1 if name and name.startswith('<'): name = None lines.append((name, fields)) assert middle is not None g = getgraph(lines[middle][0]) nodes = [] i = 0 for name, fields in lines: g.emit_node('n%d'%i, label=' '.join(fields), shape="box") i += 1 for i in range(middle): g.emit_edge('n%d'%i, 'n%d'%middle) for i in range(middle+1, len(lines)): g.emit_edge('n%d'%middle, 'n%d'%i) for i in range(len(lines)): name, _ = lines[i] if name and i != middle: g.highlight(name, name, getgraph(name)) if firstgraph is None: firstgraph = g if len(sys.argv) > 1: f = os.popen("gprof --brief --no-flat-profile --graph %s" % ' '.join(sys.argv[1:]), 'r') else: f = sys.stdin g = parse(f) f.close() g.display()