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>
This commit is contained in:
parent
8d63961fc7
commit
3cd7290c16
@ -4,7 +4,10 @@ on_error() {
|
||||
if [ $? = 0 ]; then
|
||||
exit
|
||||
fi
|
||||
FILES_TO_PRINT="build/meson-logs/testlog.txt build/.ninja_log build/meson-logs/meson-log.txt"
|
||||
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
|
||||
@ -30,6 +33,26 @@ install_libabigail() {
|
||||
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
|
||||
@ -62,7 +85,11 @@ meson build --werror $OPTS
|
||||
ninja -C build
|
||||
|
||||
if [ "$AARCH64" != "true" ]; then
|
||||
devtools/test-null.sh
|
||||
failed=
|
||||
configure_coredump
|
||||
devtools/test-null.sh || failed="true"
|
||||
catch_coredump
|
||||
[ "$failed" != "true" ]
|
||||
fi
|
||||
|
||||
if [ "$ABI_CHECKS" = "true" ]; then
|
||||
@ -107,5 +134,9 @@ if [ "$ABI_CHECKS" = "true" ]; then
|
||||
fi
|
||||
|
||||
if [ "$RUN_TESTS" = "true" ]; then
|
||||
sudo meson test -C build --suite fast-tests -t 3
|
||||
failed=
|
||||
configure_coredump
|
||||
sudo meson test -C build --suite fast-tests -t 3 || failed="true"
|
||||
catch_coredump
|
||||
[ "$failed" != "true" ]
|
||||
fi
|
||||
|
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -104,6 +104,9 @@ jobs:
|
||||
if: env.AARCH64 == 'true'
|
||||
run: sudo apt install -y gcc-aarch64-linux-gnu libc6-dev-arm64-cross
|
||||
pkg-config-aarch64-linux-gnu
|
||||
- name: Install test tools packages
|
||||
if: env.AARCH64 != 'true' || env.RUN_TESTS == 'true'
|
||||
run: sudo apt install -y gdb
|
||||
- name: Install doc generation packages
|
||||
if: env.BUILD_DOCS == 'true'
|
||||
run: sudo apt install -y doxygen graphviz python3-sphinx
|
||||
@ -124,3 +127,4 @@ jobs:
|
||||
build/meson-logs/testlog.txt
|
||||
build/.ninja_log
|
||||
build/meson-logs/meson-log.txt
|
||||
build/gdb.log
|
||||
|
@ -4,6 +4,8 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@ -28,9 +30,14 @@ test_panic(void)
|
||||
|
||||
pid = fork();
|
||||
|
||||
if (pid == 0)
|
||||
if (pid == 0) {
|
||||
struct rlimit rl;
|
||||
|
||||
/* No need to generate a coredump when panicking. */
|
||||
rl.rlim_cur = rl.rlim_max = 0;
|
||||
setrlimit(RLIMIT_CORE, &rl);
|
||||
rte_panic("Test Debug\n");
|
||||
else if (pid < 0){
|
||||
} else if (pid < 0) {
|
||||
printf("Fork Failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
@ -1174,6 +1174,8 @@ test_refcnt_mbuf(void)
|
||||
}
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
/* use fork() to test mbuf errors panic */
|
||||
@ -1186,9 +1188,14 @@ verify_mbuf_check_panics(struct rte_mbuf *buf)
|
||||
pid = fork();
|
||||
|
||||
if (pid == 0) {
|
||||
struct rlimit rl;
|
||||
|
||||
/* No need to generate a coredump when panicking. */
|
||||
rl.rlim_cur = rl.rlim_max = 0;
|
||||
setrlimit(RLIMIT_CORE, &rl);
|
||||
rte_mbuf_sanity_check(buf, 1); /* should panic */
|
||||
exit(0); /* return normally if it doesn't panic */
|
||||
} else if (pid < 0){
|
||||
} else if (pid < 0) {
|
||||
printf("Fork Failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user