dbghelp.dll
windows的系统目录system32下,都有dbghelp.dll,但在实际使用时,往往会让exe加载自己目录下的dll,以避免系统目录下的dll版本不一导致的程序异常。
故一般都是用LoadLibrary()的方式加载Dll,先加载当前目录,不存在时加载系统目录。
HMODULE hDll = ::LoadLibrary(szDllPath);
MiniDumpWriteDump
该函数为DbgHelp.dll 导出函数,使用它生成dump文件。
BOOL WINAPI MiniDumpWriteDump(__in HANDLE hProcess,__in DWORD ProcessId,__in HANDLE hFile,__in MINIDUMP_TYPE DumpType,__in PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,__in PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,__in PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
通过 GetProcAddress() 获取 MiniDumpWriteDump() 函数指针,如下:
typedef BOOL (WINAPI* MINIDUMPWRITEDUMP)(HANDLE hProcess,DWORD ProcessId,HANDLE hFile,MINIDUMP_TYPE DumpType,PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,PMINIDUMP_CALLBACK_INFORMATION CallbackParam );MINIDUMPWRITEDUMP pFuncWriteDump = NULL; pFuncWriteDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump");
创建dump文件File:
HANDLE hDump = CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
生成dump文件:
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;loExceptionInfo.ExceptionPointers = ExceptionInfo;loExceptionInfo.ThreadId = GetCurrentThreadId();loExceptionInfo.ClientPointers = TRUE;BOOL bRes = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);CloseHandle(lhDumpFile);
ExceptionInfo 是程序的异常信息,UnhandledExceptionFilter() 函数的唯一参数类型,所以可以在 UnhandledExceptionFilter() 函数内生成Dump文件。
记得最后CloseHandle 文件句柄。