Hi Hans, I do appreciate the idea of suggesting dotty, good thought! I did run dotty as mentioned in the patch. We could place the trace2dot with 'execute' permissions and place it under tools/devel/dot directory.
Also, the output i get after running dotty doesn't looks intuitive to me. So, for comparison sakes,could you send a picture (snapshot) of how the graph looks to you when you run it on osafamfd trace file? BR, Mathi. ----- hans.nordeb...@ericsson.com wrote: > tools/devel/trace2dot | 169 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 169 insertions(+), 0 deletions(-) > > > Python script to create a runtime callgraph from OpenSAF trace files. > A dot file is created and can be viewed using e.g. dotty > > diff --git a/tools/devel/trace2dot b/tools/devel/trace2dot > new file mode 100755 > --- /dev/null > +++ b/tools/devel/trace2dot > @@ -0,0 +1,169 @@ > +#!/usr/bin/env python > +# > +# > +# (C) Copyright 201t The OpenSAF Foundation > +# > +# This program is distributed in the hope that it will be useful, > but > +# WITHOUT ANY WARRANTY; without even the implied warranty of > MERCHANTABILITY > +# or FITNESS FOR A PARTICULAR PURPOSE. This file and program are > licensed > +# under the GNU Lesser General Public License Version 2.1, February > 1999. > +# The complete license can be accessed from the following location: > +# http://opensource.org/licenses/lgpl-license.php > +# See the Copying file included with the OpenSAF distribution for > full > +# licensing terms. > +# > +# Author(s): Ericsson > +# > +# > +""" > + trace2dot creates a runtime call graph using an opensaf trace file > as input > + and produces a dot file. The generated dot file can be viewed > graphically using e.g. dotty. > + > + Example: > + Create a dot file, amfd_trace.dot from osafamfd trace file. Start > from function set_oper_state. > + $ trace2dot -t osafamfd -f ssaClmDispatch -d amfd_trace.dot > + $ dotty amfd_trace.dot > + > +""" > +import sys > +import os > +import argparse > + > + > +def run(trace_file, from_function, dot_file): > + ''' TBD ''' > + infile = open(trace_file) > + > + if dot_file: > + outfile = open(dot_file, 'w') > + else: > + outfile = sys.stdout > + > + outfile.write('strict digraph test {\n') > + outfile.write('node [shape=record, style=filled];\n') > + outfile.write('edge [shape=normal];\n') > + > + process_infile(infile, from_function, outfile) > + > + outfile.write('}\n') > + > + > +def check_infile(trace_file): > + ''' Rudimentary check for missing TRACE_ENTER/TRACE_LEAVE. Will > not > + check for e.g. returns before TRACE_LEAVE. > + ''' > + infile = open(trace_file) > + trace_enter = set() > + trace_leave = set() > + for line in infile: > + items = line.split() > + if items.__len__() > 6: > + if items[5] == '>>': > + name = items[6].rstrip(':') > + trace_enter.add(name) > + > + if items[5] == '<<': > + name = items[6].rstrip(':') > + trace_leave.add(name) > + > + for name in trace_enter: > + if name not in trace_leave: > + print '%s %s' % ('TRACE_LEAVE is missing for function: ', > name) > + > + for name in trace_leave: > + if name not in trace_enter: > + print '%s %s' % ('TRACE_ENTER is missing for function: ', > name) > + > + infile.close() > + > + > +def process_infile(infile, from_function, outfile): > + ''' TBD ''' > + function_names = [] > + from_func_found = False > + > + for line in infile: > + items = line.split() > + if items.__len__() > 6: > + if items[5] == '>>': > + func_enter = items[6].rstrip(':') > + if from_function and not from_func_found: > + if from_function != func_enter: > + continue > + else: > + from_func_found = True > + > + function_names.append(func_enter) > + > + if len(function_names) > 1: > + outfile.write( > + func_enter + ' [color=grey, shape=box, > label="' + func_enter + '"];\n') > + else: > + outfile.write( > + func_enter + ' [color=red, shape=box, > label="' + func_enter + '"];\n') > + > + if items[5] == '<<': > + func_leave = items[6].rstrip(':') > + if from_function: > + if from_function == func_leave: > + break > + > + if len(function_names) > 0: > + func_enter = function_names.pop() > + if func_enter != func_leave: > + print '%s %s %s' % (func_enter, ' has no > matching TRACE_LEAVE, found ', func_leave) > + outfile.write(func_leave + ' -> ' + > func_enter + '\n') > + > + else: > + if len(function_names) > 0: > + caller = > function_names[len(function_names) - 1] > + outfile.write(caller + ' -> ' + > func_enter + '\n') > + > + > +def file_exists(filename): > + '''Check if arg is a valid file that already exists on the file > + system. > + ''' > + if not os.path.exists(filename): > + raise argparse.ArgumentTypeError( > + "The file %s does not exist!" % filename) > + else: > + return filename > + > + > +def main(): > + ''' program main ''' > + > + parser = argparse.ArgumentParser( > + description="Create runtime callgraph from OpenSAF trace > file") > + > + parser.add_argument('-t', '--tracefile', nargs='+', > + type=file_exists, help='OpenSAF trace file') > + parser.add_argument('-f', '--fromfunction', nargs='+', > + help='Show runtime callgraph from function') > + parser.add_argument('-d', '--dotfile', nargs='+', help='Result > file in dot format') > + parser.add_argument('-c', '--checkfile', nargs='+', > + type=file_exists, help='Check infile for > matching trace_enter trace_leave') > + > + args = parser.parse_args() > + > + from_function = '' > + dot_file = '' > + trace_file = '' > + > + if args.fromfunction: > + from_function = args.fromfunction[0] > + > + if args.dotfile: > + dot_file = args.dotfile[0] > + > + if args.checkfile: > + trace_file = args.checkfile[0] > + check_infile(trace_file) > + > + if args.tracefile: > + trace_file = args.tracefile[0] > + run(trace_file, from_function, dot_file) > + > +if __name__ == '__main__': > + main() ------------------------------------------------------------------------------ Monitor Your Dynamic Infrastructure at Any Scale With Datadog! Get real-time metrics from all of your servers, apps and tools in one place. SourceForge users - Click here to start your Free Trial of Datadog now! http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel