summaryrefslogtreecommitdiff
path: root/src/strace-log-merge
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@strace.io>2021-02-03 08:00:00 +0000
committerDmitry V. Levin <ldv@strace.io>2021-02-03 08:00:00 +0000
commitecb3ed78107c851f71696df6730a15afff91ed3d (patch)
tree0b3d2b083040fc9b08d129f80d027ff41b995059 /src/strace-log-merge
parentc47943de06204a269e16f732e7c9c71d4284b23f (diff)
downloadstrace-ecb3ed78107c851f71696df6730a15afff91ed3d.tar.gz
Move source files into src subdirectory
* src/Makefile.am: New file. * src/.gitignore: Likewise. * scno.am: Move into src subdirectory. * scno.head: Likewise. * strace-graph: Likewise. * strace-log-merge: Likewise. * linux/: Likewise. * types/: Likewise. * xlat/: Likewise. * *.awk: Likewise. * *.c: Likewise. * *.h: Likewise. * *.sh: Likewise. * .gitignore: Update. * Makefile.am: Update. * bootstrap: Update. * configure.ac: Update. * debian/rules: Update. * debian/strace-udeb.install: Update. * debian/strace.examples: Update. * debian/strace.install: Update. * debian/strace64.install: Update. * m4/gen_bpf_attr_m4.sh: Update. * m4/mpers.m4: Update. * tests/Makefile.am: Update. * tests/init.sh: Update. * tests/legacy_syscall_info.test: Update. * tests/strace-log-merge-error.test: Update. * tests/strace-log-merge-suffix.test: Update.
Diffstat (limited to 'src/strace-log-merge')
-rwxr-xr-xsrc/strace-log-merge90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/strace-log-merge b/src/strace-log-merge
new file mode 100755
index 000000000..93d87ba28
--- /dev/null
+++ b/src/strace-log-merge
@@ -0,0 +1,90 @@
+#!/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-2019 The strace developers.
+#
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+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
+
+iterate_logfiles()
+{
+ local file suffix
+
+ for file in "$logfile".*; do
+ [ -f "$file" ] || continue
+ suffix=${file#"$logfile".}
+ [ "$suffix" -gt 0 ] 2> /dev/null ||
+ continue
+ "$@" "$suffix" "$file"
+ done
+}
+
+max_suffix_length=0
+process_suffix()
+{
+ local suffix len
+ suffix="$1"; shift
+
+ len=${#suffix}
+ if [ $len -gt $max_suffix_length ]; then
+ max_suffix_length=$len
+ fi
+}
+
+process_logfile()
+{
+ local suffix file pid
+ suffix="$1"; shift
+ file="$1"; shift
+
+ pid=$(printf "%-*s" $max_suffix_length $suffix)
+ # Some strace logs have last line which is not '\n' terminated,
+ # so add extra newline to every file.
+ # Empty lines are removed later.
+ sed -n "s/^\($dd:\)\?\($dd:\)\?\($ds\.\)\?$ds /\2\4\6\7 $pid \0/p" < "$file"
+ echo
+}
+
+iterate_logfiles process_suffix
+
+[ $max_suffix_length -gt 0 ] || {
+ echo >&2 "${0##*/}: $logfile: strace output not found"
+ exit 1
+}
+
+iterate_logfiles process_logfile |
+ sort -s -n -k1,1 |
+ sed -n 's/^[0-9][0-9]* //p' |
+ grep -v '^$'
+
+rc=$?
+[ $rc -eq 1 ] &&
+ echo >&2 "${0##*/}: $logfile: strace output not found"
+exit $rc