Hi Mathi, I use graphviz version 2.36.0. Can you send me your dot file(s), I can have a look to see if something is wrong. Anyhow I'll push the patch. /Thanks HansN
On 09/10/2015 11:13 AM, Mathivanan Naickan Palanivelu wrote: > Looks Good unlike what i see :-). It must be some problem with the dotty > version or something. > My graphviz version is 2.26.3, what would be yours? > Anyways, ACK from me. > > Cheers, > Mathi. > > ----- hans.nordeb...@ericsson.com wrote: > >> Hi Mathi, >> >> I attach two pictures from the output of: >> >> $./trace2dot -t osafamfd -f saClmDispatch -d amfd_trace.dot >> $ dotty amfd_trace.dot >> >> and >> >> $./trace2dot -t osafamfd -d amfd_trace.dot >> $ dotty amfd_trace.dot >> >> /Thanks HansN >> >> On 09/10/2015 10:59 AM, Mathivanan Naickan Palanivelu wrote: >>> 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