unwind: tests: add a test for -k option

* tests/stack-fcall.c: New test target.
* tests/strace-k.test: New test driver.
* tests/Makefile.am (check_PROGRAMS): Add stack-fcall.
(TESTS): Add strace-k.test.
* tests/.gitignore: Add stack-fcall.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
This commit is contained in:
Masatake YAMATO 2014-05-14 13:16:29 +09:00 committed by Dmitry V. Levin
parent ed69fc2dc3
commit 9682107053
4 changed files with 64 additions and 1 deletions

1
tests/.gitignore vendored
View File

@ -2,6 +2,7 @@ net-accept-connect
scm_rights
set_ptracer_any
sigaction
stack-fcall
uio
*.log
*.log.*

View File

@ -7,6 +7,7 @@ check_PROGRAMS = \
scm_rights \
set_ptracer_any \
sigaction \
stack-fcall \
uio
uio_CFLAGS = $(AM_CFLAGS) -D_FILE_OFFSET_BITS=64
@ -24,7 +25,8 @@ TESTS = \
count.test \
detach-sleeping.test \
detach-stopped.test \
detach-running.test
detach-running.test \
strace-k.test
net-fd.log: net.log

23
tests/stack-fcall.c Normal file
View File

@ -0,0 +1,23 @@
#include <unistd.h>
#include <sys/types.h>
/* Use "volatile" to avoid compiler optimization. */
int f1(int i)
{
static uid_t (* volatile g)(void) = getuid;
return g() + i;
}
int f0(volatile int i)
{
static int (* volatile g)(int) = f1;
return g(i) - i;
}
int main(int argc, char** argv)
{
static int (* volatile g)(int) = f0;
g(argc);
return 0;
}

37
tests/strace-k.test Executable file
View File

@ -0,0 +1,37 @@
#!/bin/sh
# Ensure that strace -k works.
. "${srcdir=.}/init.sh"
# strace -k is implemented using /proc/$pid/maps
[ -f /proc/self/maps ] ||
framework_skip_ '/proc/self/maps is not available'
check_prog sed
check_prog tr
./stack-fcall ||
fail_ 'stack-fcall failed'
$STRACE -h | grep '^-k' > /dev/null ||
skip_ 'strace -k is not available'
args="-e getuid -k ./stack-fcall"
$STRACE $args > $LOG 2>&1 || {
cat $LOG
fail_ "$STRACE $args failed"
}
expected='getuid f1 f0 main '
result=$(sed -n '1,/(main+0x[a-f0-9]\+) .*/ s/^.*(\([^+]\+\)+0x[a-f0-9]\+) .*/\1/p' $LOG |
tr '\n' ' ')
test "$result" = "$expected" || {
cat $LOG
echo "expected: \"$expected\""
echo "result: \"$result\""
fail_ "unexpected output from $STRACE $args"
}
exit 0