diff options
Diffstat (limited to 'selftest')
-rwxr-xr-x | selftest/gdb_backtrace | 87 | ||||
-rw-r--r-- | selftest/gdb_backtrace_test.c | 42 | ||||
-rwxr-xr-x | selftest/gdb_run | 20 | ||||
-rwxr-xr-x | selftest/selftest.pl | 2 | ||||
-rw-r--r-- | selftest/target/Samba4.pm | 2 | ||||
-rwxr-xr-x | selftest/valgrind_run | 9 |
6 files changed, 160 insertions, 2 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} diff --git a/selftest/gdb_backtrace_test.c b/selftest/gdb_backtrace_test.c new file mode 100644 index 0000000000..506784f675 --- /dev/null +++ b/selftest/gdb_backtrace_test.c @@ -0,0 +1,42 @@ +/* + +add a usefull tool to test the gdb_backtrace script + +just compile it with +cc -g -o gdb_backtrace_test gdb_backtrace_test.c + +and run it in the same directory where your gdb_backtrace script is. + +2006 - Stefan Metzmacher <metze@samba.org> + +*/ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <signal.h> + +static const char *prog; + +static void sig_fault(int sig) +{ + int ret; + char cmdstr[200]; + + snprintf(cmdstr, sizeof(cmdstr), + "./gdb_backtrace %u %s", + getpid(), prog); + printf("sig_fault start: %s\n", cmdstr); + ret = system(cmdstr); + printf("sig_fault end: %d\n", ret); +} + +int main(int argc, const char **argv) +{ + prog = argv[0]; + + signal(SIGABRT, sig_fault); + + abort(); + return 0; +} diff --git a/selftest/gdb_run b/selftest/gdb_run new file mode 100755 index 0000000000..8ad101ed60 --- /dev/null +++ b/selftest/gdb_run @@ -0,0 +1,20 @@ +#!/bin/sh + +ENV="$1" + +shift 1 + +if test -z "$TMPDIR"; then + TMPDIR="/tmp" +fi + +TMPFILE=$TMPDIR/gdb_run.$$ +cat << EOF > $TMPFILE +run +bt +EOF + +trap "/bin/rm -f $TMPFILE" EXIT +CMD="gdb -x $TMPFILE --args $@" +echo $CMD +eval $ENV "$CMD" diff --git a/selftest/selftest.pl b/selftest/selftest.pl index 2484bd0687..aa99b2ed6f 100755 --- a/selftest/selftest.pl +++ b/selftest/selftest.pl @@ -573,7 +573,7 @@ sub write_clientconf($$) print CF " private dir = $prefix_abs/client/private name resolve order = bcast - panic action = $srcdir_abs/script/gdb_backtrace \%PID\% \%PROG\% + panic action = $RealBin/gdb_backtrace \%PID\% \%PROG\% max xmit = 32K notify:inotify = false ldb:nosync = true diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm index 9364008ee2..8c79a31448 100644 --- a/selftest/target/Samba4.pm +++ b/selftest/target/Samba4.pm @@ -562,7 +562,7 @@ sub provision($$$$$$) name resolve order = bcast interfaces = $interfaces tls dh params file = $tlsdir/dhparms.pem - panic action = $srcdir/script/gdb_backtrace \%PID% \%PROG% + panic action = $RealBin/gdb_backtrace \%PID% \%PROG% wins support = yes server role = $server_role max xmit = 32K diff --git a/selftest/valgrind_run b/selftest/valgrind_run new file mode 100755 index 0000000000..5171d171a7 --- /dev/null +++ b/selftest/valgrind_run @@ -0,0 +1,9 @@ +#!/bin/sh + +ENV="$1" + +shift 1 + +CMD="$ENV valgrind -q --db-attach=yes --num-callers=30 $@" +echo $CMD +eval $CMD |