L'uso di questo sito
autorizza anche l'uso dei cookie
necessari al suo funzionamento.
(Altre informazioni)

Wednesday, March 16, 2011

Bash script profiler

Sysadmins do not die - they just logoff.

Let's keep old tools alive.


#! /bin/bash
#
# shprof - a line profiler for shell scripts
# Usage:
# shprof.sh
# Executes and counts how many times each line is executed.
# converted and sparsely tested by Alessandro Forghieri ( alf (at) orion (dot) it) from:
# http://dev.gentoo.org/~dberkholz/scripts/shprof
# -- which did not really work and in turn claimed to come from:
# http://www.math.ias.edu/doc/bash-3.0/scripts.v2/shprof (which now 404's)
#
#
# That was in turn adapted from a similar program included in `The New KornShell' by
# Bolsky and Korn and posted to usenet by bsh20858@challenger.fhda.edu
#
# converted to bash v2 syntax by Chet Ramey
#
TMPFILE=${TMP:-/tmp}/shprof$$

trap 'rm -f $TMPFILE' EXIT

errexit()
{
echo $0: "$@" >&2
exit 1
}

# create script with profiling enabled
cat > $TMPFILE <<- \_EOF_
declare -a _line
_profend()
{
case "$1" in
/*|./*) file="$1" ;;
*) file=$(type -path "$1") ;;
esac

echo "*** line profile for $file ***"
i=1;
while read -r && [ $i -le $NLINE ]; do
count=${_line[$i]}
if [ "$count" -gt 0 ]; then
echo "[$count] $i: $REPLY"
fi
i=$((i + 1))
done <$file
_EOF_
# make the profiling script remove itself after printing line stats
echo "rm -f $TMPFILE" >> $TMPFILE
cat >> $TMPFILE <<- \_EOF_
}
_command=$1
shift
i=1
NLINE=$(wc -l < "$_command")
while [ $i -le $NLINE ]; do
_line[$i]=0
i=$((i + 1))
done
unset i
trap "_profend ${_command}" EXIT
BLN=999999
trap 'LN=$(( $LINENO - $BLN )) ; if [[ $LN -gt 0 ]]; then _line[$LN]=$(( ${_line[$LN]} + 1 )); fi;' DEBUG
BLN=$LINENO
_EOF_

case "$1" in
/*|./*) file=$1 ;;
*) file=$(type -p "$1") ;;
esac

cat "${file-$1}" >> $TMPFILE || errexit "${1}: cannot open"
chmod +x $TMPFILE

exec -a "$file" $TMPFILE "$@"

No comments: