1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#!/bin/sh
#
# Ensure that strace -k works.
#
# Copyright (c) 2014 Masatake YAMATO <yamato@redhat.com>
# Copyright (c) 2014-2016 Dmitry V. Levin <ldv@strace.io>
# Copyright (c) 2014-2024 The strace developers.
# All rights reserved.
#
# SPDX-License-Identifier: GPL-2.0-or-later
. "${srcdir=.}/init.sh"
: "${ATTACH_MODE=0}"
: "${KOPT_SHORT=-k}"
: "${KOPT_LONG=--stack-trace}"
: "${KOPT_EXTRA=}"
# strace -k is implemented using /proc/$pid/maps
[ -f /proc/self/maps ] ||
framework_skip_ '/proc/self/maps is not available'
check_prog grep
check_prog readlink
check_prog sed
check_prog tr
path_to_sed="$(command -v sed)"
if [ -x "$path_to_sed" ] &&
path_to_sed="$(readlink -ev -- "$path_to_sed")"; then
"$path_to_sed" -n 's/^[^/]\+[[:space:]]\(\/.*\)$/\1/p' /proc/self/maps |
grep -F -x -e "$path_to_sed" > /dev/null || {
cat >&2 /proc/self/maps
framework_skip_ '/proc/self/maps is invalid'
}
fi
run_prog "${test_prog=../stack-fcall}"
if [ "x${ATTACH_MODE}" = "x1" ]; then
../set_ptracer_any "${test_prog}" >> "$EXP" &
tracee_pid=$!
while ! [ -s "$EXP" ]; do
kill -0 "$tracee_pid" 2> /dev/null ||
fail_ 'set_ptracer_any failed'
done
run_strace --trace=chdir ${KOPT_LONG} ${KOPT_EXTRA} --attach="$tracee_pid"
else
run_strace -e chdir ${KOPT_SHORT} ${KOPT_EXTRA} $args
fi
expected="$srcdir/$NAME.expected"
awk_script_common='
/^[^ ]/ {
if (out != "")
print out
syscall = gensub(/^([[:alnum:]_]+)\(.*/, "\\1", 1)
signal = gensub(/^--- ([A-Z]+) .*/, "\\1", 1)
if (syscall != $0) {
out = syscall
stop = 0
} else if (signal != $0) {
out = signal
stop = 0
} else {
out = ""
}
}
/^ > too many stack frames/ {
out = out " _too_many_stack_frames_"
stop = 1
}
'
awk_script_symbol='
/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) / && !stop {
sym = gensub(/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) .*$/, "\\1", 1)
out = out " " sym
if (sym == "main")
stop = 1
}
'
awk_script_source='
/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) \[0x[a-f0-9]+\] ([^:]+):([0-9]+)$/ && !stop {
sym = gensub(/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) .*$/, "\\1", 1)
if (sym == "main" || sym ~ /f[0-9]/) {
file = gensub(/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) \[0x[a-f0-9]+\] ([^:]+):([0-9]+)$/, "\\2", 1)
line = gensub(/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) \[0x[a-f0-9]+\] ([^:]+):([0-9]+)$/, "\\3", 1)
sub(".*/", "", file)
out = out " " sym "<" file ":" line ">"
if (sym == "main")
stop = 1
}
}
'
if [ "${KOPT_LONG}" = "--stack-trace" ]; then
awk_script="${awk_script_common}${awk_script_symbol}"
else
awk_script="${awk_script_common}${awk_script_source}"
fi
awk "${awk_script}" "$LOG" > "$OUT"
LC_ALL=C grep -E -x -f "$expected" < "$OUT" > /dev/null || {
cat >&2 <<__EOF__
Failed pattern of expected output:
$(cat "$expected")
Actual output:
$(cat "$OUT")
__EOF__
pattern=
case "$STRACE_ARCH" in
aarch64|i386|ppc*|s390*|sparc*|x32|x86*)
# These architectures are supported by elfutils libdw,
# see grep '\<HOOK\>.*\<abi_cfi\>' elfutils/backends
;;
arm) pattern='No DWARF information found'
# This is also supported by elfutils libdw
# but the latter needs debuginfo for unwinding.
;;
*) pattern='Unwinding not supported for this architecture'
;;
esac
if [ -n "$pattern" ] &&
LC_ALL=C grep -x " > $pattern" < "$LOG" > /dev/null; then
cat < "$LOG" >&2
skip_ "stack tracing is not fully supported on $STRACE_ARCH yet"
fi
dump_log_and_fail_with "$STRACE $args output mismatch"
}
|