ATO-48, ATO-36, ATO-35, Step to consistent exception handling in AliRoot and optional...
authormivanov <marian.ivanov@cern.ch>
Sun, 1 Jun 2014 22:45:09 +0000 (00:45 +0200)
committermivanov <marian.ivanov@cern.ch>
Sun, 1 Jun 2014 22:45:09 +0000 (00:45 +0200)
ALIROOT/aliroot.cxx - Initialize AliLog before starting application
                    - Catch not caught exception and make AliFatal (stack/trace optionally core dumps)

http://stackoverflow.com/questions/1897940/in-what-ways-do-c-exceptions-slow-down-code-when-there-are-no-exceptions-thown
STEER/STEERBase/AliLog.{h,.cxx} -  dumy AliLog::TestException method for Unit test of exception handling

Example output:

root [0] AliLog::TestException()
Excception catchedTest exception
F-Exception catched: Exception catched
    at /u/miranov/AliRoot/git/TPCdev/STEER/STEERBase/AliLog.cxx:951
Aborted

*In case ALIROOT_FORCE_COREDUMP envirnment variable set*
AliLog::MakeCoreDump
[Thread debugging using libthread_db enabled]
0x00007fb61272f83e in __libc_waitpid (pid=<value optimized out>, stat_loc=0x7fff5489ee0c, options=<value optimized out>) at ../sysdeps/unix/sysv/linux/waitpid.c:32
32      ../sysdeps/unix/sysv/linux/waitpid.c: No such file or directory.
        in ../sysdeps/unix/sysv/linux/waitpid.c
Current language:  auto
The current source language is "auto; currently c".
Saved corefile core.AliRoot.25124

ALIROOT/aliroot.cxx
STEER/STEERBase/AliLog.cxx
STEER/STEERBase/AliLog.h

index 4576603..7d68296 100644 (file)
 #include <AliRun.h>
 #include "Riostream.h"
 #include "ARVersion.h"
+// STD
+#include <iostream>
+#include <algorithm>
+#include <sstream>
+#include <stdexcept>
+#include <functional>
+#include <AliLog.h>
+
 
 #if defined __linux
 //On linux Fortran wants this, so we give to it!
@@ -89,7 +97,7 @@ int main(int argc, char **argv)
   // Create new configuration 
   
   new AliRun("gAlice","The ALICE Off-line Simulation Framework");
-    
+  AliLog::GetRootLogger();  // force AliLog to initialize at start time
   // Start interactive geant
   
   TRint *theApp = new TRint("aliroot", &argc, argv);
@@ -98,7 +106,13 @@ int main(int argc, char **argv)
 #endif
   
   // --- Start the event loop ---
-  theApp->Run();
+  //  run.Info("Start AliRoot");
+  try{
+    theApp->Run();  
+  } catch(const exception &e){
+    cerr << "Excception catched" << e.what() << endl;
+    AliLog::Message(0, "Exception catched", "ROOT", NULL, "Exception catched", NULL, 0);
+  }
   
   return(0);
 }
index 02701b4..2e7d85e 100644 (file)
 #include <Varargs.h> // platform independent definition of va_copy
 
 #include "AliLog.h"
+// STD
+#include <iostream>
+#include <algorithm>
+#include <sstream>
+#include <stdexcept>
+#include <functional>
+
+
 
 using std::endl;
 using std::cout;
@@ -421,11 +429,13 @@ void AliLog::EnableDebug(Bool_t enabled)
 void AliLog::EnableCoreDump(Bool_t enabled)
 {
 // enable or disable debug output
-
+  gSystem->Exec("ulimit -c unlimited");
   fgCoreEnabled = enabled;
   gSystem->ResetSignal(kSigFloatingException,enabled);
   gSystem->ResetSignal(kSigSegmentationViolation,enabled);
-  if (enabled) printf("Core dump enabled\n");
+  if (enabled) {
+    printf("Core dump enabled\n");
+  }
   else { 
     printf("Core dump disabled\n");
   }
@@ -1223,3 +1233,12 @@ void AliLog::MakeCoreDump(const char *fout){
     gSystem->Exec(Form("gcore   %d", gSystem->GetPid()));
   }
 }
+
+
+void AliLog::TestException(){
+  //
+  // Dummy function to throw exception
+  //
+  throw std::runtime_error("Test exception");
+
+}
index edc045b..87ae022 100644 (file)
@@ -109,7 +109,7 @@ class AliLog: public TObject
   static ostream& Stream(EType_t type, UInt_t level,
                          const char* module, const char* className,
                          const char* function, const char* file, Int_t line);
-
+  static void TestException(); 
  private:
 
                // constructor is made private for implementing a singleton