loolwsd/LOOLKit.cpp | 4 ++++ loolwsd/LOOLWSD.cpp | 2 -- loolwsd/Util.cpp | 31 ++++++++++++++++++++++++++++--- 3 files changed, 32 insertions(+), 5 deletions(-)
New commits: commit 913723e581e56eacd068588fe838b6abdadf72a1 Author: Tor Lillqvist <[email protected]> Date: Fri Apr 8 15:31:30 2016 +0300 Include the "SIG" prefix in Util::signalName() diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp index 34216e8..77c8cdb 100644 --- a/loolwsd/Util.cpp +++ b/loolwsd/Util.cpp @@ -307,7 +307,7 @@ namespace Util { switch (signo) { -#define CASE(x) case SIG##x: return #x +#define CASE(x) case SIG##x: return "SIG" #x CASE(HUP); CASE(INT); CASE(QUIT); commit 4129b7b84ea582c93edbc4c8690c06d50eb7aeca Author: Tor Lillqvist <[email protected]> Date: Fri Apr 8 15:29:05 2016 +0300 Don't use strsignal(), use Util::signalName() Presumably it is only developers that are interested in signals, and terms like SEGV or ABRT are more precise than their textual descriptions like "Segmentation violation" or "Aborted". diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 4da8ed3..aaea71f 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -1077,7 +1077,7 @@ void lokit_main(const std::string& childRoot, } // Sleep a second here in case we get a fatal signal just when about to finish up, which sadly - // seems to happen often, so that the fatalSignalHandler in Util.cpp has time to produce a + // seems to happen often, so that handleFatalSignal() in Util.cpp has time to produce a // backtrace. sleep(1); Log::info("Process finished."); diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 7cf37c4..b8becd1 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -1438,7 +1438,6 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/) fate = "core-dumped"; Log::error() << "Child process [" << pid << "] " << fate << " with " << Util::signalName(WTERMSIG(status)) - << " signal: " << strsignal(WTERMSIG(status)) << Log::end; break; @@ -1447,7 +1446,6 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/) { Log::info() << "Child process [" << pid << "] stopped with " << Util::signalName(WSTOPSIG(status)) - << " signal: " << strsignal(WTERMSIG(status)) << Log::end; } else if (WIFCONTINUED(status)) diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp index ce65ec9..34216e8 100644 --- a/loolwsd/Util.cpp +++ b/loolwsd/Util.cpp @@ -393,7 +393,7 @@ namespace Util log_signal(LogPrefix); log_signal(" Termination signal received: "); - log_signal(strsignal(signal)); + log_signal(signalName(signal).c_str()); log_signal("\n"); } } @@ -419,7 +419,7 @@ namespace Util { log_signal(LogPrefix); log_signal(" Fatal signal received: "); - log_signal(strsignal(signal)); + log_signal(signalName(signal).c_str()); log_signal("\n"); if (std::getenv("LOOL_DEBUG")) commit f7612b989a6f1129520d61b652e52922ff65025e Author: Tor Lillqvist <[email protected]> Date: Fri Apr 8 15:22:52 2016 +0300 Give a potential handleFatalSignal() time do its job Sleep a second before exiting in case we get a fatal signal just when about to finish, which sadly seems to happen often. (In fact, if handleFatalSignal() is running at the same time, it will kill the process so we never get to the _Exit() call.) diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 82e81ac..4da8ed3 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -1076,6 +1076,10 @@ void lokit_main(const std::string& childRoot, Log::error(std::string("Exception: ") + exc.what()); } + // Sleep a second here in case we get a fatal signal just when about to finish up, which sadly + // seems to happen often, so that the fatalSignalHandler in Util.cpp has time to produce a + // backtrace. + sleep(1); Log::info("Process finished."); std::_Exit(Application::EXIT_OK); } commit fb0f31d2e81eafd45044a914a05eacd706f54c17 Author: Tor Lillqvist <[email protected]> Date: Fri Apr 8 15:22:22 2016 +0300 Print a backtrace on fatal signals diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp index 5e2bd92..ce65ec9 100644 --- a/loolwsd/Util.cpp +++ b/loolwsd/Util.cpp @@ -7,8 +7,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include <execinfo.h> #include <sys/poll.h> #include <sys/prctl.h> +#include <sys/uio.h> #include <cassert> #include <cstdlib> @@ -433,6 +435,29 @@ namespace Util action.sa_handler = SIG_DFL; sigaction(signal, &action, NULL); + + const int maxSlots = 50; + void *backtraceBuffer[maxSlots]; + int numSlots = backtrace(backtraceBuffer, maxSlots); + if (numSlots > 0) + { + char **symbols = backtrace_symbols(backtraceBuffer, numSlots); + if (symbols != NULL) + { + struct iovec ioVector[maxSlots*2+1]; + ioVector[0].iov_base = (void*)"Backtrace:\n"; + ioVector[0].iov_len = std::strlen((const char*)ioVector[0].iov_base); + for (int i = 0; i < numSlots; i++) + { + ioVector[1+i*2+0].iov_base = symbols[i]; + ioVector[1+i*2+0].iov_len = std::strlen((const char *)ioVector[1+i*2+0].iov_base); + ioVector[1+i*2+1].iov_base = (void*)"\n"; + ioVector[1+i*2+1].iov_len = 1; + } + writev(STDERR_FILENO, ioVector, numSlots*2+1); + } + } + // let default handler process the signal kill(Poco::Process::id(), signal); } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
