summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/tools/ci/cores_backtrace.sh31
1 files changed, 27 insertions, 4 deletions
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