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;
	}
}
Beispiel #2
0
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");
}