Browse Source

HPCC-14749 Ensure HPCC generates core dump if abort condition sensed.

Add SIGBABRT to handled signals set.

Ensure to create core dump after we caught an abort like signal.

Update after review

Signed-off-by: Attila Vamos <attila.vamos@gmail.com>
Attila Vamos 9 years ago
parent
commit
2e04ca2d2b
4 changed files with 17 additions and 5 deletions
  1. 3 1
      ecl/eclagent/eclagent.cpp
  2. 1 1
      ecl/eclagent/eclagent.ipp
  3. 2 1
      roxie/ccd/ccdmain.cpp
  4. 11 2
      system/jlib/jexcept.cpp

+ 3 - 1
ecl/eclagent/eclagent.cpp

@@ -3113,7 +3113,9 @@ void EclAgent::fatalAbort(bool userabort,const char *excepttext)
 #ifdef _WIN32
     TerminateProcess(GetCurrentProcess(), 1);
 #else
-    kill(getpid(), SIGKILL);
+   if (userabort)
+       kill(getpid(), SIGKILL);
+
 #endif
 }
 

+ 1 - 1
ecl/eclagent/eclagent.ipp

@@ -424,7 +424,7 @@ private:
             StringBuffer text;
             e->errorMessage(text);
             parent.fatalAbort(false,text.str());
-            return true; // won't return hopefully!
+            return false; // It returns to excsighandler() to abort!
         }
     } *abortmonitor;
 

+ 2 - 1
roxie/ccd/ccdmain.cpp

@@ -374,7 +374,7 @@ public:
         {
             socketListeners.item(idx).stopListening();
         }
-        return false;
+        return false; // It returns to excsighandler() to abort!
     }
 } abortHandler;
 
@@ -1004,6 +1004,7 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
         tmpFlag |= _CRTDBG_CHECK_ALWAYS_DF;
         _CrtSetDbgFlag( tmpFlag );
 #endif
+        EnableSEHtoExceptionMapping();
         setSEHtoExceptionHandler(&abortHandler);
         if (runOnce)
         {

+ 11 - 2
system/jlib/jexcept.cpp

@@ -993,6 +993,7 @@ void excsighandler(int signum, siginfo_t *info, void *extra)
     signal(SIGBUS, SIG_DFL);
     signal(SIGILL, SIG_DFL);
     signal(SIGFPE, SIG_DFL);
+    signal(SIGABRT, SIG_DFL);
 #endif
     StringBuffer s;
 
@@ -1200,8 +1201,14 @@ void excsighandler(int signum, siginfo_t *info, void *extra)
     *spp = ip;
     sigsegv_exc = new CSEHException(signum,s.str());
 #else
-    if (SEHHandler && SEHHandler->fireException(new CSEHException(signum,s.str()))) 
-        return;
+    if (SEHHandler)
+    {
+        if ( SEHHandler->fireException(new CSEHException(signum,s.str())) )
+            return;
+        else
+            kill(getpid(), SIGABRT);
+    }
+
 #endif
     nested--;
 }
@@ -1264,6 +1271,7 @@ void jlib_decl enableSEHtoExceptionMapping()
     sigaction(SIGILL, &act, NULL);
     sigaction(SIGBUS, &act, NULL);
     sigaction(SIGFPE, &act, NULL);
+    sigaction(SIGABRT, &act, NULL);
 #endif
 }
 
@@ -1286,6 +1294,7 @@ void  jlib_decl disableSEHtoExceptionMapping()
     signal(SIGBUS, SIG_DFL);
     signal(SIGILL, SIG_DFL);
     signal(SIGFPE, SIG_DFL);
+    signal(SIGABRT, SIG_DFL);
 #endif
 }