summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2017-12-23 23:16:24 +0100
committerMark Wielaard <mark@klomp.org>2017-12-29 01:01:14 +0100
commit699a741b488010d56cc358a5f7b4d8a8f4886347 (patch)
treea27b90e123ee12e47b228cecc69b38f546ce91f8
parentc3bb9051c199ed22628ecb33ce781bca70b34eb4 (diff)
downloadelfutils-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/ChangeLog6
-rw-r--r--tests/Makefile.am3
-rw-r--r--tests/backtrace-subr.sh33
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
}