[Libreoffice-commits] online.git: common/SigUtil.cpp common/SigUtil.hpp kit/ChildSession.cpp wsd/DocumentBroker.cpp wsd/README

Henry Castro (via logerrit) logerrit at kemper.freedesktop.org
Fri Dec 20 18:58:07 UTC 2019


 common/SigUtil.cpp     |   15 +++++++++++++++
 common/SigUtil.hpp     |    3 +++
 kit/ChildSession.cpp   |   10 ++++++++++
 wsd/DocumentBroker.cpp |    9 ++++++++-
 wsd/README             |    4 ++++
 5 files changed, 40 insertions(+), 1 deletion(-)

New commits:
commit 92909810136db2494e2700c6c5ff172339f759fd
Author:     Henry Castro <hcastro at collabora.com>
AuthorDate: Wed Dec 18 16:28:14 2019 -0400
Commit:     Henry Castro <hcastro at collabora.com>
CommitDate: Fri Dec 20 19:57:47 2019 +0100

    wsd: debug: add env variable "PAUSEFORDEBUGGER" to attach debugger
    
    It is painful to check and search manually the PID to attach the LOKit
    process when exists several pre-spawned waiting to load a document.
    
    This patch helps to attach the debugger when the LOKit process is about
    to load a document then send the "signal SIGUSR1" to resume it.
    
    Change-Id: I3b15bd522c6ef3ef57dc3453b457dcf91f2661b9
    Reviewed-on: https://gerrit.libreoffice.org/85430
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Henry Castro <hcastro at collabora.com>
    Reviewed-by: Henry Castro <hcastro at collabora.com>

diff --git a/common/SigUtil.cpp b/common/SigUtil.cpp
index f511aca60..8fe38b721 100644
--- a/common/SigUtil.cpp
+++ b/common/SigUtil.cpp
@@ -331,6 +331,10 @@ namespace SigUtil
         }
     }
 
+    static
+    void handleDebuggerSignal(const int /*signal*/)
+    {}
+
     void setUserSignals()
     {
         struct sigaction action;
@@ -342,6 +346,17 @@ namespace SigUtil
         sigaction(SIGUSR1, &action, nullptr);
     }
 
+    void setDebuggerSignal()
+    {
+        struct sigaction action;
+
+        sigemptyset(&action.sa_mask);
+        action.sa_flags = 0;
+        action.sa_handler = handleDebuggerSignal;
+
+        sigaction(SIGUSR1, &action, nullptr);
+    }
+
     /// Kill the given pid with SIGTERM.  Returns true when the pid does not exist any more.
     bool killChild(const int pid)
     {
diff --git a/common/SigUtil.hpp b/common/SigUtil.hpp
index 95371f3a1..a0da03142 100644
--- a/common/SigUtil.hpp
+++ b/common/SigUtil.hpp
@@ -59,6 +59,9 @@ namespace SigUtil
     /// Trap generally useful signals
     void setUserSignals();
 
+    /// Trap to unpause the process
+    void setDebuggerSignal();
+
     /// Requests the server to initiate graceful shutdown.
     /// Shutting down is a multi-stage process, because
     /// it can be requested via signals.
diff --git a/kit/ChildSession.cpp b/kit/ChildSession.cpp
index 45ee614e4..cf65a51b9 100644
--- a/kit/ChildSession.cpp
+++ b/kit/ChildSession.cpp
@@ -24,6 +24,7 @@
 #include <Poco/URI.h>
 #include <Poco/BinaryReader.h>
 #include <Poco/Base64Decoder.h>
+#include <Poco/Process.h>
 #if !MOBILEAPP
 #include <Poco/Net/HTTPResponse.h>
 #include <Poco/Net/HTTPSClientSession.h>
@@ -606,6 +607,15 @@ bool ChildSession::loadDocument(const char * /*buffer*/, int /*length*/, const s
 
     std::unique_lock<std::recursive_mutex> lock(Mutex);
 
+#ifdef ENABLE_DEBUG
+    if (std::getenv("PAUSEFORDEBUGGER"))
+    {
+        std::cerr << getDocURL() << " paused waiting for a debugger to attach: " << Poco::Process::id() << std::endl;
+        SigUtil::setDebuggerSignal();
+        pause();
+    }
+#endif
+
     const bool loaded = _docManager->onLoad(getId(), getJailedFilePathAnonym(), renderOpts, doctemplate);
     if (!loaded || _viewId < 0)
     {
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index fecea32bc..7e163e769 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -283,7 +283,14 @@ void DocumentBroker::pollThread()
     auto lastBWUpdateTime = std::chrono::steady_clock::now();
     auto lastClipboardHashUpdateTime = std::chrono::steady_clock::now();
 
-    const int limit_load_secs = LOOLWSD::getConfigValue<int>("per_document.limit_load_secs", 100);
+    const int limit_load_secs =
+#ifdef ENABLE_DEBUG
+        // paused waiting for a debugger to attach
+        // ignore load time out
+        std::getenv("PAUSEFORDEBUGGER") ? -1 :
+#endif
+        LOOLWSD::getConfigValue<int>("per_document.limit_load_secs", 100);
+
     const auto loadDeadline = std::chrono::steady_clock::now() + std::chrono::seconds(limit_load_secs);
 #endif
     auto last30SecCheckTime = std::chrono::steady_clock::now();
diff --git a/wsd/README b/wsd/README
index 25d17db43..e56b970c6 100644
--- a/wsd/README
+++ b/wsd/README
@@ -240,6 +240,8 @@ limit the amount of concurrently running processes.
 When the crash happens too early, you also want to
 
     export SLEEPFORDEBUGGER=<number of seconds>
+or
+    export PAUSEFORDEBUGGER=1
 
 so that you have time to attach to the process.
 
@@ -261,6 +263,8 @@ Use the ps command to find out exactly the path to use.
 
 Set LOOL_DEBUG=1 to trap SIGSEGV and SEGBUS and prompt for debugger.
 
+if you choose PAUSEFORDEBUGGER send the signal SIGUSR1 to resume the process
+
 In order to run and debug one unit test, set CPPUNIT_TEST_NAME to something
 non-empty:
 


More information about the Libreoffice-commits mailing list