diff options
author | Dmitry V. Levin <ldv@strace.io> | 2021-02-03 08:00:00 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2021-02-03 08:00:00 +0000 |
commit | ecb3ed78107c851f71696df6730a15afff91ed3d (patch) | |
tree | 0b3d2b083040fc9b08d129f80d027ff41b995059 /src/strace-log-merge | |
parent | c47943de06204a269e16f732e7c9c71d4284b23f (diff) | |
download | strace-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-x | src/strace-log-merge | 90 |
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 |