From: David Marchand <david.marchand@redhat.com>
To: dev@dpdk.org
Cc: Aaron Conole <aconole@redhat.com>,
Michael Santana <maicolgabriel@hotmail.com>,
Olivier Matz <olivier.matz@6wind.com>
Subject: [dpdk-dev] [PATCH v2] ci: catch coredumps
Date: Mon, 25 Jan 2021 16:05:39 +0100 [thread overview]
Message-ID: <20210125150539.27537-1-david.marchand@redhat.com> (raw)
In-Reply-To: <20210111100146.3485-1-david.marchand@redhat.com>
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.
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since RFC v1
- removed RFC,
- pushed coredumps into gdb for in-situ analysis,
- gdb presence is used to enable the check. Travis config is left
untouched for now,
---
.ci/linux-build.sh | 37 ++++++++++++++++++++++++++++++++++---
.github/workflows/build.yml | 4 ++++
app/test/test_debug.c | 11 +++++++++--
app/test/test_mbuf.c | 9 ++++++++-
4 files changed, 55 insertions(+), 6 deletions(-)
diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index d2c821adf3..26c30a2301 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -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
OPTS="$OPTS --cross-file config/arm/arm64_armv8_linux_gcc"
@@ -57,7 +80,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
@@ -102,5 +129,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
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a5b579adda..786525e5a3 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -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
diff --git a/app/test/test_debug.c b/app/test/test_debug.c
index 834a7386f5..23b24db177 100644
--- a/app/test/test_debug.c
+++ b/app/test/test_debug.c
@@ -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;
}
diff --git a/app/test/test_mbuf.c b/app/test/test_mbuf.c
index a40f7d4883..47a7b197d7 100644
--- a/app/test/test_mbuf.c
+++ b/app/test/test_mbuf.c
@@ -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;
}
--
2.23.0
next prev parent reply other threads:[~2021-01-25 15:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-11 10:01 [dpdk-dev] [RFC PATCH] " David Marchand
2021-01-11 13:17 ` Aaron Conole
2021-01-25 15:05 ` David Marchand [this message]
2021-03-02 16:16 ` [dpdk-dev] [PATCH v2] " Luca Boccassi
2021-03-02 21:17 ` Aaron Conole
2021-03-03 9:03 ` David Marchand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210125150539.27537-1-david.marchand@redhat.com \
--to=david.marchand@redhat.com \
--cc=aconole@redhat.com \
--cc=dev@dpdk.org \
--cc=maicolgabriel@hotmail.com \
--cc=olivier.matz@6wind.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).