Retrieve module name if symbol name cannot be found.

This commit is contained in:
Bartosz Taudul 2020-02-22 21:06:32 +01:00
parent d0930e9053
commit 096e8cd8ae

View File

@ -9,6 +9,7 @@
# define NOMINMAX # define NOMINMAX
# endif # endif
# include <windows.h> # include <windows.h>
# include <psapi.h>
# ifdef _MSC_VER # ifdef _MSC_VER
# pragma warning( push ) # pragma warning( push )
# pragma warning( disable : 4091 ) # pragma warning( disable : 4091 )
@ -96,6 +97,49 @@ const char* DecodeCallstackPtrFast( uint64_t ptr )
return ret; return ret;
} }
static void GetModuleName( uint64_t addr, char* buf, ULONG& len )
{
#ifndef __CYGWIN__
HMODULE mod[1024];
DWORD needed;
HANDLE proc = GetCurrentProcess();
if( EnumProcessModules( proc, mod, sizeof( mod ), &needed ) != 0 )
{
const auto sz = needed / sizeof( HMODULE );
for( size_t i=0; i<sz; i++ )
{
MODULEINFO info;
if( GetModuleInformation( proc, mod[i], &info, sizeof( info ) ) != 0 )
{
const auto base = uint64_t( info.lpBaseOfDll );
if( addr >= base && addr < base + info.SizeOfImage )
{
char name[1024];
const auto res = GetModuleFileNameA( mod[i], name, 1021 );
if( res > 0 )
{
auto ptr = name + res;
while( ptr > name && *ptr != '\\' && *ptr != '/' ) ptr--;
if( ptr > name ) ptr++;
const auto namelen = name + res - ptr;
buf[0] = '[';
memcpy( buf+1, ptr, namelen );
buf[namelen+1] = ']';
buf[namelen+2] = '\0';
len = namelen+2;
return;
}
}
}
}
}
#endif
memcpy( buf, "[unknown]", 10 );
len = 9;
}
CallstackEntryData DecodeCallstackPtr( uint64_t ptr ) CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
{ {
int write; int write;
@ -126,8 +170,7 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
if( SymFromAddr( proc, ptr, nullptr, si ) == 0 ) if( SymFromAddr( proc, ptr, nullptr, si ) == 0 )
{ {
memcpy( si->Name, "[unknown]", 10 ); GetModuleName( ptr, si->Name, si->NameLen );
si->NameLen = 9;
} }
IMAGEHLP_LINE64 line; IMAGEHLP_LINE64 line;
@ -170,8 +213,7 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
if( SymFromInlineContext( proc, ptr, ctx, nullptr, si ) == 0 ) if( SymFromInlineContext( proc, ptr, ctx, nullptr, si ) == 0 )
{ {
memcpy( si->Name, "[unknown]", 10 ); GetModuleName( ptr, si->Name, si->NameLen );
si->NameLen = 9;
} }
auto name = (char*)tracy_malloc( si->NameLen + 1 ); auto name = (char*)tracy_malloc( si->NameLen + 1 );