diff -r aa2539c91954 -r 1c2bb2fc7c87 tracesrv/tracecompiler/internal/scripts/ost_metrics.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tracesrv/tracecompiler/internal/scripts/ost_metrics.pl Tue Oct 26 16:20:32 2010 +0300 @@ -0,0 +1,393 @@ +# +# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +#!perl -w +# +# + +#********************************************************************* +# ost_metrics.pl +# ********************************************************************* +# +# VERSION : 8 Draft Feb-15-2010 Adrian Issott +# REASION : Minor update to output style and added warnings about +# the tool being unsupported +# +# VERSION : 7 Draft Sep-16-2009 Adrian Issott +# REASION : Added support for restricting output to specific +# components +# +# VERSION : 6 Draft Sep-15-2009 Adrian Issott +# REASION : Added support for older environments with dictionaries +# under epoc32\include\internal\symbiantraces\dictionary +# +# VERSION : 5 Draft Sep-11-2009 Adrian Issott +# REASION : Added trace name listing +# Added counting of trace / group ID with lower case names +# Made the output of detailed inforamtion optional +# Added support for epocroots other than \ +# Added warning about assuming epocroot=\ when it's not set +# Fixed illegal division by zero issue when no components were found +# +# VERSION : 4 Draft Sep-11-2008 Esa Karvanen +# REASION : Skip duplicate UID's when parsing +# +# VERSION : 3 Draft May-07-2008 Esa Karvanen +# REASION : Changed to print amount of traces and stuff +# +# VERSION : 2 Draft May-06-2008 Esa Karvanen +# REASION : Changed to calculate unique groups names +# +# VERSION : 1 Draft Mar-28-2008 Teemu Piiroinen +# REASION : Initial version + +use strict; +use warnings; +use env; + +use Getopt::Long; +use Pod::Usage; + +warn "\n"; +warn "Warning: this script is not supported and the Dynamic Analysis Tools team\n"; +warn "does NOT promise to fix any bugs or add any functionality to it.\n"; +warn "\n"; + +my %options; +GetOptions('h|help|?' => \$options{showHelp}, + 'm|manual' => \$options{showManual}, + 'r|restrictTo=s' => \$options{restrictTo}, + 'c|byComponent' => \$options{byComponent}, + 't|showTraceNames' => \$options{showTraceNames}, + 'l|lowerCaseNames' => \$options{lowerCaseNames}, + ) or pod2usage(-Verbose => 0); +pod2usage(-Verbose => 1) if ($options{showHelp}); +pod2usage(-Verbose => 2) if ($options{showManual}); + +$options{byComponent} = 1 if $options{showTraceNames}; + +if (defined $options{restrictTo}) { + eval "'' =~ /$options{restrictTo}/"; + die "Invalid restrictTo pattern ($options{restrictTo}): $@\n" if $@; +} else { + $options{restrictTo} = '.*'; +} + +my $component_count = 0; + +my $group_count = 0; +my $total_group_count = 0; + +my $trace_count = 0; +my $component_trace_count = 0; +my $total_trace_count = 0; +my @allgroups = (); +my %hashgroups = (); +my %uids; + +my $lowerCaseGroupNames = 0; +my $lowerCaseTraceNames = 0; + +my $epocroot; +if (not defined $ENV{EPOCROOT}) { + warn "Warning: EPOCROOT not set so assuming it's \\\n"; + $epocroot = '\\'; +} else { + $epocroot = $ENV{EPOCROOT}; +} +die "Expected the EPOCROOT ($epocroot) to be a directory\n" unless -d $epocroot; + +my $ost_dictionaries_dir = $epocroot.'epoc32\ost_dictionaries'; +print "Looking for dictionaries in $ost_dictionaries_dir ...\n"; + +if (not -d $ost_dictionaries_dir) { + $ost_dictionaries_dir = $epocroot.'epoc32\include\internal\symbiantraces\dictionary'; + print "Looking for dictionaries in $ost_dictionaries_dir ...\n"; +} +die "Couldn't find the OST dictionaries directory\n" unless -d $ost_dictionaries_dir; + +print "Found the OST dictionaries directory\n"; +print "\n"; + +my $dir_cmd = "dir $ost_dictionaries_dir\\*.xml /S /B 2>NUL"; +my $dir_return = qx($dir_cmd); +my $current_group; + +foreach my $file (split("\n", $dir_return)) +{ + next unless $file =~ /$options{restrictTo}/i; + + # OST Autogen headers contain "_0x" in their file name + if ($file =~ /_0x(.+?)_/i) + { + # Skip duplicate UID + if (exists($uids{$1})) + { + warn "Warning: skipping duplicate UID in file " . $file . "\n"; + + } + # This UID for the first time, parse the file + else + { + $uids{$1} = 0; + parseFile($file); + } + } + # Also calculate BTraceHooksDictionary + elsif ($file =~ m/(BTraceHooksDictionary\.xml)/i) + { + parseFile($file); + } +} + +# Remove duplicates from the groups list +my %seen = (); +my @uniq_groups = (); +foreach my $item (@allgroups) { + push(@uniq_groups, $item) unless $seen{$item}++; +} + + +### OUTPUT TOTALS ### + + +my @groupNames = sort keys %hashgroups; +my $uniq_groups = scalar @groupNames; + +my $avg_groups = ($component_count > 0 ? sprintf "%.2f",($total_group_count / $component_count) : 0); + +print "\n\n--------------TOTALS--------------\n\n"; +print "Component count: $component_count\n"; +print "Unique group count: $uniq_groups\n"; +print "Average groups per component: $avg_groups\n"; +print "Trace count: $total_trace_count\n"; + +if ($options{lowerCaseNames}) { + for my $groupName (@groupNames) { + if (uc($groupName) ne $groupName) { + $lowerCaseGroupNames++; + } + + } + + print "\n"; + print "Lower case Group ID names count: $lowerCaseGroupNames\n"; + print "Lower case Trace ID names count: $lowerCaseTraceNames\n"; +} + + +### OUTPUT GROUP ID SUMMARY ### + + +# Generate new array where key is the amount of traces and value is the string to be printed +my @group_lines = (); +my $groupNo = 0; +foreach my $key (@groupNames) { + my $line = ""; + + # Check how many times this group can be found from all groups array + my $occurrences = 0; + foreach my $item (@allgroups) { + if ($item eq $key) { + $occurrences = $occurrences + 1; + } + } + + my $value = $hashgroups{$key}; + + my $trace_percents = ($total_trace_count > 0 ? sprintf "%.2f",($value / $total_trace_count) * 100 : 0); + my $component_percents = ($component_count > 0 ? sprintf "%.2f",($occurrences / $component_count) * 100 : 0); + + # Add the group name + my $i = 0; + $line .= "$key"; + while ((length $key) + $i < 42){ + $line .= " "; + $i = $i + 1; + } + + # Add the number of traces + $i = 0; + $line .= "$value"; + while ((length $value) + $i < 5){ + $line .= " "; + $i = $i + 1; + } + + # Add the number of traces in percents + $line .= "($trace_percents %)"; + $i = 0; + while ((length $trace_percents) + $i < 21){ + $line .= " "; + $i = $i + 1; + } + + # Add used by no. of components + $i = 0; + $line .= "$occurrences"; + while ((length $occurrences) + $i < 3){ + $line .= " "; + $i = $i + 1; + } + + # Add used by no. of components in percents + $line .= "($component_percents %)\n"; + + $group_lines[$groupNo][0] = $value; + $group_lines[$groupNo][1] = $line; + $groupNo = $groupNo + 1; +} + +my @sorted_group_lines = reverse sort{$a->[0] <=> $b->[0]} @group_lines; #if the $id'th column is numerically + +print "\n\n--------------GROUP ID SUMMARY--------------\n\n"; +print "GROUP NAME\t\t\t\tAMOUNT OF TRACES\tUSED BY NO. OF COMPONENTS\n\n"; + +foreach my $line (@sorted_group_lines) { + print $$line[1]; +} + + +####################################################################### +# Parses file +####################################################################### +sub parseFile +{ + + my $file = $_[0]; + open FILE, "<$file" or die $!; + + foreach my $line () + { + if ($line =~ //i) + { + if ($options{byComponent}) { + print "\tGroup count: $group_count\n"; + print "\tComponent trace count: $component_trace_count\n\n\n"; + } + + $group_count = 0; + $component_trace_count = 0; + } + if ($line =~ //i) + { + print "\tGroup trace count: $trace_count\n" if $options{byComponent}; + $hashgroups{$current_group} = ($hashgroups{$current_group} + $trace_count); + $trace_count = 0; + } + } + + close FILE; +} + +warn "\n"; +warn "Warning: this script is not supported and the Dynamic Analysis Tools team\n"; +warn "does NOT promise to fix any bugs or add any functionality to it.\n"; +warn "\n"; + +__END__ + +=head1 NAME + +ost_metrics - Prints metrics about OST usage based on the dictionaries in an EPOCROOT + +=head1 SYNOPSIS + +ost_metrics [options] + +=head1 OPTIONS + + -h (--help) Brief help message. + -m (--manual) Full documentation. + -r (--restrictTo) Restrict the output to just dictionaries with names + matching the regular expression re. + -c (--byComponent) Output detailed information about the trace used in each + component. + -t (--showTraceNames) Output detailed information about the trace ID names used. + Implies -byComponent + -l (--lowerCaseNames) Count the number of lower case names in the dictionaries. + +=head1 DESCRIPTION + +This script reads in the dictionaries found under EPOCROOT\epoc32\ost_dictionaries +and outputs the following information: + +=over + +=item 1 OST usage breakdown by component if --byComponent is specified + +=item 2 OST trace ID usage by component if --showTraceNames is specified + +=item 3 Group ID usage in the environment + +=item 4 Total usage in the environment + +=back + +Note that if you don't define EPOCROOT this script assumes you mean "\". + +=head1 SUPPORT + +Please note that this script is not supported and the Dynamic Analysis Tools team +does NOT promise to fix any bugs or add any functionality to it. + +=head1 COPYRIGHT + +Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. + +=cut \ No newline at end of file