Blob Blame History Raw
commit 699a741b488010d56cc358a5f7b4d8a8f4886347
Author: Mark Wielaard <mark@klomp.org>
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 <mark@klomp.org>

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 <mark@klomp.org>
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 <mark@klomp.org>

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