--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwtools/commstools/svg/parseprocessthread.pl Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,95 @@
+#
+# Copyright (c) 2009 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:
+#
+#
+# Abstract:
+# Produce an SVG diagram showing process/thread creation and destruction from utracedecoder output file.
+#
+# Parses the ulogger textual output from utracedecoder.exe and generates a "seq" file suitable for
+# input into parseseq.pl. For example:
+#
+# perl -S processthreadsummary.pl ulogger.txt > proc.seq
+# perl -S parseseq.pl proc.seq
+# <view log.html in SVG browser>
+#
+
+my $creatingProcess = 0;
+
+while (<>) {
+ if (!/EThreadIdentification/) {
+ next;
+ }
+ #1,3,7,3203155249,0,0x00000000,EThreadIdentification: Process Create: [DProcess=0x00dc0080]
+ if (/EThreadIdentification:\s*Process Create:\s*\[DProcess=0x(.{8})\]/) {
+ #print "Process Create: DProcess=$1\n";
+ $creatingProcess = $1;
+ }
+ #2,3,5,3203155347,0,0x00000000,EThreadIdentification: Process Name: [NThread=0x00dc044c] [DProcess=0x00dc0080] [Name=EKern.exe[100041af]0001]
+ elsif (/EThreadIdentification:\s*Process Name:\s*\[NThread=0x(.{8})\] \[DProcess=0x(.{8})\] \[Name=(.*)\]\s*$/) {
+ #print "Process Name: NThread=$1, DProcess=$2, Name=$3\n";
+ if ($creatingProcess eq $2) {
+ my $name = trimName($3);
+ $name = uniquifyName($name);
+ $processName{$2} = $name;
+ print "oc !", $name, " 0 $2\n";
+ print "t !", $name, " $name\n";
+ $creatingProcess = "";
+ }
+ }
+ #4646,3,2,3236912810,0,0x00000000,EThreadIdentification: Thread Create: [NThread=0x00e26b04] [DProcess=0x00e24108] [Name=Main]
+ elsif (/EThreadIdentification:\s*Thread Create:\s*\[NThread=0x(.{8})\] \[DProcess=0x(.{8})\] \[Name=(.*)\]\s*$/) {
+ #print "Thread Create: NThread=$1, DProcess=$2, Name=$3\n";
+ print "ac !", $processName{$2}, " $1 $3\n";
+ print "t !", $processName{$2}, " $3\n";
+ }
+ #812,3,3,3229029799,0,0x00000000,EThreadIdentification: Thread Destroy: [NThread=0x00dee718] [DProcess=0x00dede4c]
+ elsif (/EThreadIdentification: Thread Destroy: \[NThread=0x(.{8})\] \[DProcess=0x(.{8})\]\s*$/) {
+ #print "Thread Destroy: NThread=$1, DProcess=$2\n";
+ print "ad $1\n";
+ }
+ #813,3,8,3229030152,0,0x00000000,EThreadIdentification: Process Destroy: [DProcess=0x00dede4c]
+ elsif (/EThreadIdentification: Process Destroy: \[DProcess=0x(.{8})\]\s*$/) {
+ #print "Process Destroy: DProcess=$1\n";
+ print "od !", $processName{$1}, " $1\n";
+ print "t !", $processName{$1}," (destroyed)\n";
+ }
+}
+
+#
+# Remove '.exe" extension as well as the UID decoration in the name (e.g. "...[100039e3]0001")
+#
+
+sub trimName($)
+{
+ my $name = $_[0];
+ $name =~ s/\[[0-9a-fA-F]{8}\][0-9a-fA-F]{4}\s*$//;
+ $name =~ s/\.exe//;
+ $name =~ s/\.EXE//;
+ return $name;
+}
+
+sub uniquifyName()
+{
+ my ($name) = @_;
+ my $index = 0;
+ my $proposedName = $name;
+ while (defined $uniqueNames{$proposedName})
+ {
+ $proposedName = $name . "(" . ++$index . ")";
+ }
+
+ $uniqueNames{$proposedName} = 1;
+ return $proposedName;
+}