1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-07 19:06:32 +03:00

ci: Improve OpenBSD core dump backtrace handling.

Since OpenBSD core dumps do not embed executable paths, the script now
searches for the corresponding binary manually within the specified
directory before invoking LLDB.  This is imperfect but should find the
right executable in practice, as needed for meaningful backtraces.

Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/CAN55FZ36R74TZ8RKsFueYwLxGKDAm3LU2FHM_ZUCSB6imd3vYA@mail.gmail.com
Backpatch-through: 18
This commit is contained in:
Thomas Munro
2025-11-06 17:25:04 +13:00
parent d6c132d83b
commit b498af4204
2 changed files with 29 additions and 5 deletions

View File

@@ -328,6 +328,7 @@ task:
OS_NAME: openbsd
IMAGE_FAMILY: pg-ci-openbsd-postgres
PKGCONFIG_PATH: '/usr/lib/pkgconfig:/usr/local/lib/pkgconfig'
CORE_DUMP_EXECUTABLE_DIR: $CIRRUS_WORKING_DIR/build/tmp_install/usr/local/pgsql/bin
MESON_FEATURES: >-
-Dbsd_auth=enabled
@@ -396,7 +397,7 @@ task:
# ${CORE_DUMP_DIR}, they may not obey this. So, move core files to the
# ${CORE_DUMP_DIR} directory.
find build/ -type f -name '*.core' -exec mv '{}' ${CORE_DUMP_DIR} \;
src/tools/ci/cores_backtrace.sh ${OS_NAME} ${CORE_DUMP_DIR}
src/tools/ci/cores_backtrace.sh ${OS_NAME} ${CORE_DUMP_DIR} ${CORE_DUMP_EXECUTABLE_DIR}
# configure feature flags, shared between the task running the linux tests and

View File

@@ -1,12 +1,18 @@
#! /bin/sh
if [ $# -ne 2 ]; then
os=$1
directory=$2
executable_directory=$3
if [ "$os" != 'openbsd' ] && [ $# -ne 2 ]; then
echo "cores_backtrace.sh <os> <directory>"
exit 1
fi
os=$1
directory=$2
if [ "$os" = 'openbsd' ] && [ $# -ne 3 ]; then
echo "cores_backtrace.sh <os> <core_directory> <executable_directory>"
exit 1
fi
case $os in
freebsd|linux|macos|netbsd|openbsd)
@@ -17,6 +23,10 @@ case $os in
;;
esac
if [ "$os" = 'openbsd' ]; then
export PATH="${executable_directory}:${PATH}"
fi
first=1
for corefile in $(find "$directory" -type f) ; do
if [ "$first" -eq 1 ]; then
@@ -26,8 +36,21 @@ for corefile in $(find "$directory" -type f) ; do
echo -e '\n\n'
fi
if [ "$os" = 'macos' ] || [ "$os" = 'openbsd' ]; then
if [ "$os" = 'macos' ]; then
lldb -c $corefile --batch -o 'thread backtrace all' -o 'quit'
elif [ "$os" = 'openbsd' ]; then
# OpenBSD's ELF format doesn't include executable information, so we
# search for the executable manually in <executable_directory>.
filename=$(basename "$corefile")
base=$(echo "$filename" | sed 's/\.core.*$//')
binary=$(which "${base}")
if [ -z "$binary" ]; then
echo "executable ${base} not found in ${PATH}, running 'lldb' without debug information"
lldb -c "$corefile" --batch -o 'thread backtrace all' -o 'quit'
else
lldb "$binary" -c "$corefile" --batch -o 'thread backtrace all' -o 'quit'
fi
else
auxv=$(gdb --quiet --core ${corefile} --batch -ex 'info auxv' 2>/dev/null)
if [ $? -ne 0 ]; then