size_t GetSymbolNameFromAddress(void* address, char* symbolName, size_t size, size_t* offsetBytes) { if (size) *symbolName = 0; if (offsetBytes) *offsetBytes = 0; __try { ULONG_ADDR dwOffset = 0; union { IMAGEHLP_SYMBOL sym; char symNameBuffer[sizeof(IMAGEHLP_SYMBOL) + MAX_SYM_NAME]; } u; u.sym.SizeOfStruct = sizeof(u.sym); u.sym.MaxNameLength = sizeof(u.symNameBuffer) - sizeof(u.sym); if (!SymGetSymFromAddr(GetSymHandle(), CheckAddress(address), &dwOffset, &u.sym)) { return 0; } else { const char* sourceName = u.sym.Name; char undName[1024]; if (UnDecorateSymbolName(u.sym.Name, undName, sizeof(undName), UNDNAME_NO_MS_KEYWORDS | UNDNAME_NO_ACCESS_SPECIFIERS)) { sourceName = undName; } else if (SymUnDName(&u.sym, undName, sizeof(undName))) { sourceName = undName; } if (offsetBytes) { *offsetBytes = dwOffset; } if (size) { strncpy(symbolName, sourceName, size)[size - 1] = 0; } return strlen(sourceName); } } __except (EXCEPTION_EXECUTE_HANDLER) { SetLastError(GetExceptionCode()); } return 0; }
LONG WINAPI MyExceptionFilter ( EXCEPTION_POINTERS * lpep) { BOOL rVal; STACKFRAME StackFrame; CONTEXT Context; IMAGEHLP_SYMBOL *pImagehlpSymbol; ULONG Displacement; BOOL fReturn; CHAR szUndecoratedName[MAXSYMBOLNAMELENGTH]; FILE * flog; SymSetOptions(0); SymInitialize(SYM_HANDLE, NULL, TRUE); flog = fopen("c:\\Except.log","a"); if (!flog) return EXCEPTION_CONTINUE_SEARCH; printf("\ndumping stack trace\n"); ZeroMemory(&StackFrame, sizeof(StackFrame)); Context = *lpep->ContextRecord; #if defined(_M_IX86) StackFrame.AddrPC.Offset = Context.Eip; StackFrame.AddrPC.Mode = AddrModeFlat; StackFrame.AddrFrame.Offset = Context.Ebp; StackFrame.AddrFrame.Mode = AddrModeFlat; StackFrame.AddrStack.Offset = Context.Esp; StackFrame.AddrStack.Mode = AddrModeFlat; #endif pImagehlpSymbol = (IMAGEHLP_SYMBOL *) xmalloc(sizeof(IMAGEHLP_SYMBOL) + MAXSYMBOLNAMELENGTH - 1); ZeroMemory(pImagehlpSymbol, sizeof(IMAGEHLP_SYMBOL) + MAXSYMBOLNAMELENGTH - 1); pImagehlpSymbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL); pImagehlpSymbol->MaxNameLength = MAXSYMBOLNAMELENGTH; do { rVal = StackWalk ( MACHINE_TYPE, SYM_HANDLE, 0, &StackFrame, &Context, ReadProcessMemory, SymFunctionTableAccess, SymGetModuleBase, NULL); if (rVal) { pImagehlpSymbol->Address = StackFrame.AddrPC.Offset; fReturn = SymGetSymFromAddr ( SYM_HANDLE, StackFrame.AddrPC.Offset, &Displacement, pImagehlpSymbol ); fprintf(flog,"%08x %08x ", StackFrame.AddrFrame.Offset, StackFrame.AddrReturn.Offset); printf("%08x %08x ", StackFrame.AddrFrame.Offset, StackFrame.AddrReturn.Offset); if (fReturn) { fReturn = SymUnDName ( pImagehlpSymbol, szUndecoratedName, MAXSYMBOLNAMELENGTH); if (fReturn) { fprintf(flog,"%s", szUndecoratedName); printf("%s", szUndecoratedName); if (Displacement){ fprintf(flog,"+%x", Displacement); printf("+%x", Displacement); } } } else{ fprintf(flog,"0x%08x", StackFrame.AddrPC.Offset); printf("0x%08x", StackFrame.AddrPC.Offset); } fprintf(flog,"\n"); printf("\n"); } } while (rVal); SymCleanup(SYM_HANDLE); fprintf(flog,"----Hit ^c to exit----\n"); fclose(flog); ExitProcess((DWORD)-1); return EXCEPTION_CONTINUE_SEARCH;//EXCEPTION_EXECUTE_HANDLER; }
static BOOL ResolveSymbol(HANDLE hProcess, DWORD dwAddress, SYMBOL_INFO &siSymbol) { BOOL fRetval = TRUE; siSymbol.dwAddress = dwAddress; union { CHAR rgchSymbol[sizeof(IMAGEHLP_SYMBOL) + 255]; IMAGEHLP_SYMBOL sym; }; CHAR szUndec[256]; CHAR szWithOffset[256]; LPSTR pszSymbol = NULL; IMAGEHLP_MODULE mi; memset(&siSymbol, 0, sizeof(SYMBOL_INFO)); mi.SizeOfStruct = sizeof(IMAGEHLP_MODULE); if (!SymGetModuleInfo(hProcess, dwAddress, &mi)) lstrcpyA(siSymbol.szModule, "<no module>"); else { LPSTR pszModule = strchr(mi.ImageName, '\\'); if (pszModule == NULL) pszModule = mi.ImageName; else pszModule++; lstrcpynA(siSymbol.szModule, pszModule, _countof(siSymbol.szModule)); lstrcatA(siSymbol.szModule, "! "); } __try { sym.SizeOfStruct = sizeof(IMAGEHLP_SYMBOL); sym.Address = dwAddress; sym.MaxNameLength = 255; if (SymGetSymFromAddr(hProcess, dwAddress, &(siSymbol.dwOffset), &sym)) { pszSymbol = sym.Name; if (UnDecorateSymbolName(sym.Name, szUndec, _countof(szUndec), UNDNAME_NO_MS_KEYWORDS | UNDNAME_NO_ACCESS_SPECIFIERS)) { pszSymbol = szUndec; } else if (SymUnDName(&sym, szUndec, _countof(szUndec))) { pszSymbol = szUndec; } if (siSymbol.dwOffset != 0) { wsprintfA(szWithOffset, "%s + %d bytes", pszSymbol, siSymbol.dwOffset); pszSymbol = szWithOffset; } } else pszSymbol = "<no symbol>"; } __except (EXCEPTION_EXECUTE_HANDLER) { pszSymbol = "<EX: no symbol>"; siSymbol.dwOffset = dwAddress - mi.BaseOfImage; } lstrcpynA(siSymbol.szSymbol, pszSymbol, _countof(siSymbol.szSymbol)); return fRetval; }