stackDump::stackDump(){ if( hDbgHelpDll == 0 ) { // If you do not get symbols in the stack trace, it could be because the version of dbghelp.dll // in your path is too old. You can download a new one from // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/dbghelp_versions.asp // And set an explicit path for the dll to load // extern const char* hkStackTracerDbghelpPath; // hkStackTracerDbghelpPath = "C:\\Program Files\\Debugging Tools for Windows\\dbghelp.dll"; hDbgHelpDll = LoadLibrary(hkStackTracerDbghelpPath); FATAL_ERROR(!hDbgHelpDll, mT("Unable to load dbghelp.dll")); s_DllReferences = 1; LOAD_FUNCTION(SymInitialize); LOAD_FUNCTION(SymGetOptions); LOAD_FUNCTION(SymSetOptions); LOAD_FUNCTION(SymGetSymFromAddr); LOAD_FUNCTION(StackWalk64); LOAD_FUNCTION(SymFunctionTableAccess64); LOAD_FUNCTION(SymGetModuleBase64); LOAD_FUNCTION(SymGetLineFromAddr64); DWORD symOptions = pSymGetOptions(); symOptions |= SYMOPT_LOAD_LINES | SYMOPT_DEBUG; pSymSetOptions( symOptions ); BOOL initsymbols = pSymInitialize( GetCurrentProcess(), 0, TRUE); FATAL_ERROR(!initsymbols,mT("")); } else { s_DllReferences += 1; } }
QString lookUpAddresses(const QList<DWORD64>& stackFrames){ QStringList result(initDebugHelp()); static HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); if (!dbghelp) return "failed to load dbghelp.dll"; LOAD_FUNCTIONREQ(SymGetSymFromAddr64, "SymGetSymFromAddr64"); LOAD_FUNCTION(SymGetLineFromAddr64, "SymGetLineFromAddr64"); HANDLE process = GetCurrentProcess(); _IMAGEHLP_SYMBOL64* symbol = (_IMAGEHLP_SYMBOL64*)malloc(sizeof(_IMAGEHLP_SYMBOL64) + 256); for (int i=0;i<stackFrames.size();i++) { DWORD64 displacement = 0; DWORD displacement32 = 0; ZeroMemory(symbol, sizeof(_IMAGEHLP_SYMBOL64)); symbol->SizeOfStruct = sizeof(_IMAGEHLP_SYMBOL64); symbol->MaxNameLength = 256; _IMAGEHLP_LINE64 line; QString cur = QString::number(stackFrames[i], 16)+": "; if ((*SymGetSymFromAddr64)(process, stackFrames[i], &displacement, symbol)) cur += QString::fromLocal8Bit(symbol->Name)+"+"+QString::number(displacement); else cur += "??? error: " + QString::number(GetLastError()); if (SymGetLineFromAddr64) { if ((*SymGetLineFromAddr64)(process, stackFrames[i], &displacement32, &line)) cur += " in " + QString::fromLocal8Bit(line.FileName)+":"+QString::number(line.LineNumber); } result << cur; } return result.join("\r\n"); }