summaryrefslogtreecommitdiffstats
path: root/base/all/root/scripts/setup_segv_handler.sh
diff options
context:
space:
mode:
Diffstat (limited to 'base/all/root/scripts/setup_segv_handler.sh')
-rwxr-xr-xbase/all/root/scripts/setup_segv_handler.sh104
1 files changed, 0 insertions, 104 deletions
diff --git a/base/all/root/scripts/setup_segv_handler.sh b/base/all/root/scripts/setup_segv_handler.sh
deleted file mode 100755
index 763f22d..0000000
--- a/base/all/root/scripts/setup_segv_handler.sh
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/bin/bash
-# a script to setup a segmentation fault handler on a SoFS cluster
-# tridge@samba.org July 2008
-
-set -e
-
-echo "Creating source file"
-mkdir -p /usr/local/src
-
-cat <<EOFSOURCE > /usr/local/src/segv_handler.c
-#define _GNU_SOURCE
-#include <signal.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <dlfcn.h>
-
-static int segv_handler(int sig)
-{
- char cmd[100];
- char progname[100];
- char *p;
- int n;
-
- n = readlink("/proc/self/exe",progname,sizeof(progname));
- progname[n] = 0;
-
- p = strrchr(progname, '/');
- *p = 0;
-
- snprintf(cmd, sizeof(cmd), "/usr/local/bin/backtrace %d 2>&1 | tee /var/log/segv/segv_%s.%d.out > /dev/console",
- (int)getpid(), p+1, (int)getpid());
- system(cmd);
- signal(SIGSEGV, SIG_DFL);
- return 0;
-}
-
-static void segv_init() __attribute__((constructor));
-void segv_init(void)
-{
- signal(SIGSEGV, (sighandler_t) segv_handler);
- signal(SIGBUS, (sighandler_t) segv_handler);
-}
-EOFSOURCE
-
-mkdir -p /usr/local/bin
-cat <<EOFSOURCE > /usr/local/bin/backtrace
-#!/bin/sh
-
-# we want everything on stderr, so the program is not disturbed
-exec 1>&2
-
-PID=\$1
-TMPFILE=/tmp/gdb.\$\$
-cat << EOF > \$TMPFILE
-set height 0
-bt full
-thread apply all bt full
-quit
-EOF
-gdb -batch -x \$TMPFILE --pid \$PID < /dev/null
-/bin/rm -f \$TMPFILE
-
-EOFSOURCE
-
-chmod +x /usr/local/bin/backtrace
-
-mkdir -p /var/log/segv
-
-echo "Compiling 64 bit shared library"
-mkdir -p /usr/local/lib
-gcc -m64 -shared -fPIC -o /usr/local/lib/segv_handler64.so /usr/local/src/segv_handler.c
-
-echo "Compiling 32 bit shared library"
-mkdir -p /usr/local/lib
-gcc -m32 -shared -fPIC -o /usr/local/lib/segv_handler32.so /usr/local/src/segv_handler.c
-
-echo "Modifying /lib/ld-2.5.so for LD_PRELO32"
-sed -e 's@/etc/ld.so.preload@/etc/ld.so.prelo32@g' -i.orig /lib/ld-2.5.so
-# we need to remove the original to stop ldconfig enabling it
-rm -f /lib/ld-2.5.so.orig
-
-echo "Creating /etc/ld.so.prelo32"
-echo "/usr/local/lib/segv_handler32.so" > /etc/ld.so.prelo32
-
-echo "Creating /etc/ld.so.preload"
-echo "/usr/local/lib/segv_handler64.so" >> /etc/ld.so.preload
-sort -u < /etc/ld.so.preload > /etc/ld.so.preload.$$
-mv /etc/ld.so.preload.$$ /etc/ld.so.preload
-
-echo "Copying install to other nodes"
-onnode -p all rsync $HOSTNAME:/usr/local/bin/backtrace /usr/local/bin/
-onnode -p all rsync $HOSTNAME:/usr/local/lib/segv_handler*so /usr/local/lib
-onnode -p all rsync $HOSTNAME:/etc/ld.so.preload /etc/
-onnode -p all rsync $HOSTNAME:/etc/ld.so.prelo32 /etc/
-onnode -p all rsync $HOSTNAME:/lib/ld-2.5.so /lib/
-onnode -p all mkdir -p /var/log/segv
-onnode -p all chmod a+rwx /var/log/segv
-
-cat <<EOF
-segv_handler installed. To take full effect you must restart your daemons
-or reboot
-EOF