From 46bccd9a92e08b4a4a70fc7a857e755e6bd0bb3d Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Fri, 24 Apr 2026 21:04:42 +0200 Subject: [PATCH] Refresh external image cache on symbolization misses. FindExternalImageRefresh already re-parsed /proc//maps on miss, but only one of three external decode paths used it. Switch the DecodeCallstackPtrFastExternal and DecodeSymbolAddressExternal paths over so symbol-name and file/line lookups stay fresh after the target dlopens a library. Rate-limit the re-parse to once per wall-clock second so samples landing on permanently unresolvable regions (JIT, vDSO, stacks) do not trigger a full parse each time. --- public/client/TracyCallstack.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/public/client/TracyCallstack.cpp b/public/client/TracyCallstack.cpp index d258f963..742d29b6 100644 --- a/public/client/TracyCallstack.cpp +++ b/public/client/TracyCallstack.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "TracyCallstack.hpp" #include "TracyDebug.hpp" #include "TracyFastVector.hpp" @@ -351,6 +352,10 @@ struct ExternalImageEntry static FastVector* s_extImages = nullptr; static pid_t s_externalPid = 0; static bool s_extImagesSorted = true; +// Wall-clock second of the last /proc//maps re-parse. Used to rate-limit +// refreshes so addresses that never resolve (JIT, vDSO, stack) do not trigger +// a full re-parse on every symbolization. +static int64_t s_lastMapsRefresh = 0; static uint64_t ReadElfMinLoadVaddr( const char* path ) { @@ -481,8 +486,13 @@ static const ExternalImageEntry* FindExternalImageRefresh( uint64_t address ) if( s_externalPid != 0 ) { - ParseExternalProcMaps( s_externalPid ); - return FindExternalImage( address ); + const int64_t now = (int64_t)time( nullptr ); + if( now != s_lastMapsRefresh ) + { + s_lastMapsRefresh = now; + ParseExternalProcMaps( s_externalPid ); + return FindExternalImage( address ); + } } return nullptr; } @@ -1424,7 +1434,7 @@ static const char* DecodeCallstackPtrFastExternal( uint64_t ptr ) auto vptr = (void*)ptr; const char* symname = nullptr; - const auto* extImg = FindExternalImage( ptr ); + const auto* extImg = FindExternalImageRefresh( ptr ); if( extImg ) { auto* bts = GetExternalBtState( extImg ); @@ -1512,7 +1522,7 @@ static void SymbolAddressErrorCb( void* data, const char* /*msg*/, int /*errnum* static CallstackSymbolData DecodeSymbolAddressExternal( uint64_t ptr ) { CallstackSymbolData sym; - const auto* extImg = FindExternalImage( ptr ); + const auto* extImg = FindExternalImageRefresh( ptr ); if( extImg ) { auto* bts = GetExternalBtState( extImg );