diff options
| author | Thomas Munro <tmunro@postgresql.org> | 2025-11-06 17:25:04 +1300 |
|---|---|---|
| committer | Thomas Munro <tmunro@postgresql.org> | 2025-11-06 21:14:05 +1300 |
| commit | b498af4204bd832e11ffc87fe1999f113cc29a87 (patch) | |
| tree | 0773e451d7c5f164222e4e3067e48160dcfaadbe | |
| parent | d6c132d83bff76acd569175af7f53b7c1bf429f4 (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.yml | 3 | ||||
| -rwxr-xr-x | src/tools/ci/cores_backtrace.sh | 31 |
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 |
