[Libreoffice-commits] core.git: include/sal sal/inc sal/osl sal/util

Stephan Bergmann sbergman at redhat.com
Thu Feb 9 15:57:11 UTC 2017


 include/sal/log.hxx           |   50 ++++++++++++++++++------------------------
 sal/inc/backtraceasstring.hxx |    3 +-
 sal/osl/all/log.cxx           |   29 +++++-------------------
 sal/osl/unx/backtraceapi.cxx  |   17 ++++++++------
 sal/osl/w32/backtrace.cxx     |   23 +++++++++++++++----
 sal/util/sal.map              |    1 
 6 files changed, 59 insertions(+), 64 deletions(-)

New commits:
commit b6a69585b00867005820c1dd94e10e0e6b545e2a
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu Feb 9 13:19:11 2017 +0100

    Fold sal_detail_log_backtrace into sal_detail_log
    
    ...the latter is LO-privately exported from sal, so it should be OK to add one
    more parameter to it.
    
    Change-Id: If6bf3458433aac2cc8b4e0cbd1602306051a777b
    Reviewed-on: https://gerrit.libreoffice.org/34080
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/include/sal/log.hxx b/include/sal/log.hxx
index b383fd0..a21f80b 100644
--- a/include/sal/log.hxx
+++ b/include/sal/log.hxx
@@ -28,20 +28,16 @@
 
 extern "C" SAL_DLLPUBLIC void SAL_CALL sal_detail_log(
     enum sal_detail_LogLevel level, char const * area, char const * where,
-    char const * message);
-
-extern "C" SAL_DLLPUBLIC void SAL_CALL sal_detail_log_backtrace(
-    enum sal_detail_LogLevel level, char const * area, char const * where,
-    char const * message, int maxNoStackFramesToDisplay);
+    char const * message, sal_uInt32 backtraceDepth);
 
 extern "C" SAL_DLLPUBLIC int SAL_CALL sal_detail_log_report(
     enum sal_detail_LogLevel level, char const * area);
 
 namespace sal { namespace detail {
 
-inline void SAL_CALL log(
+inline void log(
     sal_detail_LogLevel level, char const * area, char const * where,
-    std::ostringstream const & stream)
+    std::ostringstream const & stream, sal_uInt32 backtraceDepth)
 {
     // An alternative would be to have sal_detail_log take a std::ostringstream
     // pointer (via a C void pointer); the advantage would be smaller client
@@ -51,15 +47,7 @@ inline void SAL_CALL log(
     // on the C++ ABI; as a compromise, the ".str().c_str()" part has been moved
     // to this inline function so that it is potentially only emitted once per
     // dynamic library:
-    sal_detail_log(level, area, where, stream.str().c_str());
-}
-
-inline void SAL_CALL log_backtrace(
-    sal_detail_LogLevel level, char const * area, char const * where,
-    std::ostringstream const & stream, int maxNoStackFramesToDisplay)
-{
-    sal_detail_log_backtrace(
-        level, area, where, stream.str().c_str(), maxNoStackFramesToDisplay);
+    sal_detail_log(level, area, where, stream.str().c_str(), backtraceDepth);
 }
 
 // Special handling of the common case where the message consists of just a
@@ -134,12 +122,13 @@ inline char const * unwrapStream(SAL_UNUSED_PARAMETER StreamIgnore const &) {
                 ::sal_detail_log( \
                     (level), (area), (where), \
                     ::sal::detail::unwrapStream( \
-                        ::sal::detail::StreamStart() << stream)); \
+                        ::sal::detail::StreamStart() << stream), \
+                    0); \
             } else { \
                 ::std::ostringstream sal_detail_stream; \
                 sal_detail_stream << stream; \
                 ::sal::detail::log( \
-                    (level), (area), (where), sal_detail_stream); \
+                    (level), (area), (where), sal_detail_stream, 0); \
             } \
         } \
     } while (false)
@@ -351,28 +340,33 @@ inline char const * unwrapStream(SAL_UNUSED_PARAMETER StreamIgnore const &) {
         SAL_LOG_TRUE, ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, stream)
 
 /**
-  Produce temporary debugging output from stream along with a
-  stack trace of the calling location.  This macro is meant to
-  be used only while working on code and should never exist
-  in production code.
+  Produce temporary debugging output from stream along with a backtrace of the
+  calling location.
+
+  This macro is meant to be used only while working on code and should never
+  exist in production code.
+
+  @param backtraceDepth a sal_uInt32 value indicating the maximum backtrace
+  depth; zero means no backtrace
 
   See @ref sal_log "basic logging functionality" for details.
 */
