selftest: move gdb_* and valgrind_* scripts to selftest/
[garming/samba-autobuild/.git] / selftest / gdb_backtrace
diff --git a/selftest/gdb_backtrace b/selftest/gdb_backtrace
new file mode 100755 (executable)
index 0000000..826381e
--- /dev/null
@@ -0,0 +1,87 @@
+#!/bin/sh
+
+BASENAME=`basename $0`
+
+if [ -n "$VALGRIND" -o -n "$SMBD_VALGRIND" ]; then
+       echo "${BASENAME}: Not running debugger under valgrind"
+       exit 1
+fi
+
+# we want everything on stderr, so the program is not disturbed
+exec 1>&2
+
+BASENAME=`basename $0`
+UNAME=`uname`
+
+PID=$1
+BINARY=$2
+
+test x"${PID}" = x"" && {
+       echo "Usage: ${BASENAME} <pid> [<binary>]"
+       exit 1
+}
+
+DB_LIST="gdb"
+case "${UNAME}" in
+       #
+       # on Tru64 we need to try ladebug first
+       # because gdb crashes itself...
+       #
+       OSF1)
+               DB_LIST="ladebug ${DB_LIST}"
+       ;;
+esac
+
+for DB in ${DB_LIST}; do
+       DB_BIN=`which ${DB} 2>/dev/null | grep '^/'`
+       test x"${DB_BIN}" != x"" && {
+               break
+       }
+done
+
+test x"${DB_BIN}" = x"" && {
+       echo "${BASENAME}: ERROR: No debugger found."
+       exit 1
+}
+
+#
+# we first try to use /proc/${PID}/exe
+# then fallback to the binary from the commandline
+# then we search for the commandline argument with
+# 'which'
+#
+test -f "/proc/${PID}/exe" && BINARY="/proc/${PID}/exe"
+test x"${BINARY}" = x"" && BINARY="/proc/${PID}/exe"
+test -f "${BINARY}" || BINARY=`which ${BINARY}`
+
+test -f "${BINARY}" || {
+       echo "${BASENAME}: ERROR: Cannot find binary '${BINARY}'."
+       exit 1
+}
+
+echo "${BASENAME}: Trying to use ${DB_BIN} on ${BINARY} on PID ${PID}"
+
+BATCHFILE_PRE=/tmp/gdb_backtrace_pre.$$
+BATCHFILE_MAIN=/tmp/gdb_backtrace_main.$$
+case "${DB}" in
+       ladebug)
+cat << EOF  > ${BATCHFILE_PRE}
+set \$stoponattach
+EOF
+
+cat << EOF  > ${BATCHFILE_MAIN}
+where
+quit
+EOF
+       ${DB_BIN} -c "${BATCHFILE_MAIN}" -i "${BATCHFILE_PRE}" -pid "${PID}" "${BINARY}"
+       ;;
+       gdb)
+cat << EOF  > ${BATCHFILE_MAIN}
+set height 1000
+bt full
+quit
+EOF
+       ${DB_BIN} -x "${BATCHFILE_MAIN}" "${BINARY}" "${PID}"
+       ;;
+esac
+/bin/rm -f ${BATCHFILE_PRE} ${BATCHFILE_MAIN}