#!/bin/sh # # # This file is part of the LibreOffice project. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # #
EXECUTABLE=${1}
COREDIR=${2}
EXITCODE=${3}
if command -v gdb >/dev/null then
found= for COREFILE in "$COREDIR"/core* do if [ -f "$COREFILE" ] then
guess=$(file "$COREFILE")
guess=${guess#* execfn: \'}
guess=${guess%%\'*} if [ ! -x "$guess" ]; then guess=$EXECUTABLE; fi
printf '\nIt looks like %s generated %s\nBacktraces:\n' \ "$guess""$COREFILE"
GDBCOMMANDFILE=$(mktemp)
printf "info registers\nthread apply all backtrace full\n" \
>"$GDBCOMMANDFILE"
PYTHONWARNINGS=default gdb -iex "add-auto-load-safe-path ${INSTDIR?}" \
-x "$GDBCOMMANDFILE" --batch "$guess""$COREFILE" && found=x rm"$GDBCOMMANDFILE" echo fi done if test -n "$WITH_COREDUMPCTL"; then
systemd_version=$(systemctl --version | head -1 | awk '{ print $2 }') # We need systemd version >= 248 in order for coredumpctl to support --json and --debugger-arguments if [ $systemd_version -ge 248 ] 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 else # NoelGrandin - so I can confirm 3 things: # (1) virtually none of the jenkins boxes have coredumpctl new enough for the --json option. # (2) virtually none of the jenkins boxes have coredumpctl new enough for the --debugger-arguments option # (3) Around 50% of the time, coredumpctl will say it has no core files available, # even though we have just dumped core. # So just do our best, and hope that we are analysing the right core file. #
sleep 10s
$COREDUMPCTL -1 list # copy core file out of systemd
TEMPCOREFILE=$(mktemp)
$COREDUMPCTL -1 -o $TEMPCOREFILE dump # analyse core file with gdb
guess=$(file "$TEMPCOREFILE")
guess=${guess#* execfn: \'}
guess=${guess%%\'*} if [ ! -x "$guess" ]; then guess=$EXECUTABLE; fi
printf '\nOne of our tests dumped core, and we are generating a backtrace from the more recent core we can extract from coredumpctl.'
printf '\n'
printf '\n>>>>>This might not be the right one.<<<<'
printf '\n'
printf '\nIt looks like %s generated %s\nBacktraces:\n'"$guess""$TEMPCOREFILE"
GDBCOMMANDFILE=$(mktemp)
printf 'info registers\nthread apply all backtrace full\n' >"$GDBCOMMANDFILE"
PYTHONWARNINGS=default gdb -iex "add-auto-load-safe-path ${INSTDIR?}" \
-x "$GDBCOMMANDFILE" --batch "$guess""$TEMPCOREFILE" rm"$GDBCOMMANDFILE" rm"$TEMPCOREFILE"
found=x fi fi if [ -z "$found" -a "$EXITCODE" -ge 128 ]; then echo echo"No core file identified in directory ${COREDIR}" echo"To show backtraces for crashes during test execution," echo"enable core files with:" echo echo" ulimit -c unlimited" echo
exit 1 fi else echo"You need gdb in your path to show backtraces"
exit 1 fi
Messung V0.5
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.