diff --git a/src/utils/SignalManager.cpp b/src/utils/SignalManager.cpp
index 4b2046a98796fc72cef406f77e7498930089f533..5054622c0d9959c089ddfa3f3a323820614c5806 100644
--- a/src/utils/SignalManager.cpp
+++ b/src/utils/SignalManager.cpp
@@ -52,17 +52,27 @@ SignalManager::signalName(int signal)
 void
 SignalManager::pauseForDebug(int signal)
 {
-  if (std::string(PUGS_BUILD_TYPE) != "Release") {
-    if (s_pause_on_error) {
-      // Each failing process must write
-      std::cerr.clear();
+  if (s_pause_on_error) {
+    // Each failing process must write
+    std::cerr.clear();
+    if (std::string(PUGS_BUILD_TYPE) != "Release") {
+      char hostname[HOST_NAME_MAX + 1];
+      gethostname(hostname, HOST_NAME_MAX + 1);
       std::cerr << "\n======================================\n"
-                << rang::style::reset << rang::fg::reset << rang::style::bold << "to attach gdb to this process run\n"
+                << rang::style::reset << rang::fg::reset << rang::style::bold << "Process paused on host \""
+                << rang::fg::yellow << hostname << rang::fg::reset << "\"\n"
+                << "to attach gdb to this process run\n"
                 << "\tgdb -pid " << rang::fg::red << getpid() << rang::fg::reset << '\n'
                 << "else press Control-C to exit\n"
                 << rang::style::reset << "======================================\n"
                 << std::flush;
       pause();
+    } else {
+      std::cerr << '\n'
+                << rang::style::bold
+                << "Pausing is useless for Release version.\n"
+                   "To attach debugger use Debug built type."
+                << rang::style::reset << '\n';
     }
   }
   std::exit(signal);
@@ -73,56 +83,52 @@ SignalManager::handler(int signal)
 {
   static std::mutex mutex;
 
-  if (mutex.try_lock()) {
-    std::signal(SIGTERM, SIG_DFL);
-    std::signal(SIGINT, SIG_DFL);
-    std::signal(SIGABRT, SIG_DFL);
-
-    // Each failing process must write
-    std::cerr.clear();
+  std::lock_guard<std::mutex> lock(mutex);
 
-    std::cerr << BacktraceManager{} << '\n';
+  std::signal(SIGINT, SIG_BLOCK);
 
-    std::cerr << "\n *** " << rang::style::reset << rang::fg::reset << rang::style::bold << "Signal " << rang::fgB::red
-              << signalName(signal) << rang::fg::reset << " caught" << rang::style::reset << " ***\n\n";
+  // Each failing process must write
+  std::cerr.clear();
 
-    std::exception_ptr eptr = std::current_exception();
-    try {
-      if (eptr) {
-        std::rethrow_exception(eptr);
-      } else {
-        std::ostringstream error_msg;
-        error_msg << "received " << signalName(signal);
-        std::cerr << ASTExecutionStack::getInstance().errorMessageAt(error_msg.str()) << '\n';
-      }
-    }
-    catch (const IBacktraceError& backtrace_error) {
-      auto source_location = backtrace_error.sourceLocation();
-      std::cerr << rang::fgB::cyan << source_location.file_name() << ':' << source_location.line() << ':'
-                << source_location.column() << ':' << rang::fg::reset << rang::fgB::yellow
-                << " threw the following exception" << rang::fg::reset << "\n\n";
-      std::cerr << ASTExecutionStack::getInstance().errorMessageAt(backtrace_error.what()) << '\n';
-    }
-    catch (const ParseError& parse_error) {
-      auto p = parse_error.positions().front();
-      std::cerr << rang::style::bold << p.source << ':' << p.line << ':' << p.column << ':' << rang::style::reset
-                << rang::fgB::red << " error: " << rang::fg::reset << rang::style::bold << parse_error.what()
-                << rang::style::reset << '\n';
-    }
-    catch (const IExitError& exit_error) {
-      std::cerr << ASTExecutionStack::getInstance().errorMessageAt(exit_error.what()) << '\n';
-    }
-    catch (const AssertError& assert_error) {
-      std::cerr << assert_error << '\n';
-    }
-    catch (...) {
-      std::cerr << "Unknown exception!\n";
-    }
+  std::cerr << BacktraceManager{} << '\n';
 
-    SignalManager::pauseForDebug(signal);
+  std::cerr << "\n *** " << rang::style::reset << rang::fg::reset << rang::style::bold << "Signal " << rang::fgB::red
+            << signalName(signal) << rang::fg::reset << " caught" << rang::style::reset << " ***\n\n";
 
-    mutex.unlock();
+  std::exception_ptr eptr = std::current_exception();
+  try {
+    if (eptr) {
+      std::rethrow_exception(eptr);
+    } else {
+      std::ostringstream error_msg;
+      error_msg << "received " << signalName(signal);
+      std::cerr << ASTExecutionStack::getInstance().errorMessageAt(error_msg.str()) << '\n';
+    }
+  }
+  catch (const IBacktraceError& backtrace_error) {
+    auto source_location = backtrace_error.sourceLocation();
+    std::cerr << rang::fgB::cyan << source_location.file_name() << ':' << source_location.line() << ':'
+              << source_location.column() << ':' << rang::fg::reset << rang::fgB::yellow
+              << " threw the following exception" << rang::fg::reset << "\n\n";
+    std::cerr << ASTExecutionStack::getInstance().errorMessageAt(backtrace_error.what()) << '\n';
   }
+  catch (const ParseError& parse_error) {
+    auto p = parse_error.positions().front();
+    std::cerr << rang::style::bold << p.source << ':' << p.line << ':' << p.column << ':' << rang::style::reset
+              << rang::fgB::red << " error: " << rang::fg::reset << rang::style::bold << parse_error.what()
+              << rang::style::reset << '\n';
+  }
+  catch (const IExitError& exit_error) {
+    std::cerr << ASTExecutionStack::getInstance().errorMessageAt(exit_error.what()) << '\n';
+  }
+  catch (const AssertError& assert_error) {
+    std::cerr << assert_error << '\n';
+  }
+  catch (...) {
+    std::cerr << "Unknown exception!\n";
+  }
+
+  SignalManager::pauseForDebug(signal);
 }
 
 void