diff options
author | Mark Wielaard <mark@klomp.org> | 2017-12-23 23:16:24 +0100 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2017-12-29 01:01:14 +0100 |
commit | 699a741b488010d56cc358a5f7b4d8a8f4886347 (patch) | |
tree | a27b90e123ee12e47b228cecc69b38f546ce91f8 | |
parent | c3bb9051c199ed22628ecb33ce781bca70b34eb4 (diff) | |
download | elfutils-699a741b488010d56cc358a5f7b4d8a8f4886347.tar.gz |
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 <mark@klomp.org>
-rw-r--r-- | tests/ChangeLog | 6 | ||||
-rw-r--r-- | tests/Makefile.am | 3 | ||||
-rw-r--r-- | tests/backtrace-subr.sh | 33 |
3 files changed, 40 insertions, 2 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog index e16a3d04..831532b2 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,9 @@ +2017-12-23 Mark Wielaard <mark@klomp.org> + + * backtrace-subr.sh (check_native_core): Use a lock file and try + to extract core using coredumpctl. + * Makefile.am (CLEANFILES): Clean core-dump-backtrace.lock. + 2017-12-11 Dima Kogan <dima@secretsauce.net> * run-aggregate-size.sh: Added check for multi-dimensional arrays. diff --git a/tests/Makefile.am b/tests/Makefile.am index fca00727..64cb5bd9 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 c1f31569..e04a7ea6 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 } |