summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2025-11-06 17:25:04 +1300
committerThomas Munro <tmunro@postgresql.org>2025-11-06 21:14:05 +1300
commitb498af4204bd832e11ffc87fe1999f113cc29a87 (patch)
tree0773e451d7c5f164222e4e3067e48160dcfaadbe
parentd6c132d83bff76acd569175af7f53b7c1bf429f4 (diff)
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
-rw-r--r--.cirrus.tasks.yml3
-rwxr-xr-xsrc/tools/ci/cores_backtrace.sh31
2 files changed, 29 insertions, 5 deletions
diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml
index ceca6abbacd..2fe9671f3dc 100644
--- a/.cirrus.tasks.yml
+++ b/.cirrus.tasks.yml
@@ -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
diff --git a/src/tools/ci/cores_backtrace.sh b/src/tools/ci/cores_backtrace.sh
index 54607415258..cb325f21156 100755
--- a/src/tools/ci/cores_backtrace.sh
+++ b/src/tools/ci/cores_backtrace.sh
@@ -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