From c45963c5d5cc0a3b8739ba158f781452a3fd89c5 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 12 Feb 2025 09:40:20 -0500 Subject: [PATCH] ci: Collect core files on NetBSD and OpenBSD Support for NetBSD and OpenBSD operating systems have been added to CI in the prior commit. Now add support for collect core files and generating backtraces using for all core files. Author: Nazir Bilal Yavuz Discussion: https://postgr.es/m/CAN55FZ32ySyYa06k9MFd+VY5vHhUyBpvgmJUZae5PihjzaurVg@mail.gmail.com --- .cirrus.tasks.yml | 15 +++++++++++++++ src/tools/ci/cores_backtrace.sh | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml index 0d99b787f5f..fffa438cec1 100644 --- a/.cirrus.tasks.yml +++ b/.cirrus.tasks.yml @@ -232,11 +232,13 @@ task: CCACHE_DIR: /home/postgres/cache PATH: /usr/sbin:$PATH + CORE_DUMP_DIR: /var/crash matrix: - name: NetBSD - Meson only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*' env: + OS_NAME: netbsd IMAGE_FAMILY: pg-ci-netbsd-postgres PKGCONFIG_PATH: '/usr/lib/pkgconfig:/usr/pkg/lib/pkgconfig' # initdb fails with: 'invalid locale settings' error on NetBSD. @@ -253,12 +255,15 @@ task: - name: OpenBSD - Meson only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*' env: + OS_NAME: openbsd IMAGE_FAMILY: pg-ci-openbsd-postgres PKGCONFIG_PATH: '/usr/lib/pkgconfig:/usr/local/lib/pkgconfig' UUID: -Duuid=e2fs TCL: -Dtcl_version=tcl86 setup_additional_packages_script: | #pkg_add -I ... + # Always core dump to ${CORE_DUMP_DIR} + set_core_dump_script: sysctl -w kern.nosuidcoredump=2 <<: *openbsd_task_template sysinfo_script: | @@ -276,6 +281,10 @@ task: chown -R postgres:users /home/postgres mkdir -p ${CCACHE_DIR} chown -R postgres:users ${CCACHE_DIR} + setup_core_files_script: | + mkdir -p ${CORE_DUMP_DIR} + chmod -R 770 ${CORE_DUMP_DIR} + chown -R postgres:users ${CORE_DUMP_DIR} # -Duuid=bsd is not set since 'bsd' uuid option # is not working on NetBSD & OpenBSD. See @@ -306,6 +315,12 @@ task: on_failure: <<: *on_failure_meson + cores_script: | + # Although we try to configure the OS to core dump inside + # ${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} # 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 28d3cecfc67..54607415258 100755 --- a/src/tools/ci/cores_backtrace.sh +++ b/src/tools/ci/cores_backtrace.sh @@ -9,7 +9,7 @@ os=$1 directory=$2 case $os in - freebsd|linux|macos) + freebsd|linux|macos|netbsd|openbsd) ;; *) echo "unsupported operating system ${os}" @@ -26,7 +26,7 @@ for corefile in $(find "$directory" -type f) ; do echo -e '\n\n' fi - if [ "$os" = 'macos' ]; then + if [ "$os" = 'macos' ] || [ "$os" = 'openbsd' ]; then lldb -c $corefile --batch -o 'thread backtrace all' -o 'quit' else auxv=$(gdb --quiet --core ${corefile} --batch -ex 'info auxv' 2>/dev/null) @@ -37,6 +37,8 @@ for corefile in $(find "$directory" -type f) ; do if [ "$os" = 'freebsd' ]; then binary=$(echo "$auxv" | grep AT_EXECPATH | perl -pe "s/^.*\"(.*)\"\$/\$1/g") + elif [ "$os" = 'netbsd' ]; then + binary=$(echo "$auxv" | grep AT_SUN_EXECNAME | perl -pe "s/^.*\"(.*)\"\$/\$1/g") elif [ "$os" = 'linux' ]; then binary=$(echo "$auxv" | grep AT_EXECFN | perl -pe "s/^.*\"(.*)\"\$/\$1/g") else