Files
systemd/tools/test-crash-trace.sh
Zbigniew Jędrzejewski-Szmek d8344fbf14 tools/test-crash-trace: do not use fixed signal numbers
The numbers of signals vary by arch. On the common arches the signals
listed here all use the same numbers, but people are likely to use
this on more fringe architectures too, so let's use symbolic names
instead.

Also the comment about gdb "hitting the same kill" didn't make sense.

The syntax is a bit baroque, but using a helper variable does not work.
Also shellcheck complains about $[ ] which would have made this more
legible.
2026-05-25 12:51:52 +01:00

57 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# meson test wrapper that replays crashing tests under gdb and prints a
# backtrace, so SIGSEGV/SIGABRT/etc. failures in CI show a stack trace inline
# in the test log instead of just an exit code.
#
# Usage: meson test --wrapper=$PWD/tools/test-crash-trace.sh
set -euo pipefail
if [[ $# -eq 0 ]]; then
echo "usage: $0 <command> [args...]" >&2
exit 2
fi
rc=0
"$@" || rc=$?
# Replay only on actual crash signals (128 + signal).
# SIGTERM/SIGKILL/SIGPIPE/SIGALRM mean the test was killed by the environment
# (timeout, etc.), and not that it really crashed, so it is not useful to
# replay it under gdb.
case "$rc" in
$((128 + $(kill -l ILL)))|$((128 + $(kill -l ABRT)))|$((128 + $(kill -l BUS)))|$((128 + $(kill -l FPE)))|$((128 + $(kill -l SEGV))))
if command -v gdb >/dev/null 2>&1; then
echo "===== exit $rc — replaying under gdb =====" >&2
style_args=()
if [[ -t 2 ]]; then
style_args=(--ex 'set style enabled on')
fi
gdb --batch \
--ex 'set pagination off' \
${style_args[@]+"${style_args[@]}"} \
--ex 'run' \
--ex 'thread apply all bt full' \
--args "$@" >&2 || true
else
echo "===== exit $rc — install gdb for a backtrace =====" >&2
fi
;;
esac
# If the child died by signal, re-raise it so the parent's wait() observes
# WIFSIGNALED instead of a plain exit code. Best-effort: SIGKILL can't be
# delivered to ourselves and would have killed us already.
if [[ $rc -gt 128 ]]; then
sig=$((rc - 128))
trap - "$sig" 2>/dev/null || true
# Suppress the wrapper bash's own core dump from the re-raised crash signal;
# the original test binary already had its chance to dump core on line 18.
ulimit -c 0
kill -s "$sig" $$ 2>/dev/null || true
fi
exit "$rc"