Fast callstack frame decoder.

Returns only function name, doesn't retrieve inlined functions, doesn't
perform demangling.
This commit is contained in:
Bartosz Taudul 2019-03-05 02:34:35 +01:00
parent b11f932078
commit cb62b63fe2
2 changed files with 62 additions and 0 deletions

View File

@ -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 };

View File

@ -41,6 +41,7 @@ struct CallstackEntryData
uint8_t size;
};
const char* DecodeCallstackPtrFast( uint64_t ptr );
CallstackEntryData DecodeCallstackPtr( uint64_t ptr );
void InitCallstack();