summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2011-03-24 12:21:36 -0700
committerAaron <aaron@10gen.com>2011-03-24 15:42:48 -0700
commitbadd1cd93fce5c7a161f3384516f794dc6b79e5f (patch)
tree56326a4711fe492845c2ee4a156776b6950b2599
parent8c0cb88da90db05510d1775c84a5bf32bb60450e (diff)
downloadmongo-badd1cd93fce5c7a161f3384516f794dc6b79e5f.tar.gz
SERVER-2808 print address information when available for signals
-rw-r--r--db/db.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/db/db.cpp b/db/db.cpp
index dfef183e040..fdd06df2674 100644
--- a/db/db.cpp
+++ b/db/db.cpp
@@ -1116,6 +1116,19 @@ namespace mongo {
dbexit( EXIT_ABRUPT );
}
+ void abruptQuitWithAddrSignal( int signal, struct __siginfo *siginfo, void * ) {
+ ostringstream oss;
+ oss << "Invalid";
+ if ( signal == SIGSEGV || signal == SIGBUS ) {
+ oss << " access";
+ } else {
+ oss << " operation";
+ }
+ oss << " at address: " << siginfo->si_addr << endl;
+ rawOut( oss.str() );
+ abruptQuit( signal );
+ }
+
sigset_t asyncSignals;
// The above signals will be processed by this thread only, in order to
// ensure the db and log mutexes aren't held.
@@ -1138,10 +1151,17 @@ namespace mongo {
void setupSignals_ignoreHelper( int signal ) {}
void setupSignals( bool inFork ) {
- assert( signal(SIGSEGV, abruptQuit) != SIG_ERR );
- assert( signal(SIGFPE, abruptQuit) != SIG_ERR );
+ struct sigaction addrSignals;
+ addrSignals.sa_sigaction = abruptQuitWithAddrSignal;
+ sigemptyset( &addrSignals.sa_mask );
+ addrSignals.sa_flags = SA_SIGINFO;
+
+ assert( sigaction(SIGSEGV, &addrSignals, 0) == 0 );
+ assert( sigaction(SIGBUS, &addrSignals, 0) == 0 );
+ assert( sigaction(SIGILL, &addrSignals, 0) == 0 );
+ assert( sigaction(SIGFPE, &addrSignals, 0) == 0 );
+
assert( signal(SIGABRT, abruptQuit) != SIG_ERR );
- assert( signal(SIGBUS, abruptQuit) != SIG_ERR );
assert( signal(SIGQUIT, abruptQuit) != SIG_ERR );
assert( signal(SIGPIPE, pipeSigHandler) != SIG_ERR );