diff options
-rw-r--r-- | config_host.mk.in | 5 | ||||
-rw-r--r-- | configure.ac | 54 | ||||
-rwxr-xr-x | solenv/bin/gdb-core-bt.sh | 20 | ||||
-rw-r--r-- | solenv/gbuild/CppunitTest.mk | 12 | ||||
-rw-r--r-- | solenv/gbuild/JunitTest.mk | 4 | ||||
-rw-r--r-- | solenv/gbuild/PythonTest.mk | 3 | ||||
-rw-r--r-- | solenv/gbuild/UITest.mk | 3 |
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)) \ |