-#define SAL_DEBUG_BACKTRACE(stream, maxNoStackFramesToDisplay) \
+#define SAL_DEBUG_BACKTRACE(stream, backtraceDepth) \
     do { \
-        if (sizeof ::sal::detail::getResult(::sal::detail::StreamStart() << stream) == 1) \
+        if (sizeof ::sal::detail::getResult( \
+                ::sal::detail::StreamStart() << stream) == 1) \
         { \
-            ::sal_detail_log_backtrace( \
+            ::sal_detail_log( \
                 ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, \
                 ::sal::detail::unwrapStream( \
                     ::sal::detail::StreamStart() << stream), \
-                maxNoStackFramesToDisplay); \
+                backtraceDepth); \
         } else { \
             ::std::ostringstream sal_detail_stream; \
             sal_detail_stream << stream; \
-            ::sal::detail::log_backtrace( \
+            ::sal::detail::log( \
                 ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, sal_detail_stream, \
-                maxNoStackFramesToDisplay); \
+                backtraceDepth); \
         } \
     } while (false)
 
diff --git a/sal/inc/backtraceasstring.hxx b/sal/inc/backtraceasstring.hxx
index d15065a..cd9ce49 100644
--- a/sal/inc/backtraceasstring.hxx
+++ b/sal/inc/backtraceasstring.hxx
@@ -13,11 +13,12 @@
 #include <sal/config.h>
 
 #include <rtl/ustring.hxx>
+#include <sal/types.h>
 
 namespace osl { namespace detail {
 
 /// Build a debugging backtrace from current PC location.
-OUString backtraceAsString(int maxNoStackFramesToDisplay);
+OUString backtraceAsString(sal_uInt32 maxDepth);
 
 } }
 
diff --git a/sal/osl/all/log.cxx b/sal/osl/all/log.cxx
index 7a6c307..774e7e8 100644
--- a/sal/osl/all/log.cxx
+++ b/sal/osl/all/log.cxx
@@ -192,7 +192,7 @@ bool isDebug(sal_detail_LogLevel level) {
 
 void log(
     sal_detail_LogLevel level, char const * area, char const * where,
-    char const * message)
+    char const * message, sal_uInt32 backtraceDepth)
 {
     std::ostringstream s;
 #if !defined ANDROID
@@ -218,6 +218,9 @@ void log(
     }
 
     s << message;
+    if (backtraceDepth != 0) {
+        s << " at:\n" << osl::detail::backtraceAsString(backtraceDepth);
+    }
     s << '\n';
 
 #if defined ANDROID
@@ -273,32 +276,14 @@ void log(
 #endif
 }
 
-void log_backtrace(
-    sal_detail_LogLevel level, char const * area, char const * where,
-    char const * message, int maxNoStackFramesToDisplay)
-{
-    OUString buff = OUString::createFromAscii(message) + " at:\n"
-        + osl::detail::backtraceAsString(maxNoStackFramesToDisplay);
-    log(level, area, where, buff.toUtf8().getStr());
-}
-
 }
 
 void sal_detail_log(
     sal_detail_LogLevel level, char const * area, char const * where,
-    char const * message)
-{
-    if (sal_detail_log_report(level, area)) {
-        log(level, area, where, message);
-    }
-}
-
-void sal_detail_log_backtrace(
-    sal_detail_LogLevel level, char const * area, char const * where,
-    char const * message, int maxNoStackFramesToDisplay)
+    char const * message, sal_uInt32 backtraceDepth)
 {
     if (sal_detail_log_report(level, area)) {
-        log_backtrace(level, area, where, message, maxNoStackFramesToDisplay);
+        log(level, area, where, message, backtraceDepth);
     }
 }
 
@@ -317,7 +302,7 @@ void sal_detail_logFormat(
         } else if (n >= len) {
             std::strcpy(buf + len - 1, "...");
         }
-        log(level, area, where, buf);
+        log(level, area, where, buf, 0);
         va_end(args);
     }
 }
diff --git a/sal/osl/unx/backtraceapi.cxx b/sal/osl/unx/backtraceapi.cxx
index 267a331..91be8d5 100644
--- a/sal/osl/unx/backtraceapi.cxx
+++ b/sal/osl/unx/backtraceapi.cxx
@@ -11,11 +11,13 @@
 
 #include <cassert>
 #include <cstdlib>
+#include <limits>
 #include <memory>
 
 #include <o3tl/runtimetooustring.hxx>
 #include <rtl/ustrbuf.hxx>
 #include <rtl/ustring.hxx>
+#include <sal/types.h>
 
 #include "backtrace.h"
 #include "backtraceasstring.hxx"
@@ -32,14 +34,15 @@ struct FreeGuard {
 
 }
 
-OUString osl::detail::backtraceAsString(int maxNoStackFramesToDisplay)
-{
-    assert(maxNoStackFramesToDisplay >= 0);
-    if (maxNoStackFramesToDisplay == 0) {
-        return OUString();
+OUString osl::detail::backtraceAsString(sal_uInt32 maxDepth) {
+    assert(maxDepth != 0);
+    auto const maxInt = static_cast<unsigned int>(
+        std::numeric_limits<int>::max());
+    if (maxDepth > maxInt) {
+        maxDepth = static_cast<sal_uInt32>(maxInt);
     }
-    auto b1 = std::unique_ptr<void *[]>(new void *[maxNoStackFramesToDisplay]);
-    int n = backtrace(b1.get(), maxNoStackFramesToDisplay);
+    auto b1 = std::unique_ptr<void *[]>(new void *[maxDepth]);
+    int n = backtrace(b1.get(), static_cast<int>(maxDepth));
     FreeGuard b2(backtrace_symbols(b1.get(), n));
     b1.reset();
     if (b2.buffer == nullptr) {
diff --git a/sal/osl/w32/backtrace.cxx b/sal/osl/w32/backtrace.cxx
index 78d9e0a..b559c5e 100644
--- a/sal/osl/w32/backtrace.cxx
+++ b/sal/osl/w32/backtrace.cxx
@@ -9,7 +9,8 @@
 
 #include <sal/config.h>
 
-#include "backtraceasstring.hxx"
+#include <limits>
+#include <memory>
 
 #include <windows.h>
 #include <process.h>
@@ -18,17 +19,29 @@
 #include <DbgHelp.h>
 
 #include <rtl/ustrbuf.hxx>
-#include <memory>
 
-OUString osl::detail::backtraceAsString(int maxNoStackFramesToDisplay)
+#include "backtraceasstring.hxx"
+
+OUString osl::detail::backtraceAsString(sal_uInt32 maxDepth)
 {
+    assert(maxDepth != 0);
+    auto const maxUlong = std::numeric_limits<ULONG>::max();
+    if (maxDepth > maxUlong) {
+        maxDepth = static_cast<sal_uInt32>(maxUlong);
+    }
+
     OUStringBuffer aBuf;
 
     HANDLE hProcess = GetCurrentProcess();
     SymInitialize( hProcess, nullptr, true );
 
-    std::unique_ptr<void*[]> aStack(new void*[ maxNoStackFramesToDisplay ]);
-    sal_uInt32 nFrames = CaptureStackBackTrace( 0, maxNoStackFramesToDisplay, aStack.get(), nullptr );
+    std::unique_ptr<void*[]> aStack(new void*[ maxDepth ]);
+    // <https://msdn.microsoft.com/en-us/library/windows/desktop/
+    // bb204633(v=vs.85).aspx> "CaptureStackBackTrace function" claims that you
+    // "can capture up to MAXUSHORT frames", and on Windows Server 2003 and
+    // Windows XP it even "must be less than 63", but assume that a too large
+    // input value is clamped internally, instead of resulting in an error:
+    sal_uInt32 nFrames = CaptureStackBackTrace( 0, static_cast<ULONG>(maxDepth), aStack.get(), nullptr );
 
     SYMBOL_INFO  * pSymbol;
     pSymbol = static_cast<SYMBOL_INFO *>(calloc( sizeof( SYMBOL_INFO ) + 1024 * sizeof( char ), 1 ));
diff --git a/sal/util/sal.map b/sal/util/sal.map
index b99d524..b04487e 100644
--- a/sal/util/sal.map
+++ b/sal/util/sal.map
@@ -730,7 +730,6 @@ PRIVATE_1.2 { # LibreOffice 3.5
 
 PRIVATE_1.3 { # LibreOffice 5.4
     global:
-        sal_detail_log_backtrace;
         sal_detail_log_report;
 } PRIVATE_1.2;
 


More information about the Libreoffice-commits mailing list