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 文件句柄。