xref: /aosp_15_r20/external/strace/tests-m32/strace-k.test (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker#!/bin/sh
2*cf84ac9aSAndroid Build Coastguard Worker#
3*cf84ac9aSAndroid Build Coastguard Worker# Ensure that strace -k works.
4*cf84ac9aSAndroid Build Coastguard Worker#
5*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2014 Masatake YAMATO <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2014-2016 Dmitry V. Levin <[email protected]>
7*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2014-2018 The strace developers.
8*cf84ac9aSAndroid Build Coastguard Worker# All rights reserved.
9*cf84ac9aSAndroid Build Coastguard Worker#
10*cf84ac9aSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without
11*cf84ac9aSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions
12*cf84ac9aSAndroid Build Coastguard Worker# are met:
13*cf84ac9aSAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer.
15*cf84ac9aSAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright
16*cf84ac9aSAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer in the
17*cf84ac9aSAndroid Build Coastguard Worker#    documentation and/or other materials provided with the distribution.
18*cf84ac9aSAndroid Build Coastguard Worker# 3. The name of the author may not be used to endorse or promote products
19*cf84ac9aSAndroid Build Coastguard Worker#    derived from this software without specific prior written permission.
20*cf84ac9aSAndroid Build Coastguard Worker#
21*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22*cf84ac9aSAndroid Build Coastguard Worker# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23*cf84ac9aSAndroid Build Coastguard Worker# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24*cf84ac9aSAndroid Build Coastguard Worker# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25*cf84ac9aSAndroid Build Coastguard Worker# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26*cf84ac9aSAndroid Build Coastguard Worker# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*cf84ac9aSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*cf84ac9aSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*cf84ac9aSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*cf84ac9aSAndroid Build Coastguard Worker
32*cf84ac9aSAndroid Build Coastguard Worker. "${srcdir=.}/init.sh"
33*cf84ac9aSAndroid Build Coastguard Worker
34*cf84ac9aSAndroid Build Coastguard Worker# strace -k is implemented using /proc/$pid/maps
35*cf84ac9aSAndroid Build Coastguard Worker[ -f /proc/self/maps ] ||
36*cf84ac9aSAndroid Build Coastguard Worker	framework_skip_ '/proc/self/maps is not available'
37*cf84ac9aSAndroid Build Coastguard Worker
38*cf84ac9aSAndroid Build Coastguard Workercheck_prog grep
39*cf84ac9aSAndroid Build Coastguard Workercheck_prog sed
40*cf84ac9aSAndroid Build Coastguard Workercheck_prog tr
41*cf84ac9aSAndroid Build Coastguard Worker
42*cf84ac9aSAndroid Build Coastguard Workerrun_prog "${test_prog=../stack-fcall}"
43*cf84ac9aSAndroid Build Coastguard Workerrun_strace -e getpid -k $args
44*cf84ac9aSAndroid Build Coastguard Worker
45*cf84ac9aSAndroid Build Coastguard Workerexpected="$srcdir/$NAME.expected"
46*cf84ac9aSAndroid Build Coastguard Workerawk '
47*cf84ac9aSAndroid Build Coastguard Worker/^[^ ]/ {
48*cf84ac9aSAndroid Build Coastguard Worker	if (out != "")
49*cf84ac9aSAndroid Build Coastguard Worker		print out
50*cf84ac9aSAndroid Build Coastguard Worker
51*cf84ac9aSAndroid Build Coastguard Worker	syscall = gensub(/^([[:alnum:]_]+)\(.*/, "\\1", 1)
52*cf84ac9aSAndroid Build Coastguard Worker	signal = gensub(/^--- ([A-Z]+) .*/, "\\1", 1)
53*cf84ac9aSAndroid Build Coastguard Worker
54*cf84ac9aSAndroid Build Coastguard Worker	if (syscall != $0) {
55*cf84ac9aSAndroid Build Coastguard Worker		out = syscall
56*cf84ac9aSAndroid Build Coastguard Worker		stop = 0
57*cf84ac9aSAndroid Build Coastguard Worker	} else if (signal != $0) {
58*cf84ac9aSAndroid Build Coastguard Worker		out = signal
59*cf84ac9aSAndroid Build Coastguard Worker		stop = 0
60*cf84ac9aSAndroid Build Coastguard Worker	} else {
61*cf84ac9aSAndroid Build Coastguard Worker		out = ""
62*cf84ac9aSAndroid Build Coastguard Worker	}
63*cf84ac9aSAndroid Build Coastguard Worker}
64*cf84ac9aSAndroid Build Coastguard Worker
65*cf84ac9aSAndroid Build Coastguard Worker/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) / && !stop {
66*cf84ac9aSAndroid Build Coastguard Worker	sym = gensub(/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) .*$/, "\\1", 1)
67*cf84ac9aSAndroid Build Coastguard Worker	out = out " " sym
68*cf84ac9aSAndroid Build Coastguard Worker	if (sym == "main")
69*cf84ac9aSAndroid Build Coastguard Worker		stop = 1
70*cf84ac9aSAndroid Build Coastguard Worker}' "$LOG" > "$OUT"
71*cf84ac9aSAndroid Build Coastguard Worker
72*cf84ac9aSAndroid Build Coastguard WorkerLC_ALL=C grep -E -x -f "$expected" < "$OUT" > /dev/null || {
73*cf84ac9aSAndroid Build Coastguard Worker	cat >&2 <<__EOF__
74*cf84ac9aSAndroid Build Coastguard WorkerFailed pattern of expected output:
75*cf84ac9aSAndroid Build Coastguard Worker$(cat "$expected")
76*cf84ac9aSAndroid Build Coastguard WorkerActual output:
77*cf84ac9aSAndroid Build Coastguard Worker$(cat "$OUT")
78*cf84ac9aSAndroid Build Coastguard Worker__EOF__
79*cf84ac9aSAndroid Build Coastguard Worker
80*cf84ac9aSAndroid Build Coastguard Worker	pattern=
81*cf84ac9aSAndroid Build Coastguard Worker	case "$STRACE_ARCH" in
82*cf84ac9aSAndroid Build Coastguard Worker		aarch64|i386|ppc*|s390*|sparc*|x32|x86*)
83*cf84ac9aSAndroid Build Coastguard Worker			# These architectures are supported by elfutils libdw,
84*cf84ac9aSAndroid Build Coastguard Worker			# see grep '\<HOOK\>.*\<abi_cfi\>' elfutils/backends
85*cf84ac9aSAndroid Build Coastguard Worker			;;
86*cf84ac9aSAndroid Build Coastguard Worker		arm) pattern='No DWARF information found'
87*cf84ac9aSAndroid Build Coastguard Worker			# This is also supported by elfutils libdw
88*cf84ac9aSAndroid Build Coastguard Worker			# but the latter needs debuginfo for unwinding.
89*cf84ac9aSAndroid Build Coastguard Worker			;;
90*cf84ac9aSAndroid Build Coastguard Worker		*) pattern='Unwinding not supported for this architecture'
91*cf84ac9aSAndroid Build Coastguard Worker			;;
92*cf84ac9aSAndroid Build Coastguard Worker	esac
93*cf84ac9aSAndroid Build Coastguard Worker	if [ -n "$pattern" ] &&
94*cf84ac9aSAndroid Build Coastguard Worker	   LC_ALL=C grep -x " > $pattern" < "$LOG" > /dev/null; then
95*cf84ac9aSAndroid Build Coastguard Worker		cat < "$LOG" >&2
96*cf84ac9aSAndroid Build Coastguard Worker		skip_ "stack tracing is not fully supported on $STRACE_ARCH yet"
97*cf84ac9aSAndroid Build Coastguard Worker	fi
98*cf84ac9aSAndroid Build Coastguard Worker
99*cf84ac9aSAndroid Build Coastguard Worker	dump_log_and_fail_with "$STRACE $args output mismatch"
100*cf84ac9aSAndroid Build Coastguard Worker}
101