diff --git a/client/TracyCallstack.cpp b/client/TracyCallstack.cpp index bfc8ee26..f618eee3 100644 --- a/client/TracyCallstack.cpp +++ b/client/TracyCallstack.cpp @@ -43,6 +43,28 @@ void InitCallstack() SymSetOptions( SYMOPT_LOAD_LINES ); } +const char* DecodeCallstackPtrFast( uint64_t ptr ) +{ + static char ret[1024]; + const auto proc = GetCurrentProcess(); + + char buf[sizeof( SYMBOL_INFO ) + 1024]; + auto si = (SYMBOL_INFO*)buf; + si->SizeOfStruct = sizeof( SYMBOL_INFO ); + si->MaxNameLen = 1024; + + if( SymFromAddr( proc, ptr, nullptr, si ) == 0 ) + { + *ret = '\0'; + } + else + { + memcpy( ret, si->Name, si->NameLen ); + ret[si->NameLen] = '\0'; + } + return ret; +} + CallstackEntryData DecodeCallstackPtr( uint64_t ptr ) { int write; @@ -157,6 +179,36 @@ void InitCallstack() { } +const char* DecodeCallstackPtrFast( uint64_t ptr ) +{ + static char ret[1024]; + auto vptr = (void*)ptr; + char** sym = nullptr; + const char* symname = nullptr; + Dl_info dlinfo; + if( dladdr( vptr, &dlinfo ) && dlinfo.dli_sname ) + { + symname = dlinfo.dli_sname; + } + else + { + sym = backtrace_symbols( &vptr, 1 ); + if( sym ) + { + symname = *sym; + } + } + if( symname ) + { + strcpy( ret, symname ); + } + else + { + *ret = '\0'; + } + return ret; +} + CallstackEntryData DecodeCallstackPtr( uint64_t ptr ) { static CallstackEntry cb; @@ -262,6 +314,15 @@ static inline char* CopyString( const char* src ) return dst; } +const char* DecodeCallstackPtrFast( uint64_t ptr ) +{ + static char ret[1024]; + + // TODO + + return ret; +} + static int CallstackDataCb( void* /*data*/, uintptr_t pc, const char* fn, int lineno, const char* function ) { enum { DemangleBufLen = 64*1024 }; diff --git a/client/TracyCallstack.hpp b/client/TracyCallstack.hpp index 8e52c827..f9ef20b5 100644 --- a/client/TracyCallstack.hpp +++ b/client/TracyCallstack.hpp @@ -41,6 +41,7 @@ struct CallstackEntryData uint8_t size; }; +const char* DecodeCallstackPtrFast( uint64_t ptr ); CallstackEntryData DecodeCallstackPtr( uint64_t ptr ); void InitCallstack();