numam-dpdk/.ci/linux-build.sh
David Marchand 3cd7290c16 ci: catch coredumps
Parts of the unit tests code rely on forked/secondary processes
(expectedly) failing.
A crash in those situations could be missed so add a check on coredumps
presence after unit tests have run.
When unit tests fail, it can also help checking for coredumps as it
could give more insights on what happened.

In some situations (like explicit call to rte_panic), coredump generation
must be disabled to avoid false positives.

Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Luca Boccassi <bluca@debian.org>
Acked-by: Aaron Conole <aconole@redhat.com>
2021-03-03 10:05:23 +01:00

143 lines
4.1 KiB
Bash
Executable File

#!/bin/sh -xe
on_error() {
if [ $? = 0 ]; then
exit
fi
FILES_TO_PRINT="build/meson-logs/testlog.txt"
FILES_TO_PRINT="$FILES_TO_PRINT build/.ninja_log"
FILES_TO_PRINT="$FILES_TO_PRINT build/meson-logs/meson-log.txt"
FILES_TO_PRINT="$FILES_TO_PRINT build/gdb.log"
for pr_file in $FILES_TO_PRINT; do
if [ -e "$pr_file" ]; then
cat "$pr_file"
fi
done
}
# We capture the error logs as artifacts in Github Actions, no need to dump
# them via a EXIT handler.
[ -n "$GITHUB_WORKFLOW" ] || trap on_error EXIT
install_libabigail() {
version=$1
instdir=$2
wget -q "http://mirrors.kernel.org/sourceware/libabigail/${version}.tar.gz"
tar -xf ${version}.tar.gz
cd $version && autoreconf -vfi && cd -
mkdir $version/build
cd $version/build && ../configure --prefix=$instdir && cd -
make -C $version/build all install
rm -rf $version
rm ${version}.tar.gz
}
configure_coredump() {
# No point in configuring coredump without gdb
which gdb >/dev/null || return 0
ulimit -c unlimited
sudo sysctl -w kernel.core_pattern=/tmp/dpdk-core.%e.%p
}
catch_coredump() {
ls /tmp/dpdk-core.*.* 2>/dev/null || return 0
for core in /tmp/dpdk-core.*.*; do
binary=$(sudo readelf -n $core |grep $(pwd)/build/ 2>/dev/null |head -n1)
[ -x $binary ] || binary=
sudo gdb $binary -c $core \
-ex 'info threads' \
-ex 'thread apply all bt full' \
-ex 'quit'
done |tee -a build/gdb.log
return 1
}
if [ "$AARCH64" = "true" ]; then
# convert the arch specifier
if [ "$CC_FOR_BUILD" = "gcc" ]; then
OPTS="$OPTS --cross-file config/arm/arm64_armv8_linux_gcc"
elif [ "$CC_FOR_BUILD" = "clang" ]; then
OPTS="$OPTS --cross-file config/arm/arm64_armv8_linux_clang_ubuntu1804"
fi
fi
if [ "$BUILD_DOCS" = "true" ]; then
OPTS="$OPTS -Denable_docs=true"
fi
if [ "$BUILD_32BIT" = "true" ]; then
OPTS="$OPTS -Dc_args=-m32 -Dc_link_args=-m32"
export PKG_CONFIG_LIBDIR="/usr/lib32/pkgconfig"
fi
if [ "$DEF_LIB" = "static" ]; then
OPTS="$OPTS -Dexamples=l2fwd,l3fwd"
else
OPTS="$OPTS -Dexamples=all"
fi
OPTS="$OPTS -Dmachine=default"
OPTS="$OPTS --default-library=$DEF_LIB"
OPTS="$OPTS --buildtype=debugoptimized"
OPTS="$OPTS -Dcheck_includes=true"
meson build --werror $OPTS
ninja -C build
if [ "$AARCH64" != "true" ]; then
failed=
configure_coredump
devtools/test-null.sh || failed="true"
catch_coredump
[ "$failed" != "true" ]
fi
if [ "$ABI_CHECKS" = "true" ]; then
LIBABIGAIL_VERSION=${LIBABIGAIL_VERSION:-libabigail-1.6}
if [ "$(cat libabigail/VERSION 2>/dev/null)" != "$LIBABIGAIL_VERSION" ]; then
rm -rf libabigail
# if we change libabigail, invalidate existing abi cache
rm -rf reference
fi
if [ ! -d libabigail ]; then
install_libabigail $LIBABIGAIL_VERSION $(pwd)/libabigail
echo $LIBABIGAIL_VERSION > libabigail/VERSION
fi
export PATH=$(pwd)/libabigail/bin:$PATH
REF_GIT_REPO=${REF_GIT_REPO:-https://dpdk.org/git/dpdk}
REF_GIT_TAG=${REF_GIT_TAG:-v19.11}
if [ "$(cat reference/VERSION 2>/dev/null)" != "$REF_GIT_TAG" ]; then
rm -rf reference
fi
if [ ! -d reference ]; then
refsrcdir=$(readlink -f $(pwd)/../dpdk-$REF_GIT_TAG)
git clone --single-branch -b $REF_GIT_TAG $REF_GIT_REPO $refsrcdir
meson $OPTS -Dexamples= $refsrcdir $refsrcdir/build
ninja -C $refsrcdir/build
DESTDIR=$(pwd)/reference ninja -C $refsrcdir/build install
devtools/gen-abi.sh reference
find reference/usr/local -name '*.a' -delete
rm -rf reference/usr/local/bin
rm -rf reference/usr/local/share
echo $REF_GIT_TAG > reference/VERSION
fi
DESTDIR=$(pwd)/install ninja -C build install
devtools/gen-abi.sh install
devtools/check-abi.sh reference install ${ABI_CHECKS_WARN_ONLY:-}
fi
if [ "$RUN_TESTS" = "true" ]; then
failed=
configure_coredump
sudo meson test -C build --suite fast-tests -t 3 || failed="true"
catch_coredump
[ "$failed" != "true" ]
fi