summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config_host.mk.in5
-rw-r--r--configure.ac54
-rwxr-xr-xsolenv/bin/gdb-core-bt.sh20
-rw-r--r--solenv/gbuild/CppunitTest.mk12
-rw-r--r--solenv/gbuild/JunitTest.mk4
-rw-r--r--solenv/gbuild/PythonTest.mk3
-rw-r--r--solenv/gbuild/UITest.mk3
7 files changed, 97 insertions, 4 deletions
diff --git a/config_host.mk.in b/config_host.mk.in
index 847e5af06a46..8b809bf9141f 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -89,6 +89,7 @@ export COMPILER_PLUGINS_DEBUG=@COMPILER_PLUGINS_DEBUG@
export COMPILER_PLUGINS_TOOLING_ARGS=@COMPILER_PLUGINS_TOOLING_ARGS@
export COMPRESSIONTOOL=@COMPRESSIONTOOL@
export COM_IS_CLANG=@COM_IS_CLANG@
+export COREDUMPCTL=@COREDUMPCTL@
export CPPU_ENV=@CPPU_ENV@
export CPPU_ENV_FOR_BUILD=@CPPU_ENV_FOR_BUILD@
export CPPUNIT_CFLAGS=$(gb_SPACE)@CPPUNIT_CFLAGS@
@@ -360,6 +361,7 @@ export JDK_FOR_BUILD=@JDK_FOR_BUILD@
export JDK_SECURITYMANAGER_DISALLOWED_FOR_BUILD=@JDK_SECURITYMANAGER_DISALLOWED_FOR_BUILD@
export JFREEREPORT_JAR=@JFREEREPORT_JAR@
export JITC_PROCESSOR_TYPE=@JITC_PROCESSOR_TYPE@
+export JQ=@JQ@
export JVM_ONE_PATH_CHECK=@JVM_ONE_PATH_CHECK@
export KF5_CFLAGS=$(gb_SPACE)@KF5_CFLAGS@
export KF5_LIBS=$(gb_SPACE)@KF5_LIBS@
@@ -691,6 +693,8 @@ SYSTEM_WPS=@SYSTEM_WPS@
SYSTEM_XMLSEC=@SYSTEM_XMLSEC@
SYSTEM_ZLIB=@SYSTEM_ZLIB@
SYSTEM_ZMF=@SYSTEM_ZMF@
+export SYSTEMD_ESCAPE=@SYSTEMD_ESCAPE@
+export SYSTEMD_RUN=@SYSTEMD_RUN@
export TARFILE_LOCATION=@TARFILE_LOCATION@
export TESTINSTALLDIR=@TESTINSTALLDIR@
export THES_SYSTEM_DIR=@THES_SYSTEM_DIR@
@@ -723,6 +727,7 @@ export WINDOWS_SDK_VERSION=@WINDOWS_SDK_VERSION@
export WINDOWS_SDK_WILANGID=@WINDOWS_SDK_WILANGID@
export WINDOWS_X64=@WINDOWS_X64@
export WITH_COMPAT_OOWRAPPERS=@WITH_COMPAT_OOWRAPPERS@
+export WITH_COREDUMPCTL=@WITH_COREDUMPCTL@
export WITH_EXTENSION_INTEGRATION=@WITH_EXTENSION_INTEGRATION@
export WITH_EXTRA_EXTENSIONS=@WITH_EXTRA_EXTENSIONS@
export WITH_FONTS=@WITH_FONTS@
diff --git a/configure.ac b/configure.ac
index 1d388c9dc189..e5ff818fca0a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2822,6 +2822,13 @@ AC_ARG_WITH(onedrive-client-secret,
authentication on OneDrive. If either this or
--with-onedrive-client-id is empty, the feature will be disabled]),
)
+
+dnl Check for coredumpctl support to present information about crashing test processes:
+AC_ARG_WITH(coredumpctl,
+ AS_HELP_STRING([--with-coredumpctl],
+ [Use coredumpctl (together with systemd-run) to retrieve core dumps of crashing test
+ processes.]))
+
dnl ===================================================================
dnl Do we want to use pre-build binary tarball for recompile
dnl ===================================================================
@@ -14561,6 +14568,53 @@ if test $_os = WINNT -a -f "$SRC_ROOT/antivirusDetection.vbs" ; then
fi
dnl ===================================================================
+
+AC_MSG_CHECKING([for coredumpctl support])
+if test -z "$with_coredumpctl" && test $_os != Linux; then
+ with_coredumpctl=no
+fi
+if test "$with_coredumpctl" = no; then
+ WITH_COREDUMPCTL=
+else
+ AC_PATH_PROG(COREDUMPCTL, coredumpctl)
+ AC_PATH_PROG(JQ, jq)
+ AC_PATH_PROG(SYSTEMD_ESCAPE, systemd-escape)
+ AC_PATH_PROG(SYSTEMD_RUN, systemd-run)
+ if test -z "$COREDUMPCTL" || test -z "$JQ" || test -z "$SYSTEMD_ESCAPE" \
+ || test -z "$SYSTEMD_RUN"
+ then
+ if test -z "$with_coredumpctl"; then
+ WITH_COREDUMPCTL=
+ else
+ if test -z "$COREDUMPCTL"; then
+ AC_MSG_ERROR([coredumpctl not found])
+ fi
+ if test -z "$JQ"; then
+ AC_MSG_ERROR([jq not found])
+ fi
+ if test -z "$SYSTEMD_ESCAPE"; then
+ AC_MSG_ERROR([syystemd-escape not found])
+ fi
+ if test -z "$SYSTEMD_RUN"; then
+ AC_MSG_ERROR([systemd-run not found])
+ fi
+ fi
+ else
+ WITH_COREDUMPCTL=TRUE
+ fi
+fi
+if test -z "$WITH_COREDUMPCTL"; then
+ AC_MSG_RESULT([no])
+else
+ AC_MSG_RESULT([yes])
+fi
+AC_SUBST(COREDUMPCTL)
+AC_SUBST(JQ)
+AC_SUBST(SYSTEMD_ESCAPE)
+AC_SUBST(SYSTEMD_RUN)
+AC_SUBST(WITH_COREDUMPCTL)
+
+dnl ===================================================================
dnl Setting up the environment.
dnl ===================================================================
AC_MSG_NOTICE([setting up the build environment variables...])
diff --git a/solenv/bin/gdb-core-bt.sh b/solenv/bin/gdb-core-bt.sh
index 8557825804ab..0276a70f4f0c 100755
--- a/solenv/bin/gdb-core-bt.sh
+++ b/solenv/bin/gdb-core-bt.sh
@@ -35,6 +35,26 @@ then
echo
fi
done
+ if test -n "$WITH_COREDUMPCTL"; then
+ # Unfortunately `coredumpctl debug` only operates on the most recent core dump matching any
+ # given criteria, not on all core dumps matching those criteria; so get the PIDs of all core
+ # dumps matching the given COREDUMP_USER_UNIT (and for which a core dump is still present)
+ # first, and then iterate over them (though this introduces possibilities for some,
+ # hopefully unlikely and mostly harmless, races, like when core dumps disappear in between,
+ # or multiple matching core dumps have identical PIDs):
+ for i in $($COREDUMPCTL --json=short list COREDUMP_USER_UNIT="$LIBO_TEST_UNIT".scope | \
+ $JQ -r 'map(select(.corefile=="present"))|map(.pid)|join(" ")')
+ do
+ GDBCOMMANDFILE=$(mktemp)
+ printf 'info registers\nthread apply all backtrace full\n' >"$GDBCOMMANDFILE"
+ PYTHONWARNINGS=default $COREDUMPCTL debug \
+ COREDUMP_USER_UNIT="$LIBO_TEST_UNIT".scope COREDUMP_PID="$i" \
+ --debugger-arguments="-iex 'add-auto-load-safe-path ${INSTDIR?}' \
+ -x '$GDBCOMMANDFILE' --batch"
+ rm "$GDBCOMMANDFILE"
+ found=x
+ done
+ fi
if [ -z "$found" -a "$EXITCODE" -ge 128 ]; then
echo
echo "No core file identified in directory ${COREDIR}"
diff --git a/solenv/gbuild/CppunitTest.mk b/solenv/gbuild/CppunitTest.mk
index b16e3d0e5417..18af97e7fff1 100644
--- a/solenv/gbuild/CppunitTest.mk
+++ b/solenv/gbuild/CppunitTest.mk
@@ -22,6 +22,15 @@
gb_CppunitTest_UNITTESTFAILED ?= $(GBUILDDIR)/platform/unittest-failed-default.sh
gb_CppunitTest_PYTHONDEPS ?= $(call gb_Library_get_target,pyuno_wrapper) $(if $(SYSTEM_PYTHON),,$(call gb_Package_get_target,python3))
+ifeq ($(WITH_COREDUMPCTL),)
+gb_CppunitTest_coredumpctl_setup :=
+gb_CppunitTest_coredumpctl_run :=
+else
+gb_CppunitTest_coredumpctl_setup = \
+ export LIBO_TEST_UNIT=$$($(SYSTEMD_ESCAPE) "$1:$$(date -u +%Y%m%d%H%M%S):$$$$" | cut -b -249) &&
+gb_CppunitTest_coredumpctl_run := $(SYSTEMD_RUN) --scope --user --unit="$$LIBO_TEST_UNIT"
+endif
+
ifneq ($(strip $(CPPUNITTRACE)),)
ifneq ($(filter gdb,$(CPPUNITTRACE)),)
# sneak (a) setting the LD_LIBRARY_PATH, and (b) setting malloc debug flags, into the "gdb --args" command line
@@ -126,6 +135,7 @@ else
$(if $(gb_CppunitTest__interactive),, \
$(if $(value gb_CppunitTest_postprocess), \
rm -fr $@.core && mkdir $@.core && cd $@.core &&)) \
+ $(call gb_CppunitTest_coredumpctl_setup,$@) \
( \
$(if $(gb_CppunitTest_localized),for l in $(WITH_LANG_LIST) ; do \
printf 'LO_TEST_LOCALE=%s\n' "$$l" && LO_TEST_LOCALE="$$l" ) \
@@ -142,7 +152,7 @@ else
PYTHONDONTWRITEBYTECODE=1) \
$(if $(filter gdb,$(CPPUNITTRACE)),\
PYTHONWARNINGS=default) \
- $(ICECREAM_RUN) $(gb_CppunitTest_GDBTRACE) $(gb_CppunitTest_VALGRINDTOOL) $(gb_CppunitTest_RR) \
+ $(ICECREAM_RUN) $(gb_CppunitTest_coredumpctl_run) $(gb_CppunitTest_GDBTRACE) $(gb_CppunitTest_VALGRINDTOOL) $(gb_CppunitTest_RR) \
$(gb_CppunitTest_CPPTESTCOMMAND) \
$(call gb_CppunitTest_get_linktarget_target,$*) \
$(call gb_CppunitTest__make_args) "-env:CPPUNITTESTTARGET=$@" \
diff --git a/solenv/gbuild/JunitTest.mk b/solenv/gbuild/JunitTest.mk
index 401c8ff5cd97..66f90a34f4c8 100644
--- a/solenv/gbuild/JunitTest.mk
+++ b/solenv/gbuild/JunitTest.mk
@@ -41,7 +41,9 @@ else
rm -rf $(call gb_JunitTest_get_userdir,$*) && \
mkdir -p $(call gb_JunitTest_get_userdir,$*)/user && \
cp $(SRCDIR)/qadevOOo/qa/registrymodifications.xcu $(call gb_JunitTest_get_userdir,$*)/user/ && \
- ($(gb_TEST_ENV_VARS) $(ICECREAM_RUN) $(gb_JunitTest_JAVACOMMAND) \
+ $(call gb_CppunitTest_coredumpctl_setup,$@) \
+ ($(gb_TEST_ENV_VARS) $(ICECREAM_RUN) $(gb_CppunitTest_coredumpctl_run) \
+ $(gb_JunitTest_JAVACOMMAND) \
-classpath "$(T_CP)" \
$(DEFS) \
org.junit.runner.JUnitCore \
diff --git a/solenv/gbuild/PythonTest.mk b/solenv/gbuild/PythonTest.mk
index 09f039771895..641ff838e4d2 100644
--- a/solenv/gbuild/PythonTest.mk
+++ b/solenv/gbuild/PythonTest.mk
@@ -48,6 +48,7 @@ else
$(if $(gb_CppunitTest__interactive),, \
$(if $(value gb_CppunitTest_postprocess), \
rm -fr $@.core && mkdir $@.core && cd $@.core &&)) \
+ $(call gb_CppunitTest_coredumpctl_setup,$@) \
{ \
$(if $(filter gdb,$(gb_PythonTest_GDBTRACE)),,$(gb_PythonTest_PRECOMMAND)) \
$(if $(G_SLICE),G_SLICE=$(G_SLICE)) \
@@ -62,7 +63,7 @@ else
$(gb_TEST_ENV_VARS) \
$(if $(filter gdb,$(CPPUNITTRACE)),\
PYTHONWARNINGS=default) \
- $(ICECREAM_RUN) $(gb_PythonTest_GDBTRACE) $(gb_CppunitTest_VALGRINDTOOL) $(gb_CppunitTest_RR) \
+ $(ICECREAM_RUN) $(gb_CppunitTest_coredumpctl_run) $(gb_PythonTest_GDBTRACE) $(gb_CppunitTest_VALGRINDTOOL) $(gb_CppunitTest_RR) \
$(gb_PythonTest_COMMAND) \
$(if $(PYTHON_TEST_NAME),$(PYTHON_TEST_NAME),$(MODULES)) \
; } \
diff --git a/solenv/gbuild/UITest.mk b/solenv/gbuild/UITest.mk
index 3b78b1356d90..2d5867b32d2e 100644
--- a/solenv/gbuild/UITest.mk
+++ b/solenv/gbuild/UITest.mk
@@ -37,7 +37,7 @@ else
gb_UITest_SOFFICEARG:=path:$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice
endif
-gb_UITest_COMMAND = $(ICECREAM_RUN) $(gb_CppunitTest_RR) $(gb_UITest_EXECUTABLE) $(SRCDIR)/uitest/test_main.py
+gb_UITest_COMMAND = $(ICECREAM_RUN) $(gb_CppunitTest_coredumpctl_run) $(gb_CppunitTest_RR) $(gb_UITest_EXECUTABLE) $(SRCDIR)/uitest/test_main.py
gb_TEST_ENV_VARS += LIBO_LANG=C
@@ -65,6 +65,7 @@ else
rm -fr $@.core && mkdir -p $(dir $(call gb_UITest_get_target,$*))user/ && mkdir $@.core && cd $@.core && ) \
$(if $(gb_UITest_use_config), \
cp $(gb_UITest_use_config) $(dir $(call gb_UITest_get_target,$*))user/. && ) \
+ $(call gb_CppunitTest_coredumpctl_setup,$@) \
($(gb_UITest_PRECOMMAND) \
$(if $(G_SLICE),G_SLICE=$(G_SLICE)) \
$(if $(GLIBCXX_FORCE_NEW),GLIBCXX_FORCE_NEW=$(GLIBCXX_FORCE_NEW)) \