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