Keep the strace logs in job artifacts for tests which timed out.
This can be useful for figuring out why a timeout occurred.
strace cannot be used in jobs where ASAN is enabled, because ASAN's
leak checker also uses ptrace(), which isn't possible within strace.
Suggested-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9472>
# https://gitlab.com/gitlab-org/gitlab-ce/commit/8788fb925706cad594adf6917a6c5f6587dd1521
- artifacts
- _build/meson-logs/*.txt
+ - _build/meson-logs/strace
# Docker image tag helper templates
when: always
paths:
- _build/meson-logs/*.txt
+ - _build/meson-logs/strace
# scons:
- build/*/config.log
- shader-db
fi
# Only use GNU time if available, not any shell built-in command
-if test -f /usr/bin/time; then
- MESON_TEST_ARGS+=--wrapper=$PWD/.gitlab-ci/meson/test-wrapper.sh
-fi
+case $CI_JOB_NAME in
+ # ASAN leak detection is incompatible with strace
+ *-asan*)
+ if test -f /usr/bin/time; then
+ MESON_TEST_ARGS+=--wrapper=$PWD/.gitlab-ci/meson/time.sh
+ fi
+ ;;
+ *)
+ if test -f /usr/bin/time -a -f /usr/bin/strace; then
+ MESON_TEST_ARGS+=--wrapper=$PWD/.gitlab-ci/meson/time-strace.sh
+ fi
+ ;;
+esac
rm -rf _build
meson _build --native-file=native.file \
--- /dev/null
+#!/bin/sh
+
+STRACEDIR=meson-logs/strace/$(for i in $@; do basename -z -- $i; echo -n _; done)
+
+mkdir -p $STRACEDIR
+
+# If the test times out, meson sends SIGTERM to this process.
+# Simply exec'ing "time" would result in no output from that in this case.
+# Instead, we need to run "time" in the background, catch the signals and
+# propagate them to the actual test process.
+
+/usr/bin/time -v strace -ff -tt -T -o $STRACEDIR/log "$@" &
+TIMEPID=$!
+STRACEPID=$(ps --ppid $TIMEPID -o pid=)
+TESTPID=$(ps --ppid $STRACEPID -o pid=)
+
+if test "x$TESTPID" != x; then
+ trap 'kill -TERM $TESTPID; wait $TIMEPID; exit $?' TERM
+fi
+
+wait $TIMEPID
+EXITCODE=$?
+
+# Only keep strace logs if the test timed out
+rm -rf $STRACEDIR &
+
+exit $EXITCODE