File: strace-k.test

package info (click to toggle)
strace 6.13%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 71,488 kB
  • sloc: ansic: 176,497; sh: 9,675; makefile: 4,133; cpp: 885; awk: 353; perl: 267; exp: 62; sed: 9
file content (142 lines) | stat: -rwxr-xr-x 3,428 bytes parent folder | download | duplicates (6)
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"
}