diff options
author | Stefan Metzmacher <metze@samba.org> | 2008-10-28 12:20:59 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2008-10-28 12:20:59 +0100 |
commit | 6bc9fb887fa685a595b019c5ad6fc77f2fa3e914 (patch) | |
tree | e4b9f0b874fe9c33e57fbaf62547fa7467052f7f /selftest/gdb_backtrace | |
parent | 2b29b7186459d945ec448694164bfe4239b30d72 (diff) | |
download | samba-6bc9fb887fa685a595b019c5ad6fc77f2fa3e914.tar.gz samba-6bc9fb887fa685a595b019c5ad6fc77f2fa3e914.tar.bz2 samba-6bc9fb887fa685a595b019c5ad6fc77f2fa3e914.zip |
selftest: move gdb_* and valgrind_* scripts to selftest/
metze
Diffstat (limited to 'selftest/gdb_backtrace')
-rwxr-xr-x | selftest/gdb_backtrace | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/selftest/gdb_backtrace b/selftest/gdb_backtrace new file mode 100755 index 0000000000..826381e900 --- /dev/null +++ b/selftest/gdb_backtrace @@ -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} |