概要
主要涉及的函数有:
1、SetUnhandledExceptionFilter(参数)——》程序出现崩溃就会调用该函数
2、重写【参数】的回调函数:格式为LONG WINAPI UnhandledExceptionFilterToCreateDump(PEXCEPTION_POINTERS pExInfo)——》程序崩溃时系统就会调用这个回调函数
3、MiniDumpWriteDump——》用该函数创建miniDump
函数详解
第一个函数
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( __in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter );
我的理解:当程序崩溃时,系统捕捉到该异常并调用该函数。
msdn解释:
使应用程序能够取代进程中每个线程的顶级异常处理程序。在调用此函数之后,如果在未调试的进程中发生异常,并且该异常到达未处理的异常筛选器,则该筛选器将调用由lpTopLevelExceptionFilter参数指定的异常筛选器函数。
第二个函数
LONG WINAPI UnhandledExceptionFilterToCreateDump(PEXCEPTION_POINTERS pExInfo)
我的理解:在这个函数里对异常做处理,如捕获到崩溃后写个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 );
msdn解释: 将用户模式的minidump信息写入指定的文件。
注意:
1)需要的头文件有:Dbghelp.h
2)需要的dll有:Dbghelp.dll
3)需要的lib有:Dbghelp.lib
例子:
void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)
{
HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
{
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = pep;
mdei.ClientPointers = FALSE;
MINIDUMP_CALLBACK_INFORMATION mci;
mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
mci.CallbackParam = 0;
MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)0x0000ffff;
// 参数4表示生成的是miniDump还是fullDump(通过指定MiniDumpWithFullMemory实现)
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci);
CloseHandle(hFile);
}
}
// MiniDumpCallback函数定义格式
BOOL CALLBACK MiniDumpCallback(PVOID, CONST PMINIDUMP_CALLBACK_INPUT CallbackInput, PMINIDUMP_CALLBACK_OUTPUT) {
if (ModuleCallback == CallbackInput->CallbackType) {
}
return TRUE;
}
总结
总的来说,思路就是:自己调用SetUnhandledExceptionFilter,并在该异常处理的回调函数里对其操作,如调用MiniDumpWriteDump写dump