diff options
Diffstat (limited to 'source3/script/tests')
-rwxr-xr-x | source3/script/tests/gdb_backtrace | 96 |
1 files changed, 71 insertions, 25 deletions
diff --git a/source3/script/tests/gdb_backtrace b/source3/script/tests/gdb_backtrace index 8a74d1c101..b19a5b2f4b 100755 --- a/source3/script/tests/gdb_backtrace +++ b/source3/script/tests/gdb_backtrace @@ -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` +UNAME=`uname` PID=$1 -if [ x"$PID" = x"" ]; then - echo "ERROR: ${BASENAME} needs a PID. " +BINARY=$2 + +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 -test x"${GDB_BIN}" = x"" && GDB_BIN=`type -p gdb` -if [ x"${GDB_BIN}" = x"" ]; then - echo "ERROR: ${BASENAME} needs an installed gdb. " +for DB in ${DB_LIST}; do + DB_BIN=`which ${DB} 2>/dev/null` + test x"${DB_BIN}" != x"" && { + break + } +done + +test x"${DB_BIN}" = x"" && { + echo "${BASENAME}: ERROR: No debugger found." exit 1 -fi +} -# 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} |