summaryrefslogtreecommitdiffstats
path: root/examples/scripts/debugging
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
commit8daa83a594a2e98f39d764422bfbdbc62c9efd44 (patch)
tree4099e8021376c7d8c05bdf8503093d80e9c7bad0 /examples/scripts/debugging
parentInitial commit. (diff)
downloadsamba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.tar.xz
samba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.zip
Adding upstream version 2:4.20.0+dfsg.upstream/2%4.20.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'examples/scripts/debugging')
-rw-r--r--examples/scripts/debugging/linux/backtrace41
-rwxr-xr-xexamples/scripts/debugging/smbXsrvdump87
-rw-r--r--examples/scripts/debugging/solaris/README28
-rw-r--r--examples/scripts/debugging/solaris/solaris-oops.sh57
4 files changed, 213 insertions, 0 deletions
diff --git a/examples/scripts/debugging/linux/backtrace b/examples/scripts/debugging/linux/backtrace
new file mode 100644
index 0000000..7d14ff8
--- /dev/null
+++ b/examples/scripts/debugging/linux/backtrace
@@ -0,0 +1,41 @@
+#! /bin/sh
+#
+# Author: Andrew Tridgell <tridge at samba dot org>
+
+# we want everything on stderr, so the program is not disturbed
+exec 1>&2
+
+BASENAME=$(basename $0)
+
+test -z ${GDB_BIN} && GDB_BIN=$(type -p gdb)
+if [ -z ${GDB_BIN} ]; then
+ echo "ERROR: ${BASENAME} needs an installed gdb. "
+ exit 1
+fi
+
+if [ -z $1 ]; then
+ echo "ERROR: ${BASENAME} needs a PID. "
+ 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}. "
+ exit 1
+fi
+
+cat <<EOF >"${TMPFILE}"
+set height 0
+up 8
+bt full
+quit
+EOF
+
+${GDB_BIN} -x "${TMPFILE}" "/proc/${PID}/exe" "${PID}"
+
+/bin/rm -f "${TMPFILE}"
diff --git a/examples/scripts/debugging/smbXsrvdump b/examples/scripts/debugging/smbXsrvdump
new file mode 100755
index 0000000..f5c3091
--- /dev/null
+++ b/examples/scripts/debugging/smbXsrvdump
@@ -0,0 +1,87 @@
+#!/usr/bin/env python3
+
+import sys
+
+sys.path.insert(0, "bin/python")
+
+import os
+import argparse
+import struct
+
+from samba.ndr import ndr_unpack, ndr_print
+from samba.dcerpc import smbXsrv
+from samba.dcerpc import server_id
+import tdb
+
+def print_watchers(num_watched, blob):
+ for i in range(0,num_watched):
+ id = ndr_unpack(server_id.server_id, blob[:24])
+ print(ndr_print(id))
+ blob = blob[24:]
+
+def print_record(data, ndr_type, watched, ctdb):
+ blob = data
+
+ if ctdb:
+ (rsn, dmaster, reserved1, flags) = struct.unpack('QIII', bytes(blob[:20]))
+ blob = blob[24:]
+ print(" ctdb record header: rsn=%lu, dmaster=%u, reserved1=0x%x, flags=0x%x len=%u" %
+ (rsn, dmaster, reserved1, flags, len(blob)))
+ if len(blob) == 0:
+ return
+
+ if watched:
+ (num_watched, ) = struct.unpack('I', bytes(blob[:4]))
+ blob = blob[4:]
+
+ deleted_bit = 1<<31
+ deleted = num_watched & deleted_bit
+
+ num_watched = num_watched & ~deleted_bit
+ if num_watched > 0:
+ if deleted:
+ deleted_str = "yes"
+ else:
+ deleted_str = "no"
+ print(" num_watched: %d, deleted: %s" % (num_watched, deleted_str))
+ print_watchers(num_watched, blob)
+ blob = blob[num_watched*4:]
+
+ unpacked = ndr_unpack(ndr_type, blob, allow_remaining=True)
+ print(ndr_print(unpacked))
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument('path', help='Path to the TDB file')
+ parser.add_argument('-c', '--ctdb',
+ default=False,
+ action="store_true",
+ help='The TDB database is from a ctdb cluster')
+ args = parser.parse_args()
+
+ watched = False
+ if 'smbXsrv_session' in args.path:
+ ndr_type = smbXsrv.session_globalB
+ watched = True
+ elif 'smbXsrv_open' in args.path:
+ ndr_type = smbXsrv.open_globalB
+ elif 'smbXsrv_client' in args.path:
+ ndr_type = smbXsrv.client_globalB
+ watched = True
+ elif 'smbXsrv_tcon' in args.path:
+ ndr_type = smbXsrv.tcon_globalB
+ elif 'smbXsrv_version' in args.path:
+ ndr_type = smbXsrv.version_globalB
+ else:
+ raise Exception("Failed to guess NDR type")
+
+ tdb = tdb.Tdb(args.path, 0, tdb.INCOMPATIBLE_HASH, os.O_RDONLY)
+
+ i = 1
+ for k in tdb.keys():
+ data = tdb.get(k)
+ print("Record: %d" % i)
+ print_record(data, ndr_type, watched, args.ctdb)
+ i = i + 1
+
+ tdb.close()
diff --git a/examples/scripts/debugging/solaris/README b/examples/scripts/debugging/solaris/README
new file mode 100644
index 0000000..9e33680
--- /dev/null
+++ b/examples/scripts/debugging/solaris/README
@@ -0,0 +1,28 @@
+Last update: John H Terpstra - June 27, 2005
+
+Subject: This directory will contain debugging tools and tips.
+
+Notes: Identification and confirmation of some bugs can be difficult.
+ When such bugs are encountered it is necessary to provide as
+ sufficient detailed debugging information to assist the developer
+ both by providing incontrivertable proof of the problem, but also
+ precise information regarding the values of variables being processed
+ at the time the problem strikes.
+
+ This directory is the ideal place to locate useful hints, tips and
+ methods that will help Samba users to provide the information that
+ developers need.
+
+============================ Solaris Method A ==============================
+File: solaris-oops.sh
+Contributor: David Collier-Brown
+Date: June 27, 2005
+Method and Use:
+To the global stanza of smb.conf add:
+ panic action = /usr/local/bin/solaris-oops.sh %d
+
+When the panic action is initiated a voluntary core dump file will be placed
+in /var/tmp. Use this method with "log level = 10" and an smbd binary that
+has been built with the '-g' option.
+============================================================================
+
diff --git a/examples/scripts/debugging/solaris/solaris-oops.sh b/examples/scripts/debugging/solaris/solaris-oops.sh
new file mode 100644
index 0000000..2d8587d
--- /dev/null
+++ b/examples/scripts/debugging/solaris/solaris-oops.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# solaris_panic_action -- capture supporting information after a failure
+#
+ProgName=$(basename $0)
+LOGDIR=/usr/local/samba/var
+
+main()
+{
+ pid=$1
+
+ if [ $# -lt 1 ]; then
+ say "$ProgName error: you must supply a pid"
+ say "Usage: $0 pid"
+ exit 1
+ fi
+ cat >>$LOGDIR/log.solaris_panic_action <<!
+
+$(date)
+State information and vountary core dump for process $pid
+
+Related processes were:
+$(/usr/bin/ptree $pid)
+
+Stack(s) were:
+$(/usr/bin/pstack $pid)
+
+Flags were:
+$(/usr/bin/pflags $pid)
+
+Credentials were:
+$(/usr/bin/pcred $pid)
+
+Libraries used were:
+$(/usr/bin/pldd $pid)
+
+Signal-handler settings were:
+$(/usr/bin/psig $pid)
+
+Files and devices in use were:
+$(/usr/bin/pfiles $pid)
+
+Directory in use was:
+$(/usr/bin/pwdx $pid)
+
+
+A voluntary core dump was placed in /var/tmp/samba_solaris_panic_action_gcore.$pid
+$(gcore -o /var/tmp/samba_solaris_panic_action_gcore $pid)
+!
+}
+
+say()
+{
+ echo "$@" 1>&2
+}
+
+main "$@"