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