????str1=r1.sub("_"??all_methods[method_id][1])

????str2=r1.sub("_"??all_methods[method_id][2])

????return str1+"_"+str2

????def gen_dot_script_file():

????myoutfile = open("graph.dot"?? "w")

????myoutfile.write("digraph vanzo {/n/n");

????for one in all_methods.keys():

????if parent_methods.has_key(one):

????myoutfile.write(gen_funcname(one)+" [shape=rectangle];/n")

????else:

????if child_methods.has_key(one):

????myoutfile.write(gen_funcname(one)+" [shape=ellipse];/n")

????for one in method_calls.keys():

????for two in method_calls[one]:

????myoutfile.write(gen_funcname(one) + ' -> ' + gen_funcname(two) + ' [label="' + str(method_calls[one][two]) + '" fontsize="10"];/n')

????myoutfile.write("/n}/n");

????myoutfile.close

????############################################################

????########################## Script starts from here #########

????############################################################

????if len(sys.argv) < 2:

????print 'No input file specified.'

????sys.exit()

????if not (os.path.exists(sys.argv[1])):

????print "input file not exists"

????sys.exit()

????#Now handle the text part

????current_section=0

????for line in open(sys.argv[1]):

????line2 = line.strip()

????if (line2.startswith("*")):

????if (line2.startswith("*version")):

????current_section=1

????else:

????if (line2.startswith("*threads")):

????current_section=2

????else:

????if (line2.startswith("*methods")):

????current_section=3

????else:

????if (line2.startswith("*end")):

????current_section=4

????break

????continue

????if current_section==2:

????add_one_thread(line2)

????if current_section==3:

????add_one_method(line2)

????#Now handle the binary part

????mybinfile = open(sys.argv[1]?? "rb")

????alldata = mybinfile.read()

????mybinfile.close()

????pos=alldata.find("SLOW")

????offset??=struct.unpack("H"??alldata[pos+6:pos+8])

????pos2=pos+offset #pos2 is where the record begin

????numofrecords = len(alldata) - pos2

????numofrecords = numofrecords / 9

????for i in xrange(numofrecords):

????add_one_record(alldata[pos2 + i * 9:pos2 + i * 9 + 9])

????my_stack=[0]

????for onerecord in all_records:

????thread_id=onerecord[0];

????method_id=onerecord[1];

????action=onerecord[2];

????time=onerecord[3];

????if(action==0):

????if(len(my_stack) > 1):

????parent_method_id=my_stack[-1]

????handle_one_call(parent_method_id??method_id)

????my_stack.append(method_id)

????else:

????if(action==1):

????if(len(my_stack) > 1):

????my_stack.pop()

????gen_dot_script_file()

????os.system("dot -Tjpg graph.dot -o output.jpg;rm -f graph.dot");

????#!/usr/bin/env python

????"""

????turn the traceview data into a jpg pic?? showing methods call relationship

????"""

????import sys

????import os

????import struct

????import re

????#####################################################

????######################## Global Variable ############

????#####################################################

????target_thread=1 #the thread that we want to track?? filt out other threads

????#all_actions = ["enter"??"exit"??"exception"??"reserved"]

????all_threads = {}

????all_methods = {}

????all_records = []

????parent_methods = {}

????child_methods = {}

????method_calls = {}

????######################################################

????############################## Methods ###############

????######################################################

????def add_one_thread(line):

????fields = line.split("/t")

????all_threads[int(fields[0]??10)]=fields

????def add_one_method(line):