[launchd-changes] [22891] trunk/launchd/src/launchd.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Oct 12 17:54:01 PDT 2006


Revision: 22891
          http://trac.macosforge.org/projects/launchd/changeset/22891
Author:   zarzycki at apple.com
Date:     2006-10-12 17:54:01 -0700 (Thu, 12 Oct 2006)

Log Message:
-----------
Better internal crash reporting.

Modified Paths:
--------------
    trunk/launchd/src/launchd.c

Modified: trunk/launchd/src/launchd.c
===================================================================
--- trunk/launchd/src/launchd.c	2006-10-12 19:13:23 UTC (rev 22890)
+++ trunk/launchd/src/launchd.c	2006-10-13 00:54:01 UTC (rev 22891)
@@ -94,13 +94,14 @@
 static void testfd_or_openfd(int fd, const char *path, int flags);
 static bool get_network_state(void);
 static void monitor_networking_state(void);
-static void fatal_signal_handler(int sig);
+static void fatal_signal_handler(int sig, siginfo_t *si, void *uap);
 
 static bool re_exec_in_single_user_mode = false;
 static char *pending_stdout = NULL;
 static char *pending_stderr = NULL;
 static job_t rlcj = NULL;
 static jmp_buf doom_doom_doom;
+static void *crash_addr;
 
 sigset_t blocked_signals = 0;
 bool shutdown_in_progress = false;
@@ -116,6 +117,7 @@
 		SIGTTIN, SIGTTOU, SIGIO, SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF,
 		SIGWINCH, SIGINFO, SIGUSR1, SIGUSR2
 	};
+	struct sigaction fsa;
 	bool sflag = false, dflag = false, Dflag = false;
 	mach_msg_type_number_t l2l_name_cnt = 0, l2l_port_cnt = 0, l2l_pid_cnt = 0;
 	pid_t *l2l_pids = NULL;
@@ -330,18 +332,37 @@
 		init_pre_kevent();
 	}
 
-	launchd_assert(setjmp(doom_doom_doom) == 0);
-	launchd_assumes(signal(SIGILL, fatal_signal_handler) != SIG_ERR);
-	launchd_assumes(signal(SIGFPE, fatal_signal_handler) != SIG_ERR);
-	launchd_assumes(signal(SIGBUS, fatal_signal_handler) != SIG_ERR);
-	launchd_assumes(signal(SIGSEGV, fatal_signal_handler) != SIG_ERR);
+	switch (setjmp(doom_doom_doom)) {
+	case SIGILL:
+	case SIGFPE:
+		syslog(LOG_EMERG, "We crashed at instruction: %p", crash_addr);
+		abort();
+	case SIGBUS:
+	case SIGSEGV:
+		syslog(LOG_EMERG, "We crashed trying to read/write: %p", crash_addr);
+		abort();
+	default:
+		abort();
+	case 0:
+		break;
+	}
 
+	fsa.sa_sigaction = fatal_signal_handler;
+	fsa.sa_flags = SA_SIGINFO;
+	sigemptyset(&fsa.sa_mask);
+
+	launchd_assumes(sigaction(SIGILL, &fsa, NULL) != -1);
+	launchd_assumes(sigaction(SIGFPE, &fsa, NULL) != -1);
+	launchd_assumes(sigaction(SIGBUS, &fsa, NULL) != -1);
+	launchd_assumes(sigaction(SIGSEGV, &fsa, NULL) != -1);
+
 	launchd_runtime();
 }
 
 void
-fatal_signal_handler(int sig)
+fatal_signal_handler(int sig, siginfo_t *si, void *uap)
 {
+	crash_addr = si->si_addr;
 	longjmp(doom_doom_doom, sig);
 }
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061012/315e6f01/attachment.html


More information about the launchd-changes mailing list