commit 699a741b488010d56cc358a5f7b4d8a8f4886347 Author: Mark Wielaard Date: Sat Dec 23 23:16:24 2017 +0100 tests: Try to use coredumpctl to extract core files. If systemd-coredump is installed we have to use coredumpctl to extract the core file to test. Unfortunately systemd-coredump/coredumpctl seem to be somewhat fragile if multiple core dumps are generated/extracted at the same time. So use a lock file to only run one core dump test at a time (under make -j). Signed-off-by: Mark Wielaard diff --git a/tests/Makefile.am b/tests/Makefile.am index fca0072..64cb5bd 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -515,6 +515,9 @@ dwarf_default_lower_bound_LDADD = $(libdw) system_elf_libelf_test_CPPFLAGS = system_elf_libelf_test_LDADD = $(libelf) +# A lock file used to make sure only one test dumps core at a time +CLEANFILES += core-dump-backtrace.lock + if GCOV check: check-am coverage .PHONY: coverage diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh index c1f3156..e04a7ea 100644 --- a/tests/backtrace-subr.sh +++ b/tests/backtrace-subr.sh @@ -137,19 +137,46 @@ check_native() # Backtrace core file. check_native_core() { +# systemd-coredump/coredumpctl doesn't seem to like concurrent core dumps +# use a lock file (fd 200) tests/core-dump-backtrace.lock +( child=$1 # Disable valgrind while dumping core. SAVED_VALGRIND_CMD="$VALGRIND_CMD" unset VALGRIND_CMD + # Wait for lock for 10 seconds or skip. + flock -x -w 10 200 || exit 77; + # Skip the test if we cannot adjust core ulimit. - core="core.`ulimit -c unlimited || exit 77; set +ex; testrun ${abs_builddir}/$child --gencore; true`" + pid="`ulimit -c unlimited || exit 77; set +ex; testrun ${abs_builddir}/$child --gencore; true`" + core="core.$pid" # see if /proc/sys/kernel/core_uses_pid is set to 0 if [ -f core ]; then mv core "$core" fi - if [ ! -f "$core" ]; then echo "No $core file generated"; exit 77; fi + type -P coredumpctl && have_coredumpctl=1 || have_coredumpctl=0 + if [ ! -f "$core" -a $have_coredumpctl -eq 1 ]; then + # Maybe systemd-coredump took it. But give it some time to dump first... + sleep 1 + coredumpctl --output="$core" dump $pid || rm -f $core + + # Try a couple of times after waiting some more if something went wrong... + if [ ! -f "$core" ]; then + sleep 2 + coredumpctl --output="$core" dump $pid || rm -f $core + fi + + if [ ! -f "$core" ]; then + sleep 3 + coredumpctl --output="$core" dump $pid || rm -f $core + fi + fi + if [ ! -f "$core" ]; then + echo "No $core file generated"; + exit 77; + fi if [ "x$SAVED_VALGRIND_CMD" != "x" ]; then VALGRIND_CMD="$SAVED_VALGRIND_CMD" @@ -163,4 +190,6 @@ check_native_core() cat $core.{bt,err} check_native_unsupported $core.err $child-$core check_all $core.{bt,err} $child-$core + rm $core{,.{bt,err}} +) 200>${abs_builddir}/core-dump-backtrace.lock } commit 61e33d72788c58467668b2f2ad44d5b95ebbee80 Author: Mark Wielaard Date: Fri Feb 16 20:34:25 2018 +0100 tests: Accept any core if no core with the "correct" pid can be found. In some containers our view of pids is confused. We see the container pid namespace, but the core is generated using the host pid namespace. Since tests are run in a new fresh directory any core here is most like is ours. Signed-off-by: Mark Wielaard diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh index e04a7ea..ff42c6f 100644 --- a/tests/backtrace-subr.sh +++ b/tests/backtrace-subr.sh @@ -174,6 +174,13 @@ check_native_core() fi fi if [ ! -f "$core" ]; then + # In some containers our view of pids is confused. Since tests are + # run in a new fresh directory any core here is most like is ours. + if ls core.[0-9]* 1> /dev/null 2>&1; then + mv core.[0-9]* "$core" + fi + fi + if [ ! -f "$core" ]; then echo "No $core file generated"; exit 77; fi