[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
[samba.git] / source / script / tests / gdb_backtrace
index 2ea6a4d00a1d3f587f240a026981a7c80c1bb0ec..826381e9008ad9256c2a6a301d1b1b34e79c5e94 100644 (file)
@@ -1,41 +1,87 @@
-#! /bin/sh
-#
-# Author: Andrew Tridgell <tridge at samba dot org>
+#!/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)
+BASENAME=`basename $0`
+UNAME=`uname`
+
+PID=$1
+BINARY=$2
 
-test -z ${GDB_BIN} && GDB_BIN=$( type -p gdb)
-if [ -z ${GDB_BIN} ]; then
-       echo "ERROR: ${BASENAME} needs an installed gdb. "
+test x"${PID}" = x"" && {
+       echo "Usage: ${BASENAME} <pid> [<binary>]"
        exit 1
-fi
+}
+
+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
 
-if [ -z $1 ]; then
-       echo "ERROR: ${BASENAME} needs a PID. "
+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
-fi
-PID=$1
+}
 
-# use /dev/shm as default temp directory
-test -d /dev/shm && \
-       TMP_BASE_DIR=/dev/shm || \
-       TMP_BASE_DIR=/var/tmp
-TMPFILE=$( mktemp -p ${TMP_BASE_DIR} backtrace.XXXXXX)
-if [ $? -ne 0 ]; then
-       echo "ERROR: ${basename} can't create temp file in ${TMP_BASE_DIR}. "
+#
+# 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
-fi
+}
+
+echo "${BASENAME}: Trying to use ${DB_BIN} on ${BINARY} on PID ${PID}"
 
-cat << EOF  > "${TMPFILE}"
-set height 0
-up 8
+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
-
-${GDB_BIN} -x "${TMPFILE}" "/proc/${PID}/exe" "${PID}"
-
-/bin/rm -f "${TMPFILE}"
+       ${DB_BIN} -x "${BATCHFILE_MAIN}" "${BINARY}" "${PID}"
+       ;;
+esac
+/bin/rm -f ${BATCHFILE_PRE} ${BATCHFILE_MAIN}