Changeset: 28e16671d2ae for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=28e16671d2ae
Modified Files:
        tools/merovingian/daemon/handlers.c
        tools/merovingian/daemon/handlers.h
        tools/merovingian/daemon/merovingian.c
Branch: Dec2011
Log Message:

monetdbd: install SIGSEGV handler

For bug #2961, add SIGSEGV handler which attempts to write a message
identifying the crash to the logfile before going down.  This is just a
best-effort attempt to make it visible in the log that a crash has
occurred.


diffs (66 lines):

diff --git a/tools/merovingian/daemon/handlers.c 
b/tools/merovingian/daemon/handlers.c
--- a/tools/merovingian/daemon/handlers.c
+++ b/tools/merovingian/daemon/handlers.c
@@ -221,4 +221,32 @@ childhandler(int sig, siginfo_t *si, voi
                        (long long int)si->si_pid);
 }
 
+/**
+ * Last resort handler to give a message in the log.
+ */
+void
+segvhandler(int sig) {
+       struct sigaction sa;
+
+       (void)sig;
+
+       /* (try to) ignore any further segfaults */
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = 0;
+       sa.sa_handler = SIG_IGN;
+       sigaction(SIGSEGV, &sa, NULL);
+
+       if (_mero_topdp != NULL) {
+               char errmsg[] = "\nSEGMENTATION FAULT OCCURRED\n"
+                               "\na fatal error has occurred which prevents 
monetdbd from operating."
+                               "\nThis is likely a bug in monetdbd, please 
report it on http://bugs.monetdb.org/";
+                               "\nand include the tail of this log in your 
bugreport with your explanation of "
+                               "\nwhat you were doing, if possible.\n"
+                               "\nABORTING NOW, YOU HAVE TO MANUALLY KILL ALL 
REMAINING mserver5 PROCESSES\n";
+               if (write(_mero_topdp->err, errmsg, sizeof(errmsg) - 1) >= 0)
+                       sync();
+       }
+       abort();
+}
+
 /* vim:set ts=4 sw=4 noexpandtab: */
diff --git a/tools/merovingian/daemon/handlers.h 
b/tools/merovingian/daemon/handlers.h
--- a/tools/merovingian/daemon/handlers.h
+++ b/tools/merovingian/daemon/handlers.h
@@ -25,6 +25,7 @@
 void handler(int sig);
 void huphandler(int sig);
 void childhandler(int sig, siginfo_t *si, void *unused);
+void segvhandler(int sig);
 
 #endif
 
diff --git a/tools/merovingian/daemon/merovingian.c 
b/tools/merovingian/daemon/merovingian.c
--- a/tools/merovingian/daemon/merovingian.c
+++ b/tools/merovingian/daemon/merovingian.c
@@ -1028,6 +1028,15 @@ main(int argc, char *argv[])
 
        sigemptyset(&sa.sa_mask);
        sa.sa_flags = 0;
+       sa.sa_handler = segvhandler;
+       if (sigaction(SIGSEGV, &sa, NULL) == -1) {
+               Mfprintf(oerr, "%s: FATAL: unable to create signal handlers: 
%s\n",
+                               argv[0], strerror(errno));
+               MERO_EXIT(1);
+       }
+
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = 0;
        sa.sa_handler = SIG_IGN;
        if (sigaction(SIGPIPE, &sa, NULL) == -1) {
                Mfprintf(oerr, "%s: FATAL: unable to create signal handlers: 
%s\n",
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to