From: Masatake YAMATO Date: Wed, 14 May 2014 04:16:29 +0000 (+0900) Subject: unwind: tests: add a test for -k option X-Git-Tag: v4.9~46 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9682107053968402da7afca7e82e2c6281d05518;p=strace 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 Signed-off-by: Dmitry V. Levin --- diff --git a/tests/.gitignore b/tests/.gitignore index 7a87842d..e22e556d 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -2,6 +2,7 @@ net-accept-connect scm_rights set_ptracer_any sigaction +stack-fcall uio *.log *.log.* diff --git a/tests/Makefile.am b/tests/Makefile.am index b561ce3e..efe646db 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 diff --git a/tests/stack-fcall.c b/tests/stack-fcall.c new file mode 100644 index 00000000..04339b18 --- /dev/null +++ b/tests/stack-fcall.c @@ -0,0 +1,23 @@ +#include +#include + +/* 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; +} diff --git a/tests/strace-k.test b/tests/strace-k.test new file mode 100755 index 00000000..329f3024 --- /dev/null +++ b/tests/strace-k.test @@ -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