diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index b8c7b189..38bec42b 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -230,6 +230,7 @@ Worker::Worker( const char* addr, int port ) , m_pendingSourceLocation( 0 ) , m_pendingCallstackFrames( 0 ) , m_pendingCallstackSubframes( 0 ) + , m_pendingCodeInformation( 0 ) , m_callstackFrameStaging( nullptr ) , m_traceVersion( CurrentVersion ) , m_loadTime( 0 ) @@ -2860,7 +2861,7 @@ void Worker::Exec() if( m_pendingStrings != 0 || m_pendingThreads != 0 || m_pendingSourceLocation != 0 || m_pendingCallstackFrames != 0 || !m_pendingCustomStrings.empty() || m_data.plots.IsPending() || m_pendingCallstackPtr != 0 || m_pendingExternalNames != 0 || m_pendingCallstackSubframes != 0 || !m_pendingFrameImageData.empty() || - !m_pendingSymbols.empty() || !m_pendingSymbolCode.empty() ) + !m_pendingSymbols.empty() || !m_pendingSymbolCode.empty() || m_pendingCodeInformation != 0 ) { continue; } @@ -3588,6 +3589,7 @@ void Worker::AddSymbolCode( uint64_t ptr, const char* data, size_t sz ) size_t cnt = cs_disasm( handle, (const uint8_t*)code, sz, ptr, 0, &insn ); if( cnt > 0 ) { + m_pendingCodeInformation += cnt; for( size_t i=0; i 0 ); + m_pendingCodeInformation--; + + auto fit = m_pendingCustomStrings.find( ev.file ); + assert( fit != m_pendingCustomStrings.end() ); + + if( ev.line != 0 ) + { + assert( m_data.codeAddressToLocation.find( ev.ptr ) == m_data.codeAddressToLocation.end() ); + m_data.codeAddressToLocation.emplace( ev.ptr, PackFileLine( fit->second.idx, ev.line ) ); + } + + m_pendingCustomStrings.erase( fit ); +} + void Worker::ProcessCrashReport( const QueueCrashReport& ev ) { CheckString( ev.text ); diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 800cf2f4..4ad9d18e 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -296,6 +296,8 @@ private: unordered_flat_map symbolCode; uint64_t symbolCodeSize = 0; + + unordered_flat_map codeAddressToLocation; }; struct MbpsBlock @@ -589,6 +591,7 @@ private: tracy_force_inline void ProcessCallstackFrameSize( const QueueCallstackFrameSize& ev ); tracy_force_inline void ProcessCallstackFrame( const QueueCallstackFrame& ev ); tracy_force_inline void ProcessSymbolInformation( const QueueSymbolInformation& ev ); + tracy_force_inline void ProcessCodeInformation( const QueueCodeInformation& ev ); tracy_force_inline void ProcessCrashReport( const QueueCrashReport& ev ); tracy_force_inline void ProcessSysTime( const QueueSysTime& ev ); tracy_force_inline void ProcessContextSwitch( const QueueContextSwitch& ev ); @@ -788,6 +791,7 @@ private: uint32_t m_pendingSourceLocation; uint32_t m_pendingCallstackFrames; uint8_t m_pendingCallstackSubframes; + uint32_t m_pendingCodeInformation; CallstackFrameData* m_callstackFrameStaging; uint64_t m_callstackFrameStagingPtr;