Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add some informations/help for the user on SIGSEGV
[simgrid.git] / src / simix / smx_global.c
index 71a85a4..0b2b78c 100644 (file)
 #include "mc/mc.h"
 #include "simgrid/sg_config.h"
 
+#ifdef HAVE_MC
+#include "mc/mc_private.h"
+#endif
+
+#ifdef HAVE_SMPI
+#include "smpi/private.h"
+#endif
+
 XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix,
                                 "Logging specific to SIMIX (kernel)");
@@ -31,15 +39,16 @@ int _sg_do_verbose_exit = 1;
 static void _XBT_CALL inthandler(int ignored)
 {
   if ( _sg_do_verbose_exit ) {
-     XBT_INFO("CTRL-C pressed. Displaying status and bailing out");
+     XBT_INFO("CTRL-C pressed. The current status will be displayed before exit (disable that behavior with option 'verbose-exit').");
      SIMIX_display_process_status();
   }
   else {
-     XBT_INFO("CTRL-C pressed. bailing out without displaying because verbose-exit is disabled");
+     XBT_INFO("CTRL-C pressed, exiting. Hiding the current process status since 'verbose-exit' is set to false.");
   }
   exit(1);
 }
 
+#ifndef WIN32
 static void _XBT_CALL segvhandler(int signum, siginfo_t *siginfo, void *context)
 {
   if (siginfo->si_signo == SIGSEGV && siginfo->si_code == SEGV_ACCERR) {
@@ -57,7 +66,23 @@ static void _XBT_CALL segvhandler(int signum, siginfo_t *siginfo, void *context)
               "siginfo = {si_signo = %d, si_errno = %d, si_code = %d, si_addr = %p}\n",
               siginfo->si_signo, siginfo->si_errno, siginfo->si_code, siginfo->si_addr);
     }
+  } else  if (siginfo->si_signo == SIGSEGV) {
+    fprintf(stderr, "Segmentation fault.\n");
+#ifdef HAVE_SMPI
+    if (smpi_enabled() && !smpi_privatize_global_variables) {
+      fprintf(stderr,
+        "Try to enable SMPI variable privatization with --cfg:smpi/privatize_global_variable:yes.\n");
+    }
+#endif
   }
+#ifdef HAVE_MC
+  if (MC_is_active()) {
+    if (mc_stack_safety) {
+      MC_dump_stack_safety(mc_stack_safety);
+    }
+    MC_print_statistics(mc_stats);
+  }
+#endif
   raise(signum);
 }
 
@@ -103,6 +128,7 @@ static void install_segvhandler(void)
   }
 }
 
+#endif
 /********************************* SIMIX **************************************/
 
 XBT_INLINE double SIMIX_timer_next(void)
@@ -160,9 +186,10 @@ void SIMIX_global_init(int *argc, char **argv)
     /* Prepare to display some more info when dying on Ctrl-C pressing */
     signal(SIGINT, inthandler);
 
+#ifndef WIN32
     /* Install SEGV handler */
     install_segvhandler();
-
+#endif
     /* register a function to be called by SURF after the environment creation */
     sg_platf_init();
     sg_platf_postparse_add_cb(SIMIX_post_create_environment);
@@ -188,9 +215,9 @@ void SIMIX_global_init(int *argc, char **argv)
  *
  * This functions remove the memory used by SIMIX
  */
-int cleaned = 0;
 void SIMIX_clean(void)
 {
+  static int cleaned = 0;
 #ifdef TIME_BENCH_PER_SR
   smx_ctx_raw_new_sr();
 #endif
@@ -532,6 +559,10 @@ void SIMIX_display_process_status(void)
         action_description = "sleeping";
         break;
 
+      case SIMIX_ACTION_JOIN:
+        action_description = "joining";
+        break;
+
       case SIMIX_ACTION_SYNCHRO:
         action_description = "synchronization";
         break;