Explorar o código

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 %!s(int64=9) %!d(string=hai) anos
pai
achega
2e04ca2d2b
Modificáronse 4 ficheiros con 17 adicións e 5 borrados
  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
 #ifdef _WIN32
     TerminateProcess(GetCurrentProcess(), 1);
     TerminateProcess(GetCurrentProcess(), 1);
 #else
 #else
-    kill(getpid(), SIGKILL);
+   if (userabort)
+       kill(getpid(), SIGKILL);
+
 #endif
 #endif
 }
 }
 
 

+ 1 - 1
ecl/eclagent/eclagent.ipp

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

+ 2 - 1
roxie/ccd/ccdmain.cpp

@@ -374,7 +374,7 @@ public:
         {
         {
             socketListeners.item(idx).stopListening();
             socketListeners.item(idx).stopListening();
         }
         }
-        return false;
+        return false; // It returns to excsighandler() to abort!
     }
     }
 } abortHandler;
 } abortHandler;
 
 
@@ -1004,6 +1004,7 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
         tmpFlag |= _CRTDBG_CHECK_ALWAYS_DF;
         tmpFlag |= _CRTDBG_CHECK_ALWAYS_DF;
         _CrtSetDbgFlag( tmpFlag );
         _CrtSetDbgFlag( tmpFlag );
 #endif
 #endif
+        EnableSEHtoExceptionMapping();
         setSEHtoExceptionHandler(&abortHandler);
         setSEHtoExceptionHandler(&abortHandler);
         if (runOnce)
         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(SIGBUS, SIG_DFL);
     signal(SIGILL, SIG_DFL);
     signal(SIGILL, SIG_DFL);
     signal(SIGFPE, SIG_DFL);
     signal(SIGFPE, SIG_DFL);
+    signal(SIGABRT, SIG_DFL);
 #endif
 #endif
     StringBuffer s;
     StringBuffer s;
 
 
@@ -1200,8 +1201,14 @@ void excsighandler(int signum, siginfo_t *info, void *extra)
     *spp = ip;
     *spp = ip;
     sigsegv_exc = new CSEHException(signum,s.str());
     sigsegv_exc = new CSEHException(signum,s.str());
 #else
 #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
 #endif
     nested--;
     nested--;
 }
 }
@@ -1264,6 +1271,7 @@ void jlib_decl enableSEHtoExceptionMapping()
     sigaction(SIGILL, &act, NULL);
     sigaction(SIGILL, &act, NULL);
     sigaction(SIGBUS, &act, NULL);
     sigaction(SIGBUS, &act, NULL);
     sigaction(SIGFPE, &act, NULL);
     sigaction(SIGFPE, &act, NULL);
+    sigaction(SIGABRT, &act, NULL);
 #endif
 #endif
 }
 }
 
 
@@ -1286,6 +1294,7 @@ void  jlib_decl disableSEHtoExceptionMapping()
     signal(SIGBUS, SIG_DFL);
     signal(SIGBUS, SIG_DFL);
     signal(SIGILL, SIG_DFL);
     signal(SIGILL, SIG_DFL);
     signal(SIGFPE, SIG_DFL);
     signal(SIGFPE, SIG_DFL);
+    signal(SIGABRT, SIG_DFL);
 #endif
 #endif
 }
 }