|  | #!/bin/sh | 
|  | # | 
|  | # This script processes strace -ff -tt output.  It merges the contents of all | 
|  | # STRACE_LOG.PID files and sorts them, printing result on the standard output. | 
|  | # | 
|  | # Copyright (c) 2012-2018 The strace developers. | 
|  | # | 
|  | # Redistribution and use in source and binary forms, with or without | 
|  | # modification, are permitted provided that the following conditions | 
|  | # are met: | 
|  | # 1. Redistributions of source code must retain the above copyright | 
|  | #    notice, this list of conditions and the following disclaimer. | 
|  | # 2. Redistributions in binary form must reproduce the above copyright | 
|  | #    notice, this list of conditions and the following disclaimer in the | 
|  | #    documentation and/or other materials provided with the distribution. | 
|  | # 3. The name of the author may not be used to endorse or promote products | 
|  | #    derived from this software without specific prior written permission. | 
|  | # | 
|  | # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | 
|  | # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
|  | # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | 
|  | # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | 
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
|  | # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
|  | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
|  | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|  | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 
|  | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  |  | 
|  | show_usage() | 
|  | { | 
|  | cat <<__EOF__ | 
|  | Usage: ${0##*/} STRACE_LOG | 
|  |  | 
|  | Finds all STRACE_LOG.PID files, adds PID prefix to every line, | 
|  | then combines and sorts them, and prints result to standard output. | 
|  |  | 
|  | It is assumed that STRACE_LOGs were produced by strace with -tt[t] | 
|  | option which prints timestamps (otherwise sorting won't do any good). | 
|  | __EOF__ | 
|  | } | 
|  |  | 
|  | dd='\([0-9][0-9]\)' | 
|  | ds='\([0-9][0-9]*\)' | 
|  |  | 
|  | if [ $# -ne 1 ]; then | 
|  | show_usage >&2 | 
|  | exit 1 | 
|  | elif [ "$1" = '--help' ]; then | 
|  | show_usage | 
|  | exit 0 | 
|  | fi | 
|  |  | 
|  | logfile=$1 | 
|  |  | 
|  | for file in "$logfile".*; do | 
|  | [ -f "$file" ] || continue | 
|  | suffix=${file#"$logfile".} | 
|  | [ "$suffix" -gt 0 ] 2> /dev/null || | 
|  | continue | 
|  | pid=$(printf "%-5s" $suffix) | 
|  | # Some strace logs have last line which is not '\n' terminated, | 
|  | # so add extra newline to every file. | 
|  | # grep -v '^$' removes empty lines which may result. | 
|  | sed -n "s/^\($dd:\)\?\($dd:\)\?\($ds\.\)\?$ds /\2\4\6\7 $pid \0/p" < "$file" | 
|  | echo | 
|  | done \ | 
|  | | sort -s -n -k1,1 | sed -n 's/^[0-9][0-9]* //p' | 
|  |  | 
|  | rc=$? | 
|  | [ $rc -eq 1 ] && | 
|  | echo >&2 "${0##*/}: $logfile: strace output not found" | 
|  | exit $rc |