diff options
author | Aaron <aaron@10gen.com> | 2011-03-24 12:21:36 -0700 |
---|---|---|
committer | Aaron <aaron@10gen.com> | 2011-03-24 15:42:48 -0700 |
commit | badd1cd93fce5c7a161f3384516f794dc6b79e5f (patch) | |
tree | 56326a4711fe492845c2ee4a156776b6950b2599 | |
parent | 8c0cb88da90db05510d1775c84a5bf32bb60450e (diff) | |
download | mongo-badd1cd93fce5c7a161f3384516f794dc6b79e5f.tar.gz |
SERVER-2808 print address information when available for signals
-rw-r--r-- | db/db.cpp | 26 |
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 ); |