Add code address to function, line decoder.

This commit is contained in:
Bartosz Taudul 2020-04-01 21:41:33 +02:00
parent 9e8089ec1a
commit a8e8a4a167
2 changed files with 54 additions and 0 deletions

View File

@ -239,6 +239,49 @@ SymbolData DecodeSymbolAddress( uint64_t ptr )
return sym;
}
SymbolData DecodeCodeAddress( uint64_t ptr )
{
SymbolData sym;
const auto proc = GetCurrentProcess();
bool done = false;
IMAGEHLP_LINE64 line;
DWORD displacement = 0;
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
#ifndef __CYGWIN__
DWORD inlineNum = SymAddrIncludeInlineTrace( proc, ptr );
DWORD ctx = 0;
DWORD idx;
BOOL doInline = FALSE;
if( inlineNum != 0 ) doInline = SymQueryInlineTrace( proc, ptr, 0, ptr, ptr, &ctx, &idx );
if( doInline )
{
if( SymGetLineFromInlineContext( proc, ptr, ctx, 0, &displacement, &line ) != 0 )
{
sym.file = line.FileName;
sym.line = line.LineNumber;
done = true;
}
}
#endif
if( !done )
{
if( SymGetLineFromAddr64( proc, ptr, &displacement, &line ) == 0 )
{
sym.file = "[unknown]";
sym.line = 0;
}
else
{
sym.file = line.FileName;
sym.line = line.LineNumber;
}
}
sym.needFree = false;
return sym;
}
CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
{
int write;
@ -429,6 +472,11 @@ SymbolData DecodeSymbolAddress( uint64_t ptr )
return sym;
}
SymbolData DecodeCodeAddress( uint64_t ptr )
{
return DecodeSymbolAddress( ptr );
}
static int CallstackDataCb( void* /*data*/, uintptr_t pc, const char* fn, int lineno, const char* function )
{
enum { DemangleBufLen = 64*1024 };
@ -611,6 +659,11 @@ SymbolData DecodeSymbolAddress( uint64_t ptr )
return SymbolData { symloc, 0, false };
}
SymbolData DecodeCodeAddress( uint64_t ptr )
{
return DecodeSymbolAddress( ptr );
}
CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
{
static CallstackEntry cb;

View File

@ -46,6 +46,7 @@ struct CallstackEntryData
};
SymbolData DecodeSymbolAddress( uint64_t ptr );
SymbolData DecodeCodeAddress( uint64_t ptr );
const char* DecodeCallstackPtrFast( uint64_t ptr );
CallstackEntryData DecodeCallstackPtr( uint64_t ptr );
void InitCallstack();