xref: /aosp_15_r20/external/strace/strace-log-merge (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker#!/bin/sh
2*cf84ac9aSAndroid Build Coastguard Worker#
3*cf84ac9aSAndroid Build Coastguard Worker# This script processes strace -ff -tt output.  It merges the contents of all
4*cf84ac9aSAndroid Build Coastguard Worker# STRACE_LOG.PID files and sorts them, printing result on the standard output.
5*cf84ac9aSAndroid Build Coastguard Worker#
6*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2012-2018 The strace developers.
7*cf84ac9aSAndroid Build Coastguard Worker#
8*cf84ac9aSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker# are met:
11*cf84ac9aSAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker#    documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker# 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker#    derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker#
19*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker
30*cf84ac9aSAndroid Build Coastguard Workershow_usage()
31*cf84ac9aSAndroid Build Coastguard Worker{
32*cf84ac9aSAndroid Build Coastguard Worker	cat <<__EOF__
33*cf84ac9aSAndroid Build Coastguard WorkerUsage: ${0##*/} STRACE_LOG
34*cf84ac9aSAndroid Build Coastguard Worker
35*cf84ac9aSAndroid Build Coastguard WorkerFinds all STRACE_LOG.PID files, adds PID prefix to every line,
36*cf84ac9aSAndroid Build Coastguard Workerthen combines and sorts them, and prints result to standard output.
37*cf84ac9aSAndroid Build Coastguard Worker
38*cf84ac9aSAndroid Build Coastguard WorkerIt is assumed that STRACE_LOGs were produced by strace with -tt[t]
39*cf84ac9aSAndroid Build Coastguard Workeroption which prints timestamps (otherwise sorting won't do any good).
40*cf84ac9aSAndroid Build Coastguard Worker__EOF__
41*cf84ac9aSAndroid Build Coastguard Worker}
42*cf84ac9aSAndroid Build Coastguard Worker
43*cf84ac9aSAndroid Build Coastguard Workerdd='\([0-9][0-9]\)'
44*cf84ac9aSAndroid Build Coastguard Workerds='\([0-9][0-9]*\)'
45*cf84ac9aSAndroid Build Coastguard Worker
46*cf84ac9aSAndroid Build Coastguard Workerif [ $# -ne 1 ]; then
47*cf84ac9aSAndroid Build Coastguard Worker	show_usage >&2
48*cf84ac9aSAndroid Build Coastguard Worker	exit 1
49*cf84ac9aSAndroid Build Coastguard Workerelif [ "$1" = '--help' ]; then
50*cf84ac9aSAndroid Build Coastguard Worker	show_usage
51*cf84ac9aSAndroid Build Coastguard Worker	exit 0
52*cf84ac9aSAndroid Build Coastguard Workerfi
53*cf84ac9aSAndroid Build Coastguard Worker
54*cf84ac9aSAndroid Build Coastguard Workerlogfile=$1
55*cf84ac9aSAndroid Build Coastguard Worker
56*cf84ac9aSAndroid Build Coastguard Workerfor file in "$logfile".*; do
57*cf84ac9aSAndroid Build Coastguard Worker	[ -f "$file" ] || continue
58*cf84ac9aSAndroid Build Coastguard Worker	suffix=${file#"$logfile".}
59*cf84ac9aSAndroid Build Coastguard Worker	[ "$suffix" -gt 0 ] 2> /dev/null ||
60*cf84ac9aSAndroid Build Coastguard Worker		continue
61*cf84ac9aSAndroid Build Coastguard Worker	pid=$(printf "%-5s" $suffix)
62*cf84ac9aSAndroid Build Coastguard Worker	# Some strace logs have last line which is not '\n' terminated,
63*cf84ac9aSAndroid Build Coastguard Worker	# so add extra newline to every file.
64*cf84ac9aSAndroid Build Coastguard Worker	# grep -v '^$' removes empty lines which may result.
65*cf84ac9aSAndroid Build Coastguard Worker	sed -n "s/^\($dd:\)\?\($dd:\)\?\($ds\.\)\?$ds /\2\4\6\7 $pid \0/p" < "$file"
66*cf84ac9aSAndroid Build Coastguard Worker	echo
67*cf84ac9aSAndroid Build Coastguard Workerdone \
68*cf84ac9aSAndroid Build Coastguard Worker| sort -s -n -k1,1 | sed -n 's/^[0-9][0-9]* //p'
69*cf84ac9aSAndroid Build Coastguard Worker
70*cf84ac9aSAndroid Build Coastguard Workerrc=$?
71*cf84ac9aSAndroid Build Coastguard Worker[ $rc -eq 1 ] &&
72*cf84ac9aSAndroid Build Coastguard Worker	echo >&2 "${0##*/}: $logfile: strace output not found"
73*cf84ac9aSAndroid Build Coastguard Workerexit $rc
74