#!/usr/bin/python
#
# example usage: dtrace -n 'profile-4999hz { @a[ustack()]=count() }' | thisthing | dot -Tsvg
# Requires graphviz
# Still needs lots of work and love.
# License: CC-BY
# Author: Domas Mituzas
#
import sys, string
symbol=""
symbols=[]
rels=[]
count=0
counts={}
relationships={}
printed={}
child=""
for line in sys.stdin:
line=line.strip().split("+")[0]
if line=="":
for symbol in symbols:
try: counts[symbol]+=count
except KeyError: counts[symbol]=count
for parent,child in rels:
if parent not in relationships: relationships[parent]={}
if child not in relationships[parent]: relationships[parent][child]=0
relationships[parent][child]+=count
parent=""
child=""
symbols=[]
rels=[]
continue
try:
count=string.atoi(line)
except ValueError:
# line=line.split('`')[-1]
if line.startswith("0x"): line="unresolved"
line=line.split('(')[0]
symbols.append(line)
rels.append((line,child))
child=line
print """digraph prof {
node [style=filled, shape=box];
graph [
rankdir = "UD"
];
fontsize=1;
"""
for parent,children in relationships.items():
if counts[parent]<10:
continue
for child,count in children.items():
if child=="": continue
if count>3:
pct = count*100/counts[parent]
if pct>10:
print """ "%s" -> "%s" [label="%d%%"];"""%(parent,child,pct)
printed[child]=counts[child]
printed[parent]=counts[parent]
for node,count in printed.items():
try: (ex,sym)=node.split('`')
except:
ex=""
sym=node
print """ "%s" [label="%s\\n%s (%d)"]; """%(node,sym,ex,count);
print """ } """