Extended EmuPrintStackTrace with symbols from HLE cache

This commit is contained in:
PatrickvL 2017-05-02 12:11:47 +02:00
parent bffbad4850
commit 952ea91798
1 changed files with 26 additions and 19 deletions

View File

@ -290,8 +290,7 @@ void EmuPrintStackTrace(PCONTEXT ContextRecord)
IMAGEHLP_MODULE64 module = { sizeof(IMAGEHLP_MODULE) };
BOOL fSymInitialized;
fSymInitialized = SymInitialize(g_CurrentProcessHandle, NULL, TRUE);
BOOL fSymInitialized = SymInitialize(g_CurrentProcessHandle, NULL, TRUE);
STACKFRAME64 frame = { sizeof(STACKFRAME64) };
frame.AddrPC.Offset = ContextRecord->Eip;
@ -315,34 +314,42 @@ void EmuPrintStackTrace(PCONTEXT ContextRecord)
NULL))
break;
DWORD64 dwDisplacement = 0;
PSYMBOL_INFO pSymbol = 0;
BYTE symbol[sizeof(SYMBOL_INFO) + SYMBOL_MAXLEN];
SymGetModuleInfo64(g_CurrentProcessHandle, frame.AddrPC.Offset, &module);
if(fSymInitialized)
{
pSymbol = (PSYMBOL_INFO)symbol;
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO) + SYMBOL_MAXLEN - 1;
pSymbol->MaxNameLen = SYMBOL_MAXLEN;
if(!SymFromAddr(g_CurrentProcessHandle, frame.AddrPC.Offset, &dwDisplacement, pSymbol))
pSymbol = 0;
}
if(module.ModuleName)
printf(" %2d: %-8s 0x%.08X", i, module.ModuleName, frame.AddrPC.Offset);
else
printf(" %2d: %8c 0x%.08X", i, ' ', frame.AddrPC.Offset);
if(pSymbol)
BYTE symbol[sizeof(SYMBOL_INFO) + SYMBOL_MAXLEN] = { 0 };
std::string symbolName = "";
DWORD64 dwDisplacement = 0;
if(fSymInitialized)
{
printf(" %s+0x%.04X\n", pSymbol->Name, dwDisplacement);
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)&symbol;
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO) + SYMBOL_MAXLEN - 1;
pSymbol->MaxNameLen = SYMBOL_MAXLEN;
if (SymFromAddr(g_CurrentProcessHandle, frame.AddrPC.Offset, &dwDisplacement, pSymbol))
symbolName = pSymbol->Name;
else
{
// Try getting a symbol name from the HLE cache :
int symbolOffset = 0;
symbolName = GetDetectedSymbolName(frame.AddrPC.Offset, &symbolOffset);
if (symbolOffset < 1000)
dwDisplacement = (DWORD64)symbolOffset;
else
symbolName = "";
}
}
if(symbolName.length() > 0)
printf(" %s+0x%.04X\n", symbolName.c_str(), dwDisplacement);
else
printf("\n");
}
printf("\n");
if(fSymInitialized)