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

Reply via email to