1#!/bin/sh
2
3BASENAME=`basename $0`
4
5if [ -n "$VALGRIND" -o -n "$SMBD_VALGRIND" ]; then
6	echo "${BASENAME}: Not running debugger under valgrind"
7	exit 1
8fi
9
10# we want everything on stderr, so the program is not disturbed
11exec 1>&2
12
13BASENAME=`basename $0`
14UNAME=`uname`
15
16PID=$1
17BINARY=$2
18
19test x"${PID}" = x"" && {
20	echo "Usage: ${BASENAME} <pid> [<binary>]"
21	exit 1
22}
23
24DB_LIST="gdb"
25case "${UNAME}" in
26	#
27	# on Tru64 we need to try ladebug first
28	# because gdb crashes itself...
29	#
30	OSF1)
31		DB_LIST="ladebug ${DB_LIST}"
32	;;
33esac
34
35for DB in ${DB_LIST}; do
36	DB_BIN=`which ${DB} 2>/dev/null | grep '^/'`
37	test x"${DB_BIN}" != x"" && {
38		break
39	}
40done
41
42test x"${DB_BIN}" = x"" && {
43	echo "${BASENAME}: ERROR: No debugger found."
44	exit 1
45}
46
47#
48# we first try to use /proc/${PID}/exe
49# then fallback to the binary from the commandline
50# then we search for the commandline argument with
51# 'which'
52#
53test -f "/proc/${PID}/exe" && BINARY="/proc/${PID}/exe"
54test x"${BINARY}" = x"" && BINARY="/proc/${PID}/exe"
55test -f "${BINARY}" || BINARY=`which ${BINARY}`
56
57test -f "${BINARY}" || {
58	echo "${BASENAME}: ERROR: Cannot find binary '${BINARY}'."
59	exit 1
60}
61
62echo "${BASENAME}: Trying to use ${DB_BIN} on ${BINARY} on PID ${PID}"
63
64BATCHFILE_PRE=/tmp/gdb_backtrace_pre.$$
65BATCHFILE_MAIN=/tmp/gdb_backtrace_main.$$
66case "${DB}" in
67	ladebug)
68cat << EOF  > ${BATCHFILE_PRE}
69set \$stoponattach
70EOF
71
72cat << EOF  > ${BATCHFILE_MAIN}
73where
74quit
75EOF
76	${DB_BIN} -c "${BATCHFILE_MAIN}" -i "${BATCHFILE_PRE}" -pid "${PID}" "${BINARY}"
77	;;
78	gdb)
79cat << EOF  > ${BATCHFILE_MAIN}
80set height 1000
81bt full
82quit
83EOF
84	${DB_BIN} -x "${BATCHFILE_MAIN}" "${BINARY}" "${PID}"
85	;;
86esac
87/bin/rm -f ${BATCHFILE_PRE} ${BATCHFILE_MAIN}
88