Add function tracer formatter
PATCH 2/2 Add function tracer formatter
This patch adds the script available at http://www.logix.cz/michal/devel/CygProfiler to the tools folder, I don't know if it makes sense to install this into somewhere as this is only developers only intendeed.
The way to use it is:
perl tools/cyg-resolve.pl src/.libs/bluetoothd bluetoothd-log.<PID>
Signed-off-by Manuel Naranjo <[email protected]>
Quoted 1 line
From
43691108561e8e39226ccd9064a05690ba48bd66Mon Sep 17 00:00:00 2001
From: Manuel Francisco Naranjo <[email protected]>
Date: Mon, 19 Jul 2010 13:18:43 -0300
Subject: [PATCH 2/2] added perl script to resolve symbols on tracing
--- tools/cyg-resolve.pl | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 111 insertions(+), 0 deletions(-) create mode 100644 tools/cyg-resolve.pl
tools/cyg-resolve.pl new file +111 -0
@@ -0,0 +1,111 @@ +#!/usr/bin/perl + +# +# cyg-resolve.pl - CygProfiler resolver +# +# Michal Ludvig <[email protected]> +# http://www.logix.cz/michal/devel +# +# Use this script to parse the output of the CygProfile suite. +# + +use strict; +use warnings; +no warnings 'portable'; +use diagnostics; +use English; + +my %symtab; +my ($binfile, $textfile, $levelcorr); + +$OUTPUT_AUTOFLUSH=1; + +&help() if($#ARGV < 1); +$binfile=$ARGV[0]; +&help() if($binfile =~ /--help/); +$textfile=($#ARGV > 0 ? $ARGV[1] : "cygprof.log"); +$levelcorr=($#ARGV > 1 ? $ARGV[2] : -1); + +&main(); + +# ==== Subs + +sub help() +{ + printf("CygProgile parser, Michal Ludvig <michal\@logix.cz>, 2002-2003\n"); + printf("Usage: %s <bin-file> <log-file> [<correction>]\n", $0); + printf("\t<bin-file> Program that generated the logfile.\n"); + printf("\t<log-file> Logfile generated by the profiled program.\n"); + printf("\t<correction> Correction of the nesting level.\n"); + exit; +} + +sub main() +{ + my($offset, $type, $function); + my($nsym, $nfunc); + + $nsym=0; + $nfunc=0; + + open(NM, "nm $binfile|") or die("Unable to run 'nm $binfile': $!\n"); + printf("Loading symbols from $binfile ... "); + + while(<NM>) + { + $nsym++; + next if(!/^([0-9A-F]+) (.) (.+)$/i); + $offset=hex($1); $type=$2; $function=$3; + next if($type !~ /[tT]/); + $nfunc++; + $symtab{$offset}=$function; + } + printf("OK\nSeen %d symbols, stored %d function offsets\n", $nsym, $nfunc); + close(NM); + + open(TEXT, "$textfile") + or die("Unable to open '$textfile': $!\n"); + + if ($levelcorr == -1) + { + $levelcorr = 0; + while(<TEXT>) + { + if ((/^.*[+-] (-*\d+)/) && ($1 < -$levelcorr)) + { $levelcorr = -$1; } + } + printf("Level correction set to %d\n", $levelcorr); + seek(TEXT, 0, 0); + } + + while(<TEXT>) + { + # Change the pattern if the output format + # of __cyg_...() functions has changed. + if(!/(.*)([+-]) (-*\d+) 0x([[:xdigit:]]+) 0x([[:xdigit:]]+)\s*(\d*)/) + { print $_; next; } + else + { + my $prolog=$1; + my $type=$2; + + my $level=$3 + $levelcorr; + my $off1=hex($4); + my $off2=hex($5); + my $pid=$6; + + printf("$prolog\n") if ($prolog); + + # Don't print exits + next if($type eq "-"); + my $sym=(defined($symtab{$off1})?$symtab{$off1}:"???"); + + printf("\t%s %2d 0x%x (from 0x%x) %*s%s\n", + $type, $level, $off1, $off2, + $level+1, " ", "$sym()"); + } + } + close(TEXT); + + printf("done\n"); +}
Signature · 1 line
1.6.4.4