\chapter{Perl Dokumentation}\label{app:PerlDoc} \input{../../Umsetzung/Perl/Kieker.tex} \chapter{Perl Skripte zur Auswertung}\label{app:PerlScripts} \section{Zählen von Aufrufhäugigkeiten}\label{app:perlFunCnt} Dieses Skript liest einen von \textsf{Kieker.Analysis} ereugten Trace in textueller Form (erzeugt mit \emph{--print-Execution-Trace}) und erzeugt eine CSV-Datei mit allen Funktionen und ihren Aufrufhäufigkeiten. \begin{lstlisting}[language=perl] use Getopt::Long; my $inputfile = ''; my $outputfile = 'a.out'; GetOptions ("i|input|inputfile=s" => \$inputfile, # string "o|output|outputfile=s" => \$outputfile ); # string unless ($inputfile) { die("Missing option -i"); } open(my $inFile, "<", $inputfile) || die "Can't open $inputfile: $!"; open(my $outFile, ">", "$outputfile.csv") || die "Can't open $outputfile: $!"; my %funHash = (); my %funHashTrace = (); my $trace; while (<$inFile>) { if (/0::@\d+:(\S+)\s/) { $funHash{$1} += 1; $funHashTrace{$1} += 1; } elsif ($trace && /^TraceId\s(\d+)/) { open(my $traceOutFile, ">", "$outputfile-$trace.csv") || die "Can't open $outputfile-$trace.csv: $!"; while (my ($key, $value) = each %funHashTrace) { print $traceOutFile "$key;$value\n"; } $trace = $1; %funHashTrace = (); } elsif (/^TraceId\s(\d+)/) { $trace = $1; %funHashTrace = (); } } open(my $traceOutFile, ">", "$outputfile-$trace.csv") || die "Can't open $outputfile-$trace.csv: $!"; while (my ($key, $value) = each %funHashTrace) { print $traceOutFile "$key;$value\n"; } while (my ($key, $value) = each %funHash) { print $outFile "$key;$value\n"; } \end{lstlisting} \section{Aggregieren von Funktionsaufrufen}\label{app:perlFunAgg} Mit diesem Skript werden die Trace-Daten modifiziert. Alle Funktionsnamen werden ignoriert und durch \emph{agg()} ersetzt. Somit existiert nur noch eine Funktion pro Paket. Die Aggregation erfolgt vor der Verarbeitung durch Kieker, damit auch graphische Auswertungen durch Kieker erzeugt werden können. \begin{lstlisting}[language=perl] use File::Copy; my $inFile; opendir(my $dh, ".") || die "can't opendir .: $!"; my @files = grep(/\.dat$/,readdir($dh)); foreach my $d (@files) { copy($d,$d.".bak"); open($inFile, "<",$d.".bak"); open(my $outFile, ">",$d); while (<$inFile>) { s/(;EPrints.*\.).*?(;EPrints)/$1agg$2/; print $outFile $_; } } closedir $dh; \end{lstlisting}