diff --git a/src/CxbxKrnl/Emu.cpp b/src/CxbxKrnl/Emu.cpp index 33de5a4ff..bbe44612a 100644 --- a/src/CxbxKrnl/Emu.cpp +++ b/src/CxbxKrnl/Emu.cpp @@ -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)