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