From bd728d11495175f90d83db8cdc58c2ac72046de2 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 18 Feb 2022 12:28:57 -0800 Subject: [PATCH] Logging: cache the last library file name in a backtrace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit They usually come in groups, so this avoids extra work. Change-Id: Ic15405335d804bdea761fffd16d4fb5c41e122f0 Reviewed-by: Kai Koehne Reviewed-by: Tor Arne Vestbø --- src/corelib/global/qlogging.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index a94dd1eeaac..55f2e63519b 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -1335,6 +1335,8 @@ static QStringList backtraceFramesForLogMessage(int frameCount) # if QT_CONFIG(dladdr) // use dladdr() instead of backtrace_symbols() + QString cachedLibrary; + const char *cachedFname = nullptr; auto decodeFrame = [&](const void *addr) -> DecodedFrame { Dl_info info; if (!dladdr(addr, &info)) @@ -1351,9 +1353,12 @@ static QStringList backtraceFramesForLogMessage(int frameCount) if (shouldSkipFrame(lib, fn)) return {}; - QString library = QString::fromUtf8(lib.data(), lib.size()); QString function = demangled(fn); - return { library, function }; + if (lib.data() != cachedFname) { + cachedFname = lib.data(); + cachedLibrary = QString::fromUtf8(cachedFname, lib.size()); + } + return { cachedLibrary, function }; }; # else // The results of backtrace_symbols looks like this: