DMP文件相关

SetUnhandledExceptionFilter,根据函数的名字能看出是设置异常处理函数,其实如果程序没设置异常处理函数,程序会调用默认的处理函数处理异常,然后程序终止,一般情况下就弹出个对话框。

如何设置自己的异常处理函数?

LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER
lpTopLevelExceptionFilter
);

参数是一个函数指针

函数类型

ExceptionInfo 是对异常描述的一个结构体

typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

异常捕获函数有三种返回值

EXCEPTION_EXECUTE_HANDLER:表明异常处理完毕,程序可以退出

EXCEPTION_CONTINUE_EXECUTION:忽略此异常,从异常点继续运行。如果此时再发生异常,还会调用异常处理函数

EXCEPTION_CONTINUE_SEARCH:异常没被识别,交由上一级处理函数处理;

SetUnhandledExceptionFilter返回值,如果为0,表明此时没有附加额外的处理函数(除默认的处理函数),如果非空,则存放到当前顶层的处理函数地址。

需要注意的是,SetUnhandledExceptionFilter设置的异常处理函数为全局的处理函数,是异常发生后,最后一次处理异常的机会。如果程序被调试器附加。调试器将优先于SetUnhandledExceptionFilter设置的异常处理函数处理异常。C++自定义的try{}Catch{}比较。这是C++自定义的异常处理过程,利用SEH来处理发生的异常,如果异常发生,又出现在try{}Catch{}中 将得到优先处理。

#include <stdio.h>
#include <windows.h>
#include <dbghelp.h>

#pragma comment(lib, "dbghelp.lib")

static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionInfo)
{
    if (pExceptionInfo)
    {
        //创建异常信息结构体
        MINIDUMP_EXCEPTION_INFORMATION ExInfo;
        ExInfo.ThreadId = GetCurrentThreadId();
        ExInfo.ExceptionPointers = pExceptionInfo;
        ExInfo.ClientPointers = FALSE;

        // 调用, 生成Dump. 98不支持
        MiniDumpWriteDump(
            GetCurrentProcess(),
            GetCurrentProcessId(),
            hFile,
            MiniDumpNormal,
            &ExInfo,
            NULL,
            NULL);
    }
}

LONG WINAPI My_UnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
    HANDLE hFile = CreateFile( TEXT("FileName.dmp"), GENERIC_READ | GENERIC_WRITE,
        0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

    DumpMiniDump(hFile, pExceptionInfo);
    return EXCEPTION_CONTINUE_SEARCH;
}

int main()
{
    SetUnhandledExceptionFilter(My_UnhandledExceptionFilter);
    system("pause");
    return 0;
}



你可能感兴趣的:(exception,filter,null,search,winapi,Pointers)