Extended EmuPrintStackTrace with symbols from HLE cache
This commit is contained in:
parent
bffbad4850
commit
952ea91798
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